C在python中的双重限制

C在python中的双重限制,python,c,integer,double,long-integer,Python,C,Integer,Double,Long Integer,我知道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('l

我知道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!

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

Python浮点类型使用系统体系结构固有的数字进行计算-通常是此处定义的64位浮点: 我不确定默认情况下它是否可以使用其他浮点数据类型进行构建——但我知道,如果Python运行的体系结构在F>p>数字处理方面具有特殊性,那么这些特性将在Python中显示出来——因此,在x86硬件上运行的Python程序可能与在PPC、ARM或其他CPU上运行的Python程序有所不同


但是,如果希望在Python中使用任意精度的十进制数,则可以使用模块decimal。从最近发布的Python 3.3开始,十进制数的速度与本机浮点数的速度相当(在Python程序中-能够使用F.P.加速的本机代码,如SIMD指令,速度会快得多)

yep
e
总是被解析为一个浮点数。当然可以,但这仍然不能解释这个巨大的错误inequality@inspectorG4dget”“为什么不呢?由于浮点数之间的间距不是恒定的(它随着数字变大而增加),因此在某个点上,数字之间的间距变为>1,并且您不能再表示该整数。它增长很快。。。很快就会得到这样的不等式,浮点双精度也是有限制的。Python是用C编写的,因此受到平台限制的限制。这是说明mgilson已经说过的话的另一种方式。@jimmcnamara CPython是用C写的“与本机浮点数相当”——无论如何,与用C写的十进制浮点数相当。如果新的
decimal
模块可以以与本机固定宽度浮点一样快的速度实现任意精度浮点,那么CPU制造商应该注意!我的意思是,新的十进制可以与Python中的浮点相媲美(大约慢30%),如果用C语言编写浮点,速度会快得多。