Using type prefixes with floating point constants

Discussion in 'C++' started by Ioannis Vranos, Mar 26, 2009.

  1. ISO/IEC 9899:1990/1995 says (from K&R2):

    “A6.4

    When a less precise floating value is converted to an equally or more
    precise floating type, the value is unchanged. When a more precise
    floating value is converted to a less precise floating type, and the
    value is within representable range, the result may be either the next
    higher or the next lower representable value. If the result is out of
    range, the behavior is undefined”.


    Question: Does the above mean that it is a good practice or *always*
    needed to use the appropriate type suffixes with floating point constants?


    An example of this:


    #include <iostream>


    int main(void)
    {
    using namespace std;

    float f1 = 0.33439F;

    float f2= 0.33439f;

    cout<< "\nf1= "<< f1<<", f2= "<< f2<< endl;


    double d1= 0.33439;

    double d2= 0.33439;

    cout<< "\nd1= "<< d1<<", d2= "<< d2<< endl;


    // It doesn't work with MINGW, compiler is broken regarding
    // long double.
    long double ld1= 0.33439L;

    long double ld2= 0.33439l; // 'l' is the lower case 'L'.

    cout<< "\nld1= "<< ld1<<", ld2= "<< ld2<< endl;


    return 0;
    }
     
    Ioannis Vranos, Mar 26, 2009
    #1
    1. Advertising

  2. On Mar 26, 2:54 pm, Ioannis Vranos <>
    wrote:
    > ISO/IEC 9899:1990/1995 says (from K&R2):
    >
    > “A6.4
    >
    > When a less precise floating value is converted to an equally or more
    > precise floating type, the value is unchanged. When a more precise
    > floating value is converted to a less precise floating type, and the
    > value is within representable range, the result may be either the next
    > higher or the next lower representable value. If the result is out of
    > range, the behavior is undefined”.
    >
    > Question: Does the above mean that it is a good practice or *always*
    > needed to use the appropriate type suffixes with floating point constants?
    >

    I don't know about best practice---I don't use floating point often
    enough for that---, but it certainly is not needed to always specify
    the suffixes.

    First of all, the majority of floating point constants are not exactly
    representable in any of the floating point types, so you get the
    conversion to the next higher or next lower representable value
    anyway.
    If float and double don't have the same range and precision, then a
    compiler must be really perverse to get different results for the
    expressions '(float)0.33439' and '0.33439F'.

    The only suffix with more than documentary value is L (or l), if you
    need the extra precision or range that long double might give you.

    Bart v Ingen Schenau
     
    Bart van Ingen Schenau, Mar 27, 2009
    #2
    1. Advertising

  3. Bart van Ingen Schenau wrote:
    > On Mar 26, 2:54 pm, Ioannis Vranos <>
    > wrote:
    >> ISO/IEC 9899:1990/1995 says (from K&R2):
    >>
    >> “A6.4
    >>
    >> When a less precise floating value is converted to an equally or more
    >> precise floating type, the value is unchanged. When a more precise
    >> floating value is converted to a less precise floating type, and the
    >> value is within representable range, the result may be either the next
    >> higher or the next lower representable value. If the result is out of
    >> range, the behavior is undefined”.
    >>
    >> Question: Does the above mean that it is a good practice or *always*
    >> needed to use the appropriate type suffixes with floating point constants?
    >>

    > I don't know about best practice---I don't use floating point often
    > enough for that---, but it certainly is not needed to always specify
    > the suffixes.
    >
    > First of all, the majority of floating point constants are not exactly
    > representable in any of the floating point types, so you get the
    > conversion to the next higher or next lower representable value
    > anyway.
    > If float and double don't have the same range and precision, then a
    > compiler must be really perverse to get different results for the
    > expressions '(float)0.33439' and '0.33439F'.
    >
    > The only suffix with more than documentary value is L (or l), if you
    > need the extra precision or range that long double might give you.
    >
    > Bart v Ingen Schenau



    Thank you for your answer, the discussion is continued in thread:

    "Corrected: Using type suffixes with floating point constants"

    where I will forward your answer.
     
    Ioannis Vranos, Mar 27, 2009
    #3
    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. Ioannis Vranos
    Replies:
    0
    Views:
    281
    Ioannis Vranos
    Mar 26, 2009
  2. Ioannis Vranos

    Using type prefixes with floating point constants

    Ioannis Vranos, Mar 26, 2009, in forum: C Programming
    Replies:
    4
    Views:
    338
    Keith Thompson
    Mar 27, 2009
  3. Ioannis Vranos
    Replies:
    8
    Views:
    336
    James Kuyper
    Mar 28, 2009
  4. Ioannis Vranos
    Replies:
    10
    Views:
    547
    Victor Bazarov
    Mar 31, 2009
  5. Saraswati lakki
    Replies:
    0
    Views:
    1,427
    Saraswati lakki
    Jan 6, 2012
Loading...

Share This Page