如何在python中存储大于1*10^310的浮点数?

2024-09-27 00:16:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个程序,输出一个大矩阵的条件数,所以我使用幂法来获得最大特征值,但值是大于1*10^310的大数(浮点),最后值变成“无穷大”,我尝试了十进制模块,但它是相同的。如何存储这些大的浮点值?或者另一种使用较短值的方法? (我不允许使用任何以Numpy形式显式帮助进程的模块)


Tags: 模块方法程序numpy进程矩阵条件形式
2条回答

您想使用decimal模块:

from decimal import Decimal

x = Decimal('1.345e1310')
y = Decimal('1.0e1310')
print(x + y)

结果:

2.345E+1310

如果可以的话,不要使用浮点值;它们很难推理,会咬你的

每当你尝试使用浮点,特别是那些有大量数字的浮点时,你应该考虑如何将它转换成整数范围,如果你的值的浮动部分超出了/P>>的无效或不必要的精度。

  • 可能是一个更大的int,如10**40010**100000,这应该为浮点数字提供足够的空间,同时允许您在整数空间中工作
  • 直接转换或缩小比例,丢弃小数点以外的数字(考虑测量的准确度)
>>> int(1.0 * 10) * 10**999  # divide off 10**690 later or note in units
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>>> int(1.0 * 10**10)  # multiply by 10**300 later or note in units
10000000000

实际上,这就是为什么你需要科学记数法——如果你不需要的话,不要存储数据及其所有数字,保留你需要的最小数量和第二个乘数作为大小因子(科学记数法确实使用浮点,但对于整数的想法是一样的)

然后,您可以在完成数学运算(甚至将它们单独相乘)后回忆起乘法器,而不是使用浮点运算

甚至可以以某种常规方式完全删除大部分数字,并在使用数据的人或任何人的后计算单位中显示系数


虽然这个问题是关于大数字的,但不幸的是,即使是decimal.Decimal也不能像人们所期望的那样处理小的浮点位,因为它们在存储方式上存在一些别名

https://en.wikipedia.org/wiki/Floating-point_arithmetic#IEEE_754:_floating_point_in_modern_computers

这对于普通的python浮动是有问题的,因此扩展到了Decimal,甚至是您在正常使用中可能看到的大小

>>> 9007199254740993.0
9007199254740992.0
>>> Decimal(9007199254740993.0)  # NOTE converted to float before Decimal
Decimal('9007199254740992')

改编自Which is the first integer that an IEEE 754 float is incapable of representing exactly?

原问题的例子

>>> a = Decimal(10**310) * Decimal(1.0)
>>> b = Decimal(1)
>>> a + b - a
Decimal('0E+283')

进一步的例子

>>> a = Decimal(10**310)
>>> b = Decimal(0.1)
>>> a + b - a
Decimal('0')
>>> a
Decimal('10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')
>>> b
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> 10**-100
1e-100
>>> Decimal(10**-100)
Decimal('1.00000000000000001999189980260288361964776078853415942018260300593659569925554346761767628861329298958274607481091185079852827053974965402226843604196126360835628314127871794272492894246908066589163059300043457860230145025079449986855914338755579873208034769049845635890960693359375E-100')
>>> 10**-1000
0.0
>>> Decimal(10**-1000)
Decimal('0')

相关问题 更多 >

    热门问题