回复 40楼 辛昕 的帖子

我输出是0.000000,这个位数我是能理解的,但这个0搞不明白

 float a=10/3;

 printf("%f\n", a);

如果我按上面这个方法定义,输出的就是3.000000,虽然还没有搞明白楼主的问题为什么输出是0.000000,但觉得对于我们初学者以后写程序还是严谨一点好,这样看的明白

[ 本帖最后由 zjjone1023 于 2011-5-11 09:50 编辑 ]
点赞  2011-5-11 09:27

那个,恩,其实,大家。。。
你们真的有运行试过么,
我试了。VC6下直接崩溃
TC,显示

 printf : floating point formats not linked
abnormal program termination

然后我吧代码改为如下

 #include "stdio.h"
void main()
{
 float   temp;
 temp = 10 / 3;
    printf("%f\n", temp);
    printf("%f\n", 10 / 3);
}

这下可以运行了,但是不同编译器下显示也是不一样的

TC2.0下显示

3.000000

-2.563254318042132690000000000000000000000e+307

TC3.0和VC6下显示

3.000000

0.000000

看来真如maylove所说

 

 

点赞  2011-5-11 09:38
关于第二个问题,我还是不太明白,头真的是很大了,第一个问题,已经很清晰的掌握了,谢谢楼主和好心人的解答,学习了。
点赞  2011-5-11 09:41
哈哈。
大家等着,高手即将出动了
强者为尊,弱者,死无葬身之地
点赞  2011-5-11 09:42

回复 42楼 leang521 的帖子

贴图表明我真的跑了。
KEIL跑的结果更诡异
强者为尊,弱者,死无葬身之地
点赞  2011-5-11 09:43

回复 41楼 zjjone1023 的帖子

请仔细看玲珑的解释和后半段的解释,
其实意思是。。。
如果你告诉我,0x00000011是整型,我会明白它是3.。。
如果你告诉我它是浮点数,那我表示我真的不知道它到底是0还是0,324,甚至-0.234
强者为尊,弱者,死无葬身之地
点赞  2011-5-11 09:47

我输出是0.000000,这个位数我是能理解的,但这个0搞不明白 float a=10/3; printf("%f\n", a); 如果我按上面这个方法定义,输出的就是3.000000,虽然还没有搞明白楼主的问题为什么输出是0.000000,但觉得对于我们初学者以后写程序还是严谨一点好,这样看的明白

奇怪了,现在如果直接printf("%f\n", 10/3); 编译提示出错

[ 本帖最后由 zjjone1023 于 2011-5-11 09:55 编辑 ]
点赞  2011-5-11 09:54
这个问题,我在基于x86的FreeBSD上做实验,和基于SPARC的Solaris上做实验的结果不一样。
前者的结果是-0.124685,后者是0。

显然,%f把后面的数当成浮点数对待,而代码中的10和3两个数字,默认被当成了整数,用后缀格式写就是10UL和3UL,除法的结果向下取整得到了3UL,在寄存器中是0x00000003.
那么,为什么同样是0x00000003,当作浮点数处理的时候,x86和SPARC的结果不一样呢?
翻开IEEE754标准,对单精度浮点数的说法:
http://en.wikipedia.org/wiki/Single_precision_floating-point_format



注意这个图。x86是小端处理器,低位(LSB)在低地址,高位(MSB)在高地址,所以0x00000003的第0个字节是0x03,其他3个字节是0,在内存中的二进制是
00000011 00000000 00000000 00000000
(低位)                                                (高位)
按照IEEE单精度浮点数的格式:
sigh(符号位)0b
有效值部分:11000000b
指数部分:0b

于是,%f将其解释为-0.124685

而SPARC是大端处理器,低位(LSB)在高地址,高位(MSB)在低地址,0x00000003在内存中是:
00000000 00000000 00000000 00000011
低位                                                      高位
按照IEEE单精度浮点数的格式:
sigh(符号位)0b
有效值部分:0b
指数部分:110b

所以,最后得到的是0。





点赞  2011-5-11 10:00
确实是浮点数的格式决定的啊,10/3应该是在编译的时侯算的,由于编译器不知道究竟是浮点数的除法还是整数的除法,所以根据被除数和除数的类型判断,所以默认用的整形的除法所以结果是3,转换成浮点数的时候由于内存的布局低位被无视了。所以我们处理浮点的时候应该明确告诉编译器这个是个浮点数,比如我们用(float)10/3就达到目的了。
点赞  2011-5-17 16:44
看来在格式转换时问题真的不少啊。
点赞  2011-5-19 18:12
123
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复