在十进制(以 10 为底)中,1/3
只能近似为 0.33333 重复。
二进制中的等价数字是多少,只能表示为近似值?
0.1 就是这样一个例子,0.2 也是
这个问题也类似于这个其他 SO question,它已经有了很好的答案。
一个更好的问题是询问哪些数字可以用二进制精确表示。其他一切都只能近似或根本无法表示。
嗯,有无数的数字无法用这种表示法精确表示,但这里有一个:1/10。
我假设您的意思是询问哪些有理数可以使用有限表示以二进制表示。我是从你的十进制 1/3 的例子中推断出来的。事实是,如果您允许无限表示,则每个有理数都可以用二进制表示。但是,如果您只允许有限表示,那么这个问题只有从计算机科学的角度来看才是有趣的。我进一步假设您不是在询问特定的计算机表示(例如IEEE 754),而只是询问一般的位置表示。
当且仅当 的每个素因数除以时p/q
,有理数(p, q) = 1
可以表示为基数的有限表示。没有无理数在任何基础上都有有限表示。b
q
b
p/q
特别是,有理数(p, q) = 1
可以表示为二进制的有限表示,当且仅当 的每个素因数q
除以2
。p/q
也就是说,唯一在二进制中具有(p, q) = 1
有限表示的有理数是q = 2^k
对于某个非负整数的那些k
。此外,所有这些有理数都可以用二进制的有限表示来表示。这些数字被称为二元有理数。
对于整数 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 位都相同的数字时,您可能应该停止枚举。
可以以 2 为底数精确表示的数字是二元有理数。对于某个整数 k 和整数 n,这些数字可以写成 k/2^n 的形式。任何不能写成这种形式的数字都将在基数 2 中具有非终止表示。
但是,您似乎不是在问什么数字可以以基数 2 表示,而是什么数字可以在某些固定浮点类型中表示,例如float
or double
。这是一个更微妙的问题;任何不是二元有理数都不能表示,但也不是所有二元有理数都可以表示。
在 python 2.4 中:
>>> 1.0 / 5.0
0.20000000000000001
这表明基数 2 很难准确地表示它。
二进制(.00011001100110011...)==十进制(.1)
我要尝试无限
不能以 10 为底数精确表示的同一组数字不能以 2 为底数精确表示。那里不应该有区别。