有几个关于浮点表示法的问题被提交给了SO。例如,十进制数0.1没有精确的二进制表示,因此使用==操作符将其与另一个浮点数进行比较是危险的。我理解浮点表示法背后的原理。

我不明白的是,为什么从数学的角度来看,小数点右边的数字比左边的数字更“特殊”?

例如,数字61.0具有精确的二进制表示,因为任何数字的整数部分总是精确的。但6.10这个数字并不准确。我所做的只是把小数点移了一位突然间我就从精确乌托邦变成了不精确镇。从数学上讲,这两个数字之间不应该有本质差别——它们只是数字。

相比之下,如果我把小数点向另一个方向移动一位,得到数字610,我仍然在Exactopia。我可以继续往这个方向(6100,610000000,610000000000000)它们仍然是完全,完全,完全的。但是一旦小数点越过某个阈值,这些数字就不再精确了。

这是怎么呢

编辑:为了澄清,我不想讨论诸如IEEE之类的行业标准表示,而是坚持我所相信的数学上的“纯粹”方式。以10为基数,位置值为:

... 1000  100   10    1   1/10  1/100 ...

在二进制中,它们将是:

... 8    4    2    1    1/2  1/4  1/8 ...

这些数字也没有任意的限制。位置向左和向右无限增加。


当前回答

有一个阈值,因为数字的含义已经从整数变成了非整数。要表示61,有6*10^1 + 1*10^0;10^1和10^0都是整数。6.1是6*10^0 + 1*10^-1,但10^-1是1/10,显然不是整数。这就是你在不精确镇的下场。

其他回答

上面的高分答案完全正确。

首先,你的问题中混合了以2为底和以10为底的数,然后当你把一个不能整除的数放在右边时,你就有问题了。比如十进制的1/3因为3不能整除10的幂,或者二进制的1/5不能整除2的幂。

Another comment though NEVER use equal with floating point numbers, period. Even if it is an exact representation there are some numbers in some floating point systems that can be accurately represented in more than one way (IEEE is bad about this, it is a horrible floating point spec to start with, so expect headaches). No different here 1/3 is not EQUAL to the number on your calculator 0.3333333, no matter how many 3's there are to the right of the decimal point. It is or can be close enough but is not equal. so you would expect something like 2*1/3 to not equal 2/3 depending on the rounding. Never use equal with floating point.

如果你用浮点数做一个足够大的数(它可以做指数),那么小数点前也会不精确。所以我不认为你的问题是完全正确的,因为前提是错误的;移位10并不总是会产生更高的精度,因为在某些情况下,浮点数将不得不使用指数来表示数字的大小,这样也会失去一些精度。

分数和整数可以构成比例尺。有些分数,如1/7,如果没有很多很多的小数,就不能用十进制形式表示。因为浮点数是基于二进制的,所以特殊情况会发生变化,但同样的精度问题也会出现。

BCD -二进制编码的十进制-表示是精确的。它们不是很节省空间,但在这种情况下,这是为了准确性而必须做出的权衡。

我很惊讶居然没有人说过:使用连分式。任何有理数都可以用二进制有限地表示。

一些例子:

1/3 (0.3333...)

0; 3

5/9 (0.5555...)

0; 1, 1, 4

10/43 (0.232558139534883720930...).

0; 4, 3, 3

9093/18478 (0.49209871198181621387596060179673...).

0; 2, 31, 7, 8, 5

从这里开始,有多种已知的方法可以在内存中存储整数序列。

除了精确地存储数字外,连分式还有其他一些好处,比如最佳有理逼近。如果您决定提前终止连分式中的数字序列,则剩余的数字(当重新组合为分数时)将给出可能的最佳分数。这是如何找到圆周率的近似值的:

π的连分式:

3; 7, 15, 1, 292 ...

在1处终止序列,得到的分数是:

355/113

这是一个很好的有理近似。