计算机中的浮点数计算
float calculation in computer
谁能解释一下,为什么下面的两个操作序列在计算机 machine/hardware/ 计算器中会产生不同的结果?
序列 1
第 1 步:1/3
第 2 步:(第 1 步的结果)* 3
答案 = 1
序列 2
第 1 步:.3333333333(最多可能的条目)
第 2 步:(第 1 步的数量)* 3
答案 = .9999999999
据我所知,计算机无法 100% 精确地存储或表示浮点数。如果序列 1 产生舍入值,那么序列 2 为什么不产生舍入值。
还是有什么乱七八糟的算法,专门检查1/3、2/3?
我已经在移动计算器、Windows 计算器应用程序、Microsoft excel sheet 中尝试过这个。都给出相同的结果。
许多计算器使用十进制并使用固定位数。例如,如果我们使用七位十进制数字计算 1/3,我们将得到 .3333333。这已经四舍五入以适合七位数。当我们将其乘以 3 时,我们得到 .9999999。由于结果是七位数,正好符合我们的七位数宽度,没有四舍五入。
许多算术的计算机实现使用二进制,也使用固定位数。例如,如果我们使用七位二进制数字计算 1/3,我们会得到 .0101011。这也已四舍五入以适合我们的七位数,并且它四舍五入是因为我们必须四舍五入的分数在我们四舍五入的位置超过 1/2。当我们将其乘以 3 时,确切的答案是 1.0000001。它有八位数字,因此我们将其四舍五入为七位数字,得到 1.000000。 (在这种情况下,我们四舍五入点的分数正好是 1/2,规则是四舍五入以便下一位是偶数,因此我们向下舍入为 0。)
我仅在这些示例中使用了七位数字。通常,计算机浮点运算使用 53 位二进制数字作为小数部分(对于 double
类型,24 位对于 float
)。计算器使用的小数位数各不相同,但通常都超过七位。
谁能解释一下,为什么下面的两个操作序列在计算机 machine/hardware/ 计算器中会产生不同的结果?
序列 1
第 1 步:1/3
第 2 步:(第 1 步的结果)* 3
答案 = 1
序列 2
第 1 步:.3333333333(最多可能的条目)
第 2 步:(第 1 步的数量)* 3
答案 = .9999999999
据我所知,计算机无法 100% 精确地存储或表示浮点数。如果序列 1 产生舍入值,那么序列 2 为什么不产生舍入值。 还是有什么乱七八糟的算法,专门检查1/3、2/3?
我已经在移动计算器、Windows 计算器应用程序、Microsoft excel sheet 中尝试过这个。都给出相同的结果。
许多计算器使用十进制并使用固定位数。例如,如果我们使用七位十进制数字计算 1/3,我们将得到 .3333333。这已经四舍五入以适合七位数。当我们将其乘以 3 时,我们得到 .9999999。由于结果是七位数,正好符合我们的七位数宽度,没有四舍五入。
许多算术的计算机实现使用二进制,也使用固定位数。例如,如果我们使用七位二进制数字计算 1/3,我们会得到 .0101011。这也已四舍五入以适合我们的七位数,并且它四舍五入是因为我们必须四舍五入的分数在我们四舍五入的位置超过 1/2。当我们将其乘以 3 时,确切的答案是 1.0000001。它有八位数字,因此我们将其四舍五入为七位数字,得到 1.000000。 (在这种情况下,我们四舍五入点的分数正好是 1/2,规则是四舍五入以便下一位是偶数,因此我们向下舍入为 0。)
我仅在这些示例中使用了七位数字。通常,计算机浮点运算使用 53 位二进制数字作为小数部分(对于 double
类型,24 位对于 float
)。计算器使用的小数位数各不相同,但通常都超过七位。