Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中将非常大的数字求和为1_Python_Python 3.x_Precision - Fatal编程技术网

如何在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' )