Python3 大浮点数的停止除法
Posted
技术标签:
【中文标题】Python3 大浮点数的停止除法【英文标题】:Python3 Stop division for large floats 【发布时间】:2017-01-15 23:09:45 【问题描述】:我正在划分非常大的整数,可以说是 1kb 整数,我已经遇到了 2 个问题。要么
溢出错误:整数除法结果对于浮点数来说太大
或者浮点数被四舍五入到一些数字,当我尝试乘回来时,我得到一个稍微不同的数字。
在 python 中有什么方法可以防止分割小数点后超过 20 位的浮点数?
smallest_floats = []
n1 = int(input())
n2 = int(input())
while n2 != 1:
smallest_floats.append(str(n1/n2))
n2 -= 1
print(min(smallest_floats, key=len))
我认为可能的解决方案是以某种方式断言分裂或:
len(s.split(".")[-1]) > 20
【问题讨论】:
您是否尝试过使用decimal
包?或者如果你想要整数除法,如果你使用//
而不是/
会发生什么?
python 中的浮点数是通常的 64 位双精度浮点数。对于您想要做的事情,您需要导入一个多精度包。 Scipy 或 Sympy 可能有类似的东西。
我需要复制数字,所以我需要浮点数。
查看fractions 包,了解有理数的算术运算。
或者您可以使用Fraction
来避免丢失任何精度...
【参考方案1】:
对于没有精度损失的有理数算术,您可以使用fractions package 中的fractions.Fraction
类。您可以除以另一个有理数,然后再乘以它,以获得与开始时完全相同的有理数。
>>> from fractions import Fraction
>>> n1 = Fraction(large_numerator, denominator)
>>> n2 = n1 / some_rational_number
>>> assert n1 == n2 * some_rational_number
【讨论】:
U 最终使用了 Fraction,因为它在 95% 的情况下对我的情况更有效,解决方案是 Fractions。【参考方案2】:导入具有任意精度的decimal
模块(https://docs.python.org/2/library/decimal.html)
你可以增加显示的小数位数
>>> from decimal import *
>>> getcontext().prec = 100
>>> Decimal(2).sqrt()
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573') 100 decimal digits
how can i show an irrational number to 100 decimal places in python?
【讨论】:
如果必须精确复制原始整数,这不是最好的工具(尽管它可能在大多数情况下都有效)。请尝试以下操作:d1 = Decimal(1.0); d2 = d1 / Decimal(3.0); assert d1 == d2 * Decimal(3.0)
。这将引发AssertionError
,因为d2 * Decimal(3.0)
的计算结果为Decimal('0.9999999999999999999999999999')
。这里的重点是 Decimal
提供(几乎)任意精度 - 但不是 infinite 精度。
@a_guest 所以小数不是无限精确而分数是正确的?意思是使用分数模块我可以找回原来的?
@Adminy 是的Fraction
将有理数表示为分子和分母,因此可以精确地表示所有有理数(当然,只要它们的数字和分母适合记忆)。使用decimal
模块,您可以选择任意 精度,该精度(当然)不能是infinite(例如,您不能存储无限个小数位)。考虑示例1/3
:Fraction(1, 3)
是精确表示,而Decimal(1.0) / Decimal(3.0)
将在您指定的精度之后删除小数位。
我发现这个答案仍然很有用^^它也对我有帮助。以上是关于Python3 大浮点数的停止除法的主要内容,如果未能解决你的问题,请参考以下文章