发信人: zxiaoqiang (xiaoqiang), 信区: C_Cpp
标 题: c++中的bug
发信站: 兵马俑BBS (Sun Sep 6 22:55:54 2009), 本站(bbs.xjtu.edu.cn)
自己在使用c++过程中,遇见了一个自己一直想不明白的问题。在此请教一下各位大侠。我使用定时器每隔1秒让我的自变量加0.2,当自变量值大于等于6时停止定时器。当我把这个自变量的类型定义为float时,当定时器停下时,自变量的值已经变成了6.2,并不是6。但是当这个自变量的类型定义为double时,自变量的值最后就会定格在6。不知道这个数据类型怎么会影响这样一个过程。希望高手可以指点迷津。谢谢
发信人: phylips (星星||一年磨十剑), 信区: C_Cpp
标 题: Re: c++中的bug
发信站: 兵马俑BBS (Mon Sep 7 09:38:13 2009), 本站(bbs.xjtu.edu.cn)
这个不算c++的bug,问题在于浮点数的表示,具体参考ieee754标准
大体上来说是这样,0.2这个数很明显无法用有限二进制位表示
这样会存在一个误差,而且伴随着不断的加,误差会累积,而float double精度不同,这样就可能发生一些不同。问题不是出在6.2时,而是6.0。当你认为加到6理应是6.0的时候,根据结果,说明float看来是6.0少一点,比如是5.999999...之类的,所以还会继续加个0.2
浮点数大小比较有个基本原则,不能直接比较,估计你是在直接比较6.0,而通常是要用误差限定,定义一个允许误差ESP。
综上,bug是你出的,不是c++的;一般来说,bug通常都是你的。