1

在十进制(以 10 为底)中,1/3只能近似为 0.33333 重复。

二进制中的等价数字是多少,只能表示为近似值?

4

10 回答 10

5

0.1 就是这样一个例子,0.2 也是

这个问题也类似于这个其他 SO question,它已经有了很好的答案。

于 2009-11-04T15:23:51.353 回答
3

一个更好的问题是询问哪些数字可以用二进制精确表示。其他一切都只能近似或根本无法表示。

请参阅每位计算机科学家应了解的浮点运算知识

于 2009-11-04T15:24:46.750 回答
2

嗯,有无数的数字无法用这种表示法精确表示,但这里有一个:1/10。

于 2009-11-04T15:23:51.177 回答
2

我假设您的意思是询问哪些有理数可以使用有限表示以二进制表示。我是从你的十进制 1/3 的例子中推断出来的。事实是,如果您允许无限表示,则每个有理数都可以用二进制表示。但是,如果您只允许有限表示,那么这个问题只有从计算机科学的角度来看才是有趣的。我进一步假设您不是在询问特定的计算机表示(例如IEEE 754),而只是询问一般的位置表示。

当且仅当 的每个素因数除以时p/q,有理数(p, q) = 1可以表示为基数的有限表示。没有无理数在任何基础上都有有限表示。bqb

p/q特别是,有理数(p, q) = 1可以表示为二进制的有限表示,当且仅当 的每个素因数q除以2p/q也就是说,唯一在二进制中具有(p, q) = 1有限表示的有理数是q = 2^k对于某个非负整数的那些k。此外,所有这些有理数都可以用二进制的有限表示来表示。这些数字被称为二元有理数

于 2009-11-04T16:16:01.680 回答
1

对于整数 k 和整数 n ,每个数字都不能表示为 k/2^n。

找到所有这些数字的简单方法是写下一些不包括 2 的素数。3、5、7、11、13、17 和 19 是不包括 2 的素数的好例子。

开始倍增。1/3、2/3、1/5、2/5、3/5、4/5、1/6、5/6、1/7、2/7等

如果你这样做 - 并且你避免了 k/2^n 形式的数字 - 你将枚举不能以二进制精确表示的每个可能的分数。

当您遇到最左边的 64 位都相同的数字时,您可能应该停止枚举。

于 2009-11-04T16:00:22.857 回答
1

可以以 2 为底数精确表示的数字是二元有理数。对于某个整数 k 和整数 n,这些数字可以写成 k/2^n 的形式。任何不能写成这种形式的数字都将在基数 2 中具有非终止表示。

但是,您似乎不是在问什么数字可以以基数 2 表示,而是什么数字可以在某些固定浮点类型中表示,例如floator double。这是一个更微妙的问题;任何不是二元有理数都不能表示,但也不是所有二元有理数都可以表示。

于 2009-11-04T16:03:34.877 回答
0

在 python 2.4 中:

>>> 1.0 / 5.0
0.20000000000000001

这表明基数 2 很难准确地表示它。

于 2009-11-04T15:24:00.167 回答
0

二进制(.00011001100110011...)==十进制(.1)

于 2009-11-04T15:24:25.317 回答
-2

我要尝试无限

于 2009-11-04T15:23:41.847 回答
-2

不能以 10 为底数精确表示的同一组数字不能以 2 为底数精确表示。那里不应该有区别。

于 2009-11-04T15:25:20.797 回答