Python中C double的限制

3
我知道Python可以处理任意大的整数,那么为什么在使用科学计数法时它不会给我一个任意大的整数呢?为什么1e23和10**23有所不同?
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> for x in range(30):
...   x1 = eval('long(1e{})'.format(x))
...   x2 = eval('long(1{})'.format('0' * x))
...   print x1, 'OK' if x1 == x2 else 'YUCK!'
... 
1 OK
10 OK
100 OK
1000 OK
10000 OK
100000 OK
1000000 OK
10000000 OK
100000000 OK
1000000000 OK
10000000000 OK
100000000000 OK
1000000000000 OK
10000000000000 OK
100000000000000 OK
1000000000000000 OK
10000000000000000 OK
100000000000000000 OK
1000000000000000000 OK
10000000000000000000 OK
100000000000000000000 OK
1000000000000000000000 OK
10000000000000000000000 OK
99999999999999991611392 YUCK!
999999999999999983222784 YUCK!
10000000000000000905969664 YUCK!
100000000000000004764729344 YUCK!
1000000000000000013287555072 YUCK!
9999999999999999583119736832 YUCK!
99999999999999991433150857216 YUCK!
2个回答

5

1e23 被解释为浮点数,而 10**23 是一个整数的整数次幂(即一个整数)


1
是的。<num>e<num>总是被解析为浮点数。 - mgilson
当然可以,但这仍然无法解释巨大的不平等。 - inspectorG4dget
2
@inspectorG4dget -- 为什么不呢?因为浮点数之间的间距不是恒定的(随着数字变得更大而增加),在某个点上,数字之间的间距变得>1,你无法再表示那个整数。它增长得非常快...所以很快就会出现这样的不等式。 - mgilson
浮点双精度的精度也有限制。Python是用C语言编写的,因此受平台限制。这句话可以理解为mgilson已经说过的话的另一种表述方式。 - jim mcnamara
@jimmcnamara CPython是用C语言编写的 - wim

3
Python浮点类型使用本地系统架构进行计算 - 通常是64位浮点数,如此定义:http://www.ee.unb.ca/tervo/ee6373/IEEE64.htm。我不确定它是否可以默认使用其他浮点数据类型进行构建 - 但我知道如果Python运行的体系结构在F>p>数字处理方面具有特殊性,那么这些特殊性将显示在Python中 - 因此,在x86硬件上运行的Python程序与在PPC、ARM或其他CPU上运行的程序可能存在差异。
然而,如果您想在Python中使用任意精度的十进制数,则可以使用Decimal模块实现。就最近发布的Python 3.3而言,使用Decimal数字的速度与本机浮点数相当(在Python程序内部 - 能够使用F.P.加速的本机代码,如SIMD指令,将更快)。

“与本机浮点数相当” - 无论如何,它与用C编写的十进制浮点数相当。如果新的“decimal”模块可以像本机固定宽度浮点数一样快速地执行任意精度浮点运算,那么CPU制造商应该注意了! - Steve Jessop
我所指的新十进制数在Python中与浮点数相比较(慢了约30%) - 如果您在C中进行浮点运算,速度会更快。 - jsbueno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接