| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3655 人关注过本帖
标题:printf("%f\n", 10/3);这个为什么值不确定?
只看楼主 加入收藏
printc
Rank: 2
来 自:坎坷之路
等 级:论坛游民
帖 子:162
专家分:84
注 册:2009-6-12
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:15 
printf("%f\n", 10/3);这个为什么值不确定?
RT,强制类型转换后确定为3.000000,但是如果直接写printf("%f\n", 10/3);每次值都不一样。。怎么回事?
搜索更多相关主题的帖子: printf 
2009-07-30 22:12
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1685
专家分:4252
注 册:2007-12-27
收藏
得分:0 
如果真的是这样,那就是因为你使用的16位系统,调用printf的时候传递给它一个16位的值,它却取出来一个32位的(并且还解释为浮点),多出来那(高)16位咱不知道是啥,看起来就每次都变了。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2009-07-31 00:57
printc
Rank: 2
来 自:坎坷之路
等 级:论坛游民
帖 子:162
专家分:84
注 册:2009-6-12
收藏
得分:0 
Ubuntu-8.10-desktop-i386

确定是32位系统

人生之路,坎坷颇多……
2009-07-31 06:44
金多虾
Rank: 2
等 级:论坛游民
帖 子:153
专家分:99
注 册:2009-6-9
收藏
得分:0 
说得很对?
2009-07-31 07:55
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:5 
因为printf是一个不定参数函数。这种函数的不定参数部分,内部类型都会自动提升。float会自动提升为double再传给printf,因此printf期望从输入中获得一个double(64位),却只给一个32位的数字,当然每次都不一样啦……

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-07-31 09:58
printc
Rank: 2
来 自:坎坷之路
等 级:论坛游民
帖 子:162
专家分:84
注 册:2009-6-12
收藏
得分:0 
以下是引用StarWing83在2009-7-31 09:58的发言:

因为printf是一个不定参数函数。这种函数的不定参数部分,内部类型都会自动提升。float会自动提升为double再传给printf,因此printf期望从输入中获得一个double(64位),却只给一个32位的数字,当然每次都不一样啦… ...


精辟啊

人生之路,坎坷颇多……
2009-07-31 11:47
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
收藏
得分:10 
vc6每次都等于0.000000
printf("%f\n", (float)10/3);
printf("%f\n", 10.0/3);
结果:3.333333
我去睡觉了,一会再说

编译器看到带有小数点的十进制数,那么会将其默认为double类型(而不是float),double类型在一般的机子里都占有8个字节(64位)。格式化输出会根据%f的格式化输出进行提升。也就是double型,其输出有和编译器有点关系吧。

IEEE浮点数标准:     
4字节浮点数:1位符号位,8位阶数(基数为127的移码),23位尾数;     
8字节浮点数:1位符号位,11位阶数(基数为1023的移码),52位尾数
在VC中:
float数值范围约在 -10e38~10e38,并提供7位有效数字位,/*绝对值小于10e38地数被处理成零值*/
double数值范围约在-10e308~10e308,并提供15~16位有效数字,/*绝对值小于10e308地数被处理成零值*/
注:拷贝没注意。。。。丑大了

鄙人技术不行,以后不说话了。。。
10/3=3
这是整型3,在内存中是(int以四个字节)0000 0000 0000 0000 0000 0000 0000 0011入栈,输出double型数据为0  000 00000000  00000000000000000011********************************
float
共计64位,8字节
由最高到最低位分别是第63、62、61、……、0位
63位是符号位,1为负,0为正。
62-51位,一共11位是指数位。
50-0 位,一共52位是尾数位。
IEEE 754在标识符点数时, 每个浮点数均由3个部分组成:符号位S(1位),指数部分E和尾数部分M
单精度格式(32位):E=8位,M=23位。
双精度格式(64)位:E=11位,M=52位
00000000000000000011********************************为0.00000000000000000011********************************
因为当e二进制全部为0,为非规格化数,被表示为零。。。
同时C++/C类型转换默认的舍入方式是向0截断。

PS:欢迎批评指教,能力有限啊

[[it] 本帖最后由 lishizelibin 于 2009-7-31 17:09 编辑 [/it]]

惟有学习不断的学习!
2009-07-31 12:31
CCVC果冻爽
Rank: 4
等 级:业余侠客
帖 子:116
专家分:209
注 册:2009-7-31
收藏
得分:0 
绝对值小于10e38地数被处理成零值?10e38我记得是10的38次方吧,那不都变0了...
2009-07-31 15:24
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:5 
因为你的10/3是一个int类型,但你指定printf输出的却要求一个float类型,而在你的系统里int类型的长度可能比float短,而printf却尝试去读float长度的值,于是出现了那不确定内存部分作为你10/3的一部分被printf了输出来。

身体是玩命的本钱
2009-07-31 17:54
AND_Y
Rank: 2
等 级:论坛游民
帖 子:18
专家分:45
注 册:2009-7-31
收藏
得分:0 
让我大长见识啊
没想到还 有这样的问题啊
2009-07-31 18:02
快速回复:printf("%f\n", 10/3);这个为什么值不确定?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015874 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved