473

帖子

0

TA的资源

纯净的硅(高级)

41
 

回复 40楼 辛昕 的帖子

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

 float a=10/3;

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

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

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

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

42
 

那个,恩,其实,大家。。。
你们真的有运行试过么,
我试了。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所说

 

 

 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

43
 
关于第二个问题,我还是不太明白,头真的是很大了,第一个问题,已经很清晰的掌握了,谢谢楼主和好心人的解答,学习了。
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

44
 
哈哈。
大家等着,高手即将出动了
个人签名

强者为尊,弱者,死无葬身之地

 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

45
 

回复 42楼 leang521 的帖子

贴图表明我真的跑了。
KEIL跑的结果更诡异
个人签名

强者为尊,弱者,死无葬身之地

 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

46
 

回复 41楼 zjjone1023 的帖子

请仔细看玲珑的解释和后半段的解释,
其实意思是。。。
如果你告诉我,0x00000011是整型,我会明白它是3.。。
如果你告诉我它是浮点数,那我表示我真的不知道它到底是0还是0,324,甚至-0.234
个人签名

强者为尊,弱者,死无葬身之地

 
 
 

回复

473

帖子

0

TA的资源

纯净的硅(高级)

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 编辑 ]
 
 
 

回复

1668

帖子

0

TA的资源

裸片初长成(初级)

48
 
这个问题,我在基于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。





赞赏

1

查看全部赞赏

 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

49
 
确实是浮点数的格式决定的啊,10/3应该是在编译的时侯算的,由于编译器不知道究竟是浮点数的除法还是整数的除法,所以根据被除数和除数的类型判断,所以默认用的整形的除法所以结果是3,转换成浮点数的时候由于内存的布局低位被无视了。所以我们处理浮点的时候应该明确告诉编译器这个是个浮点数,比如我们用(float)10/3就达到目的了。
 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

50
 
看来在格式转换时问题真的不少啊。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表