Floating point 计算机中的浮点计算

Floating point 计算机中的浮点计算,floating-point,hardware,Floating Point,Hardware,有人能解释一下,为什么下面两个操作序列在计算机/硬件/计算器中产生不同的结果 序列1 步骤1:1/3 步骤2:(步骤1的结果)*3 答案=1 序列2 步骤1:.3333(最多可能输入) 步骤2:(步骤1的数量)*3 答案=.9999999 据我所知,当计算机无法100%准确地存储或表示浮点数时。如果序列1产生舍入值,那么序列2为什么不产生舍入值呢。 或者,是否有任何harwired算法可以对1/3、2/3进行特殊处理 我曾在移动计算器、Windows计算器应用程序、Microsoft excel

有人能解释一下,为什么下面两个操作序列在计算机/硬件/计算器中产生不同的结果

序列1
步骤1:1/3
步骤2:(步骤1的结果)*3
答案=1

序列2
步骤1:.3333(最多可能输入)
步骤2:(步骤1的数量)*3
答案=.9999999

据我所知,当计算机无法100%准确地存储或表示浮点数时。如果序列1产生舍入值,那么序列2为什么不产生舍入值呢。 或者,是否有任何harwired算法可以对1/3、2/3进行特殊处理


我曾在移动计算器、Windows计算器应用程序、Microsoft excel工作表中尝试过。所有计算器都给出相同的结果。

许多计算器使用十进制,并使用固定的位数。例如,如果我们用七个十进制数字计算1/3,我们得到.3333。这已经四舍五入到七位数。当我们把它乘以3,我们得到.9999999。因为结果是七位数,所以它适合我们的七位数宽度,并且没有舍入

许多计算机实现的算术使用二进制,也使用固定数字。例如,如果我们用七个二进制数字计算1/3,我们得到.0101011。这也被四舍五入以适应我们的七位数,它被四舍五入,因为我们必须四舍五入的分数在我们四舍五入的位置超过了1/2。当我们把它乘以3时,精确的答案是1.0000001。它有八位数,所以我们把它四舍五入到七位数,得到1.000000。(在这种情况下,取整点处的分数正好是1/2,规则是取整,以便下一个数字为偶数,因此我们向下取整为0。)


我仅在这些示例中使用了七位数字。通常,计算机浮点运算使用53个二进制数字作为分数部分(对于
double
类型,24个用于
float
)。计算器使用的小数位数不同,但通常超过7。

因为1/3不同于0.3333…但我们知道内存的固定大小有限,因此存储.33333会导致一些截断。那它的处理方式有什么不同你打了多少个三?例如,在一种常见的格式中,您需要大约16个三才能获得与计算1/3相同的近似值。是的,序列2中有16个,3个