Why are hexadecimal float literals so goofy?

Discussion in 'C Programming' started by Simon, May 31, 2011.

  1. Simon

    Simon Guest

    I looked over the C99 spec for hexadecimal constants. They seem quite
    odd on two accounts. For one, it is a binary exponent value, but the
    other number is hexadecimal. Why not make them both hexadecimal? You
    really don't lose anything...you just have to shift your radix point a
    bit. This just seems confusing as it is.

    The other is even stranger. The binary exponent value is actually
    represented in decimal. What is decimal doing here? Isn't it
    satisfied already being the only choice so far even though it
    introduces round off errors and results in a less elegant compiler
    implementation? Decimal is like a virus that decays elegance,
    simplicity, and happiness.

    Cheers
    Simon
    Simon, May 31, 2011
    #1
    1. Advertising

  2. Simon

    Ben Pfaff Guest

    Simon <> writes:

    > I looked over the C99 spec for hexadecimal constants. They seem quite
    > odd on two accounts. For one, it is a binary exponent value, but the
    > other number is hexadecimal. Why not make them both hexadecimal? You
    > really don't lose anything...you just have to shift your radix point a
    > bit. This just seems confusing as it is.


    I have always assumed that hexadecimal constants were written in
    hexadecimal instead of binary just to save space. That is, the
    underlying representation of floating-point numbers is assumed to
    be in base 2, and one writes those in base 16 just to avoid
    making the textual representation very long.

    > The other is even stranger. The binary exponent value is actually
    > represented in decimal. What is decimal doing here? Isn't it
    > satisfied already being the only choice so far even though it
    > introduces round off errors and results in a less elegant compiler
    > implementation? Decimal is like a virus that decays elegance,
    > simplicity, and happiness.


    Representing the exponent in decimal doesn't introduce any
    round-off errors, and it's easier for humans to read and
    understand than representing it in binary or hexadecimal.
    --
    Ben Pfaff
    http://benpfaff.org
    Ben Pfaff, May 31, 2011
    #2
    1. Advertising

  3. Simon

    Ian Collins Guest

    On 06/ 1/11 08:36 AM, Ben Pfaff wrote:
    > Simon<> writes:
    >
    >> I looked over the C99 spec for hexadecimal constants. They seem quite
    >> odd on two accounts. For one, it is a binary exponent value, but the
    >> other number is hexadecimal. Why not make them both hexadecimal? You
    >> really don't lose anything...you just have to shift your radix point a
    >> bit. This just seems confusing as it is.

    >
    > I have always assumed that hexadecimal constants were written in
    > hexadecimal instead of binary just to save space. That is, the
    > underlying representation of floating-point numbers is assumed to
    > be in base 2, and one writes those in base 16 just to avoid
    > making the textual representation very long.


    That is the logical conclusion. Although I am curious as to whether
    anyone actually uses hexadecimal float literals!

    --
    Ian Collins
    Ian Collins, May 31, 2011
    #3
  4. Simon

    James Kuyper Guest

    On 05/31/2011 04:36 PM, Ben Pfaff wrote:
    > Simon <> writes:
    >
    >> I looked over the C99 spec for hexadecimal constants. They seem quite
    >> odd on two accounts. For one, it is a binary exponent value, but the
    >> other number is hexadecimal. Why not make them both hexadecimal? You
    >> really don't lose anything...you just have to shift your radix point a
    >> bit. This just seems confusing as it is.

    >
    > I have always assumed that hexadecimal constants were written in
    > hexadecimal instead of binary just to save space. That is, the
    > underlying representation of floating-point numbers is assumed to
    > be in base 2, and one writes those in base 16 just to avoid
    > making the textual representation very long.


    Yes, that is the main purpose, depending upon how you meant it.

    A floating point number with N bits of precision can be exactly in
    ceil(N/4.0) hexedecimal digits, but requires ceil(N*ln(2)/ln(10)) (+1?)
    decimal digits to be expressed with sufficient precision to uniquely
    determine what all N of those bits should be. That's only a 20% more
    digits; it's not much of an motivation for using hexadecimal notation.

    However, to express the number exactly would require N decimal digits -
    that's the big advantage of hexadecimal floating point constants.

    This advantage only applies when FLT_RADIX is a power of 2, but that's
    by far the most common case. The most common alternative to FLT_RADIX==2
    is FLT_RADIX==16, which provides the same advantage. I've also heard of
    platforms where FLT_RADIX of 3 or 10 would be appropriate, but I don't
    know if any implementation of C was ever created for such platforms.
    --
    James Kuyper
    James Kuyper, Jun 1, 2011
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Thinkit
    Replies:
    10
    Views:
    781
    Peter
    Jan 2, 2004
  2. John Goche
    Replies:
    8
    Views:
    16,426
  3. bd
    Replies:
    0
    Views:
    605
  4. Mr. SweatyFinger
    Replies:
    2
    Views:
    1,748
    Smokey Grindel
    Dec 2, 2006
  5. Carsten Fuchs
    Replies:
    45
    Views:
    1,505
    James Kanze
    Oct 8, 2009
Loading...

Share This Page