我知道数字表示之间的差异,但这是我希望有人解释的内容。 我们看到浮点数t的值是这样的,我想知道为什么f不等于2 + t(数学上应该是这样)但是有一点点小错误[对我来说它实际上相当大!]。
这是由int * float multiplication引入的错误吗?
答案 0 :(得分:1)
通常,通过首先将整数转换为浮点然后执行算术运算来执行具有浮点类型值的整数类型的值的相加或相乘。如果整数值无法以浮点格式精确表示,则即使在执行操作之前也会引入错误。使用示例中的小整数,这不是问题。
如果在浮点类型中无法表示精确的数学结果,则算术运算将引入错误。有两种方法可能无法表示结果:
您的示例不会接近发生上溢或下溢的幅度,因此我不会在此讨论它们。
假设您正在使用IEEE-754 32位二进制浮点(在C实现中常用于float
),则有效位数为24位。因此,只要执行结果需要超过24位的操作,就会出现错误。这个24位跨度是从一个数字中的最高设置位到最低设置位测量的。
例如,1111.11111111111111111111 2 需要24位来表示。如果向其中添加10000 2 ,则精确的数学结果为11111.11111111111111111111 2 。这需要25位,因此它不适合,因此浮点实现必须将精确的数学结果舍入为可表示的结果。 (在具有此特定值的公共舍入到最近模式中,它将低位向上舍入,导致所有位的进位,产生100000 2 。)
现在您可以了解哪些操作会出错。如果添加两个不同大小的数字,则较小数字的一些低位将被“推出”结果。如果这些位中的任何一个不为零,则信息丢失,发生错误。此外,结果可能跨越二次幂边界,其中最高位高于任一输入值的最高位。这推动了有效数据的另一部分。例如,如果我们将1000添加到1111.11111111111111111111 2 ,则精确的数学结果为10111.11111111111111111111 2 。这需要25位,因此低位被舍入,产生11000 2 。
假设您有两个数字,它们的有效数字中需要 a 和 b 位。当你乘以它们时,确切的数学结果需要 a + b -1或 a + b 位,具体取决于是否存在产生新高位的“进位”。例如,11 2 •111 2 = 10101 2 ,两位乘以三位产生五位。或1.001 2 •1.01 2 = 1.01101 2 ,四位乘以三位产生六位。因此乘以整数会产生舍入误差。
乘以2的幂不会以这种方式产生舍入误差,尽管它可能导致上溢或下溢。
答案 1 :(得分:0)
这是因为浮点数中的浮点错误。由于浮点数只能包含一定数量的二进制数字,因此它们不能完全准确,因此在使用它们进行计算时,得到的数字并不完全准确。