问题是: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*/ 为什么?*/
(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*/ 为什么?*/
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
这样你就明白了,哪些数在类型转换时会发生舍入的情形因而会被警告,
哪些数在类型转换时不会发生舍入的情形,所以顺利通过。
请大家说说下面这些数在进行类型转换时哪些数会被警告,那些不会: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
http://expert.csdn.net/Expert/topic/1237/1237655.xml?temp=.3201715我刚才发的贴现在发现错了,想改
但刚才连发了三个,CSDN竟然不让我贴留言了,说什么一个页面上连续发贴不得超三次(其实我觉得它不给分不就得了么,何必那么麻烦)
" ---Panr(光荣) 如 Panr(光荣) 所说其精度在 float 之内或为答案,但机器内二进制中表示是原玛?补码?还是反码?
它们可能会影响数字正负号的判断和特定位的真假,但不影响精度老弟,你再想想“原码、补码还是反码”是指整数还是浮点;-)
多谢Panr(光荣)深夜作答。
你们是我学习的板样!