有几个关于浮点表示法的问题被提交给了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.0。考虑一下:

浮动a = 60; 浮动b = 0.1; c = a + b * 10;

c的值是多少?它不是61,因为b不是。1因为。1不是精确的二进制表示。

其他回答

重复一下我在给斯基特先生的评论中所说的话:我们可以用十进制表示1/3、1/9、1/27或任何有理数。我们通过添加一个额外的符号来实现。例如,在数字的十进制展开中重复的数字上的一行。将十进制数表示为二进制数序列所需要的是1)一个二进制数序列,2)一个基数点,以及3)一些其他符号来表示序列的重复部分。

赫纳的引用符号就是一种方法。他用引号表示序列中重复的部分。文章地址:http://www.cs.toronto.edu/~hehner/ratno.pdf,维基百科词条:http://en.wikipedia.org/wiki/Quote_notation。

并没有说我们不能在表示系统中添加一个符号,所以我们可以用二进制引号表示十进制有理数,反之亦然。

问题是你并不知道这个数字是否真的是61.0。考虑一下:

浮动a = 60; 浮动b = 0.1; c = a + b * 10;

c的值是多少?它不是61,因为b不是。1因为。1不是精确的二进制表示。

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

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

根(数学)原因是,当你处理整数时,它们是可数无限的。

这意味着,即使它们的数量是无限的,我们也可以“数出”序列中的所有项目,而不会跳过任何一项。这意味着,如果我们想要在列表中的第610000000000000th位置上得到一项,我们可以通过一个公式来计算它。

然而,实数是无限的。你不能说“给我位置610000000000000的真实数字”并得到一个答案。原因是,即使在0到1之间,当考虑浮点值时,也有无限个值。这同样适用于任何两个浮点数。

更多信息:

http://en.wikipedia.org/wiki/Countable_set

http://en.wikipedia.org/wiki/Uncountable_set

更新: 很抱歉,我似乎误解了这个问题。我的回答是关于为什么我们不能表示每一个真实的值,我没有意识到浮点数被自动归类为理性。