作者LPH66 (IWH68S0XZ8M89)
看板Programming
标题Re: [问题] 基本程式设计概念的问题
时间Mon Jan 21 11:40:03 2008
※ 引述《sjgau (sjgau)》之铭言:
: 底下,我用 Dev-C++ 实作,得到的结果和 您的构想不同。
: 当然啦!我不会否定 您的想法,我只是想说明一件事,
: 程式设计这种东西,一定要实际做过一遍,才能拿来说嘴。
: 否则,很容易得到不同的结果。
: 我很清楚怎麽 一回事情,这种东西讨论起来,
: 没完没了。
well, 只是个四舍五入的差别而已
FPU计算时的四舍五入机制把它处理掉了
也许要用大一点的数才能看得出差别
(例如1.0/11111111.0再乘回来之类的) (←当然这也是乱说的也没试过)
讲个经典的例子比较能够感受得到这个问题的重要性:
几个月前Excel 2007爆出大Bug
当它计算850*77.1时不是得到正确的65535 却竟然出现100000的答案
微软的官方解释是
http://blogs.msdn.com/excel/archive/2007/09/25/calculation-issue-update.aspx
据说是因为浮点数转字串的程式里因为浮点数误差
导致这些原本是65535-2^(-35)等的数字正好戳中程式的bug
才会吐出100000的答案
这个浮点数误差的来源正是那个77.1
77.1表示成二进位时那个.1是二进位循环小数
所以再乘850回去时这个误差就放大到四舍五入盖不掉
然後这个误差又戳中了那段bug才会有这个结果
--
顺便提一下 手边有Excel 2007却还没修好(或还没Windows Update过)的人
这里是官方patch:
http://support.microsoft.com/kb/943075/
(即是Windows Update上的那一份 KB943075/KB943076)
--
実琴:「
河野!你真的就这样被
物质慾望给吸引过去了吗?!」
亨:「只要
穿着女装摆出亲切的样子,所有必要花费就能
全免,似乎一点都不坏啊。」
実琴:「难道你没有
男人的尊严了吗?!」
亨:(断然道)「
没有。在
节衣缩食且
生活吃紧的
学生面前,
没有那种东西。」
--プリンセス・プリンセス 第二话
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.250.80
1F:推 sjgau:不只是 四舍五入的问题。还牵涉到 浮点数 211.77.241.3 01/21 11:47
2F:→ sjgau:如何储存,计算,显示的问题。 211.77.241.3 01/21 11:48
3F:→ LPH66:还有不少细节方面的啦 不过如你所说 219.84.44.21 01/22 22:14
4F:→ LPH66:这东西要细讲就没完没了了 XD 219.84.44.21 01/22 22:15