众所周知,并非所有十进制数都可以用二进制浮点数准确表示。
但是,似乎所有二进制浮点数都可以使用十进制表示法精确表示。
当反之则不成立时,为什么没有任何浮点数不能用十进制表示?这似乎有些不对称。
二进制浮点格式将数字表示为 ±M•2 e,其中M是指定边界内的整数,e是指定边界内的整数指数。(也可以定义表示,其中M是定点数而不是整数。这些在数学上是等价的,对边界进行了适当的调整。
十进制数字相当于 ±M•10e(当然,通常对于其他一些M和e)。例如,3.4 相当于 +34•10−1。
对于 ±M•10 e 形式的任何十进制数字,我们可以重写它:±M•10e = ±M•(5•2)e = ±M•(5 e•2 e) = ±(M•5 e)•2e。现在,如果M•5e是边界内的整数,则这是二进制浮点表示。但是,如果M•5e不是整数,就像 34•5−1一样,则无法使其成为整数。此数字不能以二进制浮点格式表示。
相反,考虑一个二进制浮点数 ±M•2e。如果e是非负数,它是一个整数,所以这已经是十进制数字形式;它是一个整数乘以 100。如果 e 为负数,我们可以重写它:±M•2 e = ±M•2 e•5 e•5−e = ±M•10 e•5−e = ±(M•5−e)•10e。然后,由于 e 为负,M•5−e 是一个整数,因此 ±(M•5−e)•10e是整数乘以 10 的幂的十进制形式。
换句话说,我们可以通过将任何还不是整数的二进制浮点数乘以 10 直到我们得到一个整数来将其转换为整数。这是因为 2 是 10 的因数,因此每次乘以 10 都会抵消浮点表示中 2 的负幂之一。
相反,给定一个不是整数的十进制数字,例如 .1,我们不能总是将其变成整数,因为乘以 2 不会抵消其中 5 的负幂。
只是另一种看待它的方式
二进制浮点数具有单独的二进制数字,其值如下:
...2 4 = 16.0
2 3 = 8.0
2 2 = 4.0
2 1 = 2.0
2 0 = 1.0
2-1 = 0.5
2-2 = 0.25
2-3 = 0.125
2-4=0.0625
...
然后很容易看出,大 + 2 的幂是十进制的精确表示值,以及大 - 2 的幂。
由于所有二进制浮点数都是其位数的总和,因此所有二进制 FP 的十进制值很简单,即上述可表示的十进制值的总和。
Base 10 数字(我们写的像"123.456")并不总是可以用浮点二进制表示,因为像 0.1、0.01、0.001,m 等各个数字缺乏精确的有限二进制 FP 表示。
10-1= 0.00011001100110011...阿拉伯数字