首页 > 解决方案 > 如何用浮点数除大数?

问题描述

我有一些大数字(比如总共10000000位或更多)。因为我会失去精度,所以它们像字符串一样存储。让我们以一些“小”数字为例(一些数字也可以是整数):

a = 4782916578987656789087654678908765467417657489104.9486718490129876578
b = 657890876566567890.8765467890987654

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

。嗯,答案是7.270075858095143e+30

乘法: 3.1466371806949598e+66 等等。

理想的输出是完整的数字作为字符串,但具有给定的浮点精度,带有零和其余部分

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

我试过 decimals模块,但它不能处理大整数:class 'decimal.DivisionImpossible也许还有我不知道的其他东西。

有没有办法用标准库来做到这一点,或者至少numpy. 或者也许一些算法我也可以用 JavaScript 等其他语言重现?

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

标签: pythonstringfloating-pointlargenumberarbitrary-precision

解决方案


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}')

既然你想玩大数字,那么,你有它。

PS我正在尝试用数字写一个10 000 000数字,但我的文本编辑器不允许这样做......他们冻结了。


推荐阅读