浮点除法不完美

时间:2014-06-09 18:27:00

标签: c++ c floating-point division

我知道浮点数并不完美,无论是float还是double,但它是否意味着,当我将一个浮点数除以另一个并且被除数是可分的时通过没有提醒的分隔符(如10000.0可以被10.0整除),我是否有可能得到一个.99999999的数字......最后只有一小部分小于正确的结果。浮点数会发生这种情况吗?

我需要知道,因为我需要在除法之后应用floor函数,如果浮点除法确实不完美,那将会产生巨大的差异。

2 个答案:

答案 0 :(得分:7)

  

这是否意味着,当我将一个浮点数除以另一个并且除数可被除法器整除而没有提醒(如10000.0可被10.0整除)时,我可能得到一个数字为.99999999。 ..最后

没有。 IEEE 754分区正确舍入。如果结果中存在可表示的浮点数(在您的示例中为1000),则这是您将获得除法的结果。

可能发生的是你没有划分你正在思考的数字,因为你写了0.1并且你认为这代表数学值0.1。在这种情况下,最终结果可能会令人惊讶,但这不是浮点除法的错误。

只要你知道你要划分你的数字,如果除法的数学结果是,例如,一个小于2 24 的整数,那么浮点除法的结果将是那个整数。

答案 1 :(得分:2)

假设硬件使用的是IEEE 754浮点除法,关键问题在于自然数操作数是否完全可以表示。

首先,格式具有有限范围。自然数不会。但是,即使是大约10 ^ 38的32位二进制浮点限制也足以满足大多数实际需要。

在该范围内,可归结为自然数是否可以表示为1.x*2^n,其中n是整数,1.x是二进制分数,后面不超过23位二进制点。所有符合24位的自然数符合该条件。那么两个范围内的所有权力也是如此。

通常,具有较大指数的较大浮点数在连续值之间具有较大的间隙。最多24位自然,差距不大于1,因此所有自然数都可以表示。在下一步,间隙为2,然后是4,然后是8 ......随着指数的增加。