为什么所有的浮点数都可以用十进制表示?

k31*_*159 1 floating-point ieee-754

众所周知,并不是所有的十进制数都可以用二进制浮点数精确表示。

然而,似乎所有的二进制浮点数都可以用十进制表示法精确表示。

为什么没有任何浮点数不能用十进制表示,而反过来则不然呢?看起来有些不对称。

Eri*_*hil 6

二进制浮点格式将数字表示为 \xc2\xb1 M \xe2\x80\xa22 e,其中M是指定范围内的整数,e是指定范围内的整数指数。(也可以定义表示形式,其中M是定点数而不是整数。通过对边界进行适当调整,这些表示在数学上是等效的。)

\n

十进制数字相当于 \xc2\xb1 M \xe2\x80\xa210 e (当然,通常对于其他一些Me )。例如, 3.4 相当于 +34\xe2\x80\xa210 \xe2\x88\x921

\n

对于任何形式为 \xc2\xb1 M \xe2\x80\xa210 e的十进制数字,我们可以重写它: \xc2\xb1 M \xe2\x80\xa210 e = \xc2\xb1 M \xe2\x80\xa2( 5\xe2\x80\xa22) e = \xc2\xb1 M \xe2\x80\xa2(5 e \xe2\x80\xa22 e ) = \xc2\xb1( M \xe2\x80\xa25 e )\xe2\ x80\xa22 e。现在,如果M \xe2\x80\xa25 e是界限内的整数,则这是二进制浮点表示。但是,如果M \xe2\x80\xa25 e不是整数,如 34\xe2\x80\xa25 \xe2\x88\x921,则无法使其成为整数。该数字无法以二进制浮点格式表示。

\n

相反,考虑二进制浮点数 \xc2\xb1 M \xe2\x80\xa22 e。如果e是非负数,则它是一个整数,因此它已经是十进制数字形式;它是 10 0的整数倍。如果e为负数,我们可以重写它: \xc2\xb1 M \xe2\x80\xa22 e = \xc2\xb1 M \xe2\x80\xa22 e \xe2\x80\xa25 e \xe2\x80\xa25 \xe2 \x88\x92 e = \xc2\xb1 M \xe2\x80\xa210 e \xe2\x80\xa25 \xe2\x88\x92 e = \xc2\xb1( M \xe2\x80\xa25 \xe2\x88\x92 e )\xe2\x80 \ xa210 那么,由于e是负数,所以M \xe2\x80\xa25 \xe2\x88\x92 e是一个整数,所以 \xc2\xb1( M \xe2\x80\xa25 \xe2\x88\x92 e )\xe2\x80 \xa210 e是整数乘以 10 的幂的十进制形式。

\n

换句话说,我们可以将任何还不是整数的二进制浮点数乘以 10,直到得到一个整数为止。这是因为 2 是 10 的因数,因此每次乘以 10 都会抵消浮点表示中 2 的负幂之一。

\n

相反,给定一个非整数的十进制数字(例如 0.1),我们不能总是将其转换为整数,因为乘以 2 不会消除其中的 5 负幂。

\n