2013-12-21 110 views
2

我需要编写一个计算数学公式的简单程序。 这里唯一的问题是其中一个变量可以取值10^100。 因此,我不能用C++/C编写这个程序(我不能使用像gmp这样的外部库)。 几个小时前,我读到Python能够计算出这样的值。 我的问题是:为什么 处理非常大的数字

print("%.10f"%(10.25**100)) 

被返回的数量"118137163510621843218803309161687290343217035128100169109374848108012122824436799009169146127891562496.0000000000"

代替 "118137163510621850716311252946961817841741635398513936935237985161753371506358048089333490072379307296.453937046171461"

+0

再说下面的答案,还有你的字符串格式代码的问题。您特别要求小数点后10位数字。为什么你会期望输出15位数字?另外,请记住,使用'%'进行打印*实际上会根据说明符转换*值。因此,即使使用'decimal'模块,如果使用'%.10f'打印它,Python将首先将该值转换为'float',并且您仍然会得到相同的结果。 –

+0

仅供参考,Python浮点数与C双精度浮点数相同,并具有5​​3位精度(几乎在所有平台上)。那大约有16或17位十进制数字。这就是为什么你显示的两个结果在它们开始时的许多小数位后不同意。 –

回答

5

默认情况下,Python使用固定精度的浮点数据类型来表示小数(就像C中的double一样)。你可以用precise rational numbers工作,虽然:

>>> from fractions import Fraction 
>>> Fraction("10.25") 
Fraction(41, 4) 
>>> x = Fraction("10.25") 
>>> x**100 
Fraction(189839102486063226543090986563273122284619337618944664609359292215966165735102377674211649585188827411673346619890309129617784863285653302296666895356073140724001, 1606938044258990275541962092341162602522202993782792835301376) 

您也可以使用decimal模块,如果你想任意精度的小数(仅数字,是因为有限小数支持可表示,虽然):

>>> from decimal import * 
>>> getcontext().prec = 150 
>>> Decimal("10.25")**100 
Decimal('118137163510621850716311252946961817841741635398513936935237985161753371506358048089333490072379307296.453937046171460995169093650913476028229144848989') 
+0

你可能打算显示'decimal'模块,而不是... – Bakuriu

+2

@Bakuriu:完全没有。 “小数”不能代表任意的有理数。 –

+0

我已经知道了,但OP可能不需要表示任意有理数,但是具有一定精度的数字。 “decimal”是这个的正确工具。 “小数”可以是*数量级*比使用“分数”更快。唯一的限制是你必须有一些数字的已知界限(你可以在大部分时间完成)并设置正确的上下文。 – Bakuriu

2

Python能够处理任意大的整数,但不能处理浮点值。他们可以变得相当大,但正如你注意到的,你失去了低位精度。