python - 如何用浮点数除大数?
问题描述
我有一些大数字(比如总共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,我需要在上面浪费资源吗?它也是整数的精度,而不仅仅是“浮动”数字。
解决方案
该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
数字,但我的文本编辑器不允许这样做......他们冻结了。
推荐阅读
- elasticsearch - 我可以提高摄取管道 GROK 模式的性能吗?
- r - 我可以使用字符串来调用 R 中的变量吗
- javascript - Reactjs Array.prototype.map 返回未定义
- php - MySQL 使用绑定查询从参数化列表中删除仅删除列表中的第一个条目
- mysql - 我的 SQL - 从表中不存在的 where 子句列表返回 rolls/ids?
- javascript - 是否可以优先考虑类型定义文件的顺序或排除它们?
- a2lix-translation - 如何编写和解析a2l文件
- java - Junit assertThat 比较 JsonObject
- sql - 如何在 bigquery SQL 中即时生成 UID?
- ruby-on-rails - Select2 在编辑时获取多个选定的选项