Chinaunix

标题: 笔试中一题C自动类型转换,请帮忙 [打印本页]

作者: bellgrade    时间: 2009-09-14 14:05
标题: 笔试中一题C自动类型转换,请帮忙
int m;
float n=1.555;
m=n*100+0.5;             //100和0.5难道不是被提升为double,然后截断为int赋予m吗?
cout<<m;
执行这个之后输出的是155,
如果把n的值改为1.5555,
执行之后就变成输出156了
作者: hellioncu    时间: 2009-09-14 14:14
浮点数的误差问题
作者: bellgrade    时间: 2009-09-14 21:31
原帖由 hellioncu 于 2009-9-14 14:14 发表
浮点数的误差问题



能不能详细一点,难道没理由,就是误差,不确定?
作者: phy0077    时间: 2009-09-14 21:48
sorry, 把100都整错了。。。 1.5625 * 64, 汗
是1.555就有损失了,
在由float 向int转换时只是取整运算,不进行四舍五入
误差是因2进制的表示范围,
个别浮点运算可能是精确的,
但要服从总体


面试题考这个, 难以理解。

[ 本帖最后由 phy0077 于 2009-9-14 22:21 编辑 ]
作者: drangon    时间: 2009-09-14 22:05
标题: 回复 #3 bellgrade 的帖子
由于精度原因,计算机无法准确表达 1.555 这个数,能表达的假设是 1.5549998 和 1.5550003(仅示例,非实际值)
那么1.5550000实际使用的是 1.5549998,这样算出来的值就是155.9998,取整就是155

而 1.5555 可能是取能表达的 1.5554997 和 1.5555002 中更接近的 1.5555002,这样算出来的值就是156.0002,
取整就是156了。
作者: action08    时间: 2009-09-15 00:02
原帖由 drangon 于 2009-9-14 22:05 发表
由于精度原因,计算机无法准确表达 1.555 这个数,能表达的假设是 1.5549998 和 1.5550003(仅示例,非实际值)
那么1.5550000实际使用的是 1.5549998,这样算出来的值就是155.9998,取整就是155

而 1.5555 ...

  

这个貌似就是微积分的那个小变量,关键时刻发挥了神奇的功效


建议LZ这种情况尽量转成整数处理,比如把所有相关的数都x1000,把所有的小数都XX掉,


当然具体是否可行,看业务




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2