如何用浮点数除大数?

时间:2019-07-18 00:31:21

标签: python string floating-point largenumber arbitrary-precision

我有一些数字(例如总计 10000000 个数字或更多)。由于我会失去精度,它们像 strings 一样存储。 让我们以一些“小”数字为例(一些数字也可以是整数):

a = 4782916578987656789087654678908765467417657489104.9486718490129876578
b = 657890876566567890.8765467890987654

我想对它们进行一些操作。

部门。好吧,答案是7.270075858095143e+30

乘积: 3.1466371806949598e+66 依此类推。

理想的输出是 全数字作为字符串 ,但是具有给定精度,用于浮点数转换为零和休止符

示例:
888888888888.23 / 2.5122217 == 353825814373.082590504959329565857965
(“点”后的24位数字)

我已经尝试过 decimals模块,但是它不能处理大整数:class 'decimal.DivisionImpossible以及其他我不知道的东西。

有没有一种方法可以使用 standard 库,或者至少使用numpy库。也许还有一些算法,我还可以用其他语言(如JavaScript)重现?

注意:我知道我可以使Decimal.getcontext().prec = 8888888888888或更大,但是计算将花费更多时间,如果数字分别为1和1.7373,我需要在上面浪费资源吗?而且,它不仅不用于“浮点”数字,而且还用于整数的精度。

1 个答案:

答案 0 :(得分:1)

decimal模块是您的朋友。如果您想疯狂,那么...

import decimal
from decimal import Decimal
import sys

c = decimal.getcontext()
c.prec = 899_999_768
c.Emax = decimal.MAX_EMAX
c.Emin = decimal.MIN_EMIN

a = Decimal('149846549e500000')
b = Decimal('254984984e449')

d = a / b
f = a * b

请记住,c.prec为您提供了打印时所显示的位数。根据文档,最大数量为999999999999999999,并且您必须绑定到计算机的内存中。以我的情况(实际上是我的计算机)来说,c.prec是一个很好的数字,可以防止计算机崩溃。

如果打印结果,会发生什么?

print(f'{d}')
print(f'{f}')

既然你想和很多人一起玩,那么就在那里。

P.S。我试图用10 000 000位数字写数字,但是我的文本编辑器不允许...它们冻结。