问题是:float x1 = 0.5; /*ok*/  为什么?
 (Beyond的一个专辑有句话:“问题是什么才是驚喜”。 驚是倒过来的)
         ...
float y1 = 0.7; /* 1. warning C4305*/ 
float x1 = 0.5; /* 2. ok*/
         ...
1: 你可能会说,呵编译器乱搞,降低Warning level就行。最后你肯定地说编译器真的乱报错。忘了告诉你这是在 vc++6 里面。然后你会说告诉M$,让M$自己搞定吗?
2:我的问题是 float x1 = 0.5; /*ok*/  为什么?
              即使 float x1 = 0.5L 也是。
-----------------------------------------------------------------------我对 1 的答案是:浮点常量默认是 double, 0.7 代表 0.7L,因此报错。这个解释来自译本《C 解析教程》,因此请你放心。我做了第一题。
你做第二题:      问题是:float x1 = 0.5; /*ok*/  为什么?*/

解决方案 »

  1.   

    对,float x1 = 0.5; 就ok,如果不是0.5就有warning C4305
      

  2.   

    float y1 = 0.7f;
    float x1 = 0.5f;

    float y1 = float(0.7);
    float x1 = float(0.5);
    这样就没问题了。
    而 float x1 = 0.5; 这种书写其实是不规范的,这种语句会导致类型转换。关于你的问题,请先看看各个数在内存里面的表达:
     float(0.500000)=0x3F000000  double(0.500000)=0x3FE0000000000000
     float(0.700000)=0x3F333333  double(0.700000)=0x3FE6666666666666
    这样你就明白了,哪些数在类型转换时会发生舍入的情形因而会被警告,
    哪些数在类型转换时不会发生舍入的情形,所以顺利通过。   
      

  3.   

    DBL_DIG 是15(FLT_DIG是6),是说明15个十进制的数字是可以被一个double准确地描述的,也就是说,你把这个数字用double表示后,在转化成十进制字符串肯定是准确的但这并不代表存在double中的数的值就是精确地是字符串的那个值,在不同的进制之间转化的误差看起来像是随机的,比如1/3在十进制中是0.3(3循环),在三进制中就是0.1就够了换成二进制以后,0.5  0.25  0.125  0.0625...  之类的数用二进制中表示时,其精度显然在float 的范围内,也就没有从double truncation 的需要啦
      

  4.   

    练习题:
      请大家说说下面这些数在进行类型转换时哪些数会被警告,那些不会:float(0.000000)=0x00000000  double(0.000000)=0x0000000000000000
    float(0.050000)=0x3D4CCCCD  double(0.050000)=0x3FA999999999999A
    float(0.100000)=0x3DCCCCCD  double(0.100000)=0x3FB999999999999A
    float(0.150000)=0x3E19999A  double(0.150000)=0x3FC3333333333334
    float(0.200000)=0x3E4CCCCD  double(0.200000)=0x3FC999999999999A
    float(0.250000)=0x3E800000  double(0.250000)=0x3FD0000000000000
    float(0.300000)=0x3E99999A  double(0.300000)=0x3FD3333333333334
    float(0.350000)=0x3EB33333  double(0.350000)=0x3FD6666666666667
    float(0.400000)=0x3ECCCCCD  double(0.400000)=0x3FD999999999999A
    float(0.450000)=0x3EE66666  double(0.450000)=0x3FDCCCCCCCCCCCCD
    float(0.500000)=0x3F000000  double(0.500000)=0x3FE0000000000000
    float(0.550000)=0x3F0CCCCD  double(0.550000)=0x3FE199999999999A
    float(0.600000)=0x3F19999A  double(0.600000)=0x3FE3333333333334
    float(0.650000)=0x3F266666  double(0.650000)=0x3FE4CCCCCCCCCCCD
    float(0.700000)=0x3F333333  double(0.700000)=0x3FE6666666666667
    float(0.750000)=0x3F400000  double(0.750000)=0x3FE8000000000000
    float(0.800000)=0x3F4CCCCD  double(0.800000)=0x3FE999999999999A
    float(0.850000)=0x3F59999A  double(0.850000)=0x3FEB333333333334
    float(0.900000)=0x3F666666  double(0.900000)=0x3FECCCCCCCCCCCCD
    float(0.950000)=0x3F733333  double(0.950000)=0x3FEE666666666667
    float(1.000000)=0x3F800000  double(1.000000)=0x3FF0000000000000
      

  5.   

    大家好,能不能帮我到这个页面上UP一下
    http://expert.csdn.net/Expert/topic/1237/1237655.xml?temp=.3201715我刚才发的贴现在发现错了,想改
    但刚才连发了三个,CSDN竟然不让我贴留言了,说什么一个页面上连续发贴不得超三次(其实我觉得它不给分不就得了么,何必那么麻烦)
      

  6.   

    "换成二进制以后,0.5  0.25  0.125  0.0625...  之类的数用二进制中表示时,其精度显然在float 的范围内,也就没有从double truncation 的需要啦
    "          ---Panr(光荣) 如 Panr(光荣) 所说其精度在 float 之内或为答案,但机器内二进制中表示是原玛?补码?还是反码?
      

  7.   

    to JoshuaLi():
    它们可能会影响数字正负号的判断和特定位的真假,但不影响精度老弟,你再想想“原码、补码还是反码”是指整数还是浮点;-)
      

  8.   

    (我是指浮点数[x*(2^y)]中,x的精度部分)
      

  9.   

    多谢Panr(光荣) ,icansaymyabc(学习与进步) 
    多谢Panr(光荣)深夜作答。
    你们是我学习的板样!