如何在python中将非常大的数字求和为1
想象一下我有如何在python中将非常大的数字求和为1,python,python-3.x,precision,Python,Python 3.x,Precision,想象一下我有 >>> a = 725692137865927813642341235.00 如果我这样做 >>> sum = a + 1 然后呢 >>> sum == a True 这是因为a大于某个阈值 是否有类似于logsumexp的技巧来执行此操作 PS:a是一个np。float64是否将a除以100000,然后加1,然后再次备份? 例如 如果a必须是特定类型的float,则不可能。事实上,不精确性要大得多: >>&g
>>> a = 725692137865927813642341235.00
如果我这样做
>>> sum = a + 1
然后呢
>>> sum == a
True
这是因为a大于某个阈值
是否有类似于logsumexp
的技巧来执行此操作
PS:
a
是一个np。float64
是否将a除以100000,然后加1,然后再次备份?
例如
如果
a
必须是特定类型的float
,则不可能。事实上,不精确性要大得多:
>>> a = 725692137865927813642341235.00
>>> a + 10000 == a
True
但是,还有其他数据类型可用于表示(几乎)任意精度值或精度
(注意:当然,执行Decimal(a)
或Fraction(a)
并不能神奇地恢复a
已经丢失的精度;如果要保留该精度,应将完整值作为字符串传递。)0)导入Decimal
1) 设置
decimal.getcontext()
(.prec
属性)的适当精度2) 声明为decimal.decimal()实例
>>> import decimal
>>> decimal.getcontext().prec
28
>>> decimal.getcontext().prec = 300
>>> dec_a = decimal.Decimal( '725692137865927813642341235.0' )
对于非常扩展的数值精度求解器,使用十进制模块是一种乐趣
奖金: Decimal模块有非常强大的上下文方法,它们保留了Decimal模块的优点。add(),,,
,,,,,,,,,,
从而真正构建一个几乎无限精度的求解器方法
绝对值得掌握这些decimal.getcontext()
方法-您的解算器在精度和未降级的收敛级别上进入另一个联盟。如果这些是int
eger,请使用int
。在Python-3.x中,int
s具有任意大小。谢谢@WillemVanOnsem,但是a需要是一个浮点数。不可能有技巧——对于足够大的N值,Python float不能同时表示N和N+1。唯一的“技巧”可能是使用不同的数据类型:int
或decimal。例如,decimal
。a
必须是某种浮点/十进制值,还是必须是类型float
?请尝试打印a
。看看你从725692137865927813642341235.00==72569213786592780000000000.00得到了什么。这不加1,它加100000。这不起作用,因为浮点数的尾数位数是固定的。相乘只会改变指数。这只是我的一个想法。在将a
转换为浮点数后再将其转换为小数点之前,您将失去精度。。这是正确的:decimal.decimal(725692137865927813642341235.00)=decimal.decimal(725692137865927813642341236.00)
>>> d = decimal.Decimal(a)
>>> d + 1 == d
False
>>> f = fractions.Fraction(a)
>>> f + 1 == f
False
>>> import decimal
>>> decimal.getcontext().prec
28
>>> decimal.getcontext().prec = 300
>>> dec_a = decimal.Decimal( '725692137865927813642341235.0' )