首页 > 解决方案 > 在 Python 中使用更多小数

问题描述

我已经有一个代码,它使用二分法来确定某物的值,问题是我需要一个如此精确的值,超过 15 位小数,并且在某些时候 python 停止获得更小的数字

我知道 Decimals 库,但我真的必须将代码中的每个参数重写为 Decimals(parameter) 吗?因为我有很多参数

有没有办法将代码中的每个浮点数普遍转换为小数?或者有没有办法用不同的方式一起解决这个问题?

62.5
31.25
15.625
23.4375
27.34375
25.390625
26.3671875
25.87890625
25.634765625
25.7568359375
25.81787109375
25.787353515625
25.7720947265625
25.76446533203125
25.760650634765625
25.758743286132812
25.75969696044922
25.759220123291016
25.758981704711914
25.758862495422363
25.758802890777588
25.758832693099976
25.75881779193878
25.75882524251938
25.75882151722908
25.75882337987423
25.758824311196804
25.75882477685809
25.758825009688735
25.758825126104057
25.758825184311718
25.758825155207887
25.758825140655972
25.758825133380014
25.758825137017993
25.758825138836983
25.758825139746477
25.758825140201225
25.75882513997385
25.758825139860164
25.75882513980332
25.7588251397749
25.75882513978911
25.758825139796215
25.758825139792663
25.758825139790886
25.758825139791774
25.75882513979222
25.758825139792442
25.75882513979233
25.758825139792386
25.758825139792414
25.7588251397924
25.758825139792407
25.758825139792403
25.758825139792407
25.758825139792407
25.758825139792407
25.758825139792407
25.758825139792407
25.758825139792407
25.758825139792407

您会在某个时候看到 Python 停止更改值,因为它不计算较小的数字

谢谢你

标签: pythondecimal

解决方案


例如float,Python 使用机器级双精度浮点数(double用 C 术语表示)。这究竟是什么取决于构建 Python 的平台和编译器。如今,它很可能是一个64 位双精度二进制浮点数。53 位有效数字提供 15 到 17 个有效十进制数字。

如果使用numpy,则可以使用long double浮点数。这有一个 64 位的有效数字,产生 大约 18 个十进制数字

Decimal数值具有可调精度。默认情况下,它是 28 位有效数字,但您可以更改它。因此,如果您可以使用标准的数学运算符和Decimal支持的有限数量的数学函数,那么更改为 Decimal 可能是一个不错的选择。但这确实意味着更改所有代码。它是标准库的一部分,这可能是一个加号。

或者,您可以查看mpmath库。这也允许您设置任意精度(默认为 15 个有效数字)。它支持比Decimal. 它实现了和更多的所有math功能cmath。但是在这里,您还必须将整个程序转换为更改floatmpf类型。默认情况下,mpmath 在内部使用整数。如果可用,mpmath 使用 Python 绑定到gmp库,这使其速度更快,尤其是在高精度(>100 位)下。

结论

如果您想要更高的精度,则必须将程序转换为使用任意精度的数学模块。根据math您使用的功能数量,mpmath看起来更合适;它支持所有功能mathcmath然后是一些。

如何转换

floatto mpf(or Decimal) 类型的完全自动转换是不可能的。但是你可以到达那里的大部分路。

两者都Decimal支持mpf标准数学运算符。所以你不应该改变这些。您确实需要查看创建输入浮点数的位置以及使用math.

首先,将所有实例更改float(Decimal(mpf(。这会处理显式创建的数字。其次,搜索所有浮点文字并以相同的方式替换它们。您可以为此使用编辑器的搜索和替换功能,也可以为此编写一个小的 Python 脚本。所以这在很大程度上可以自动化。

然后查看从源(例如文件或数据库)读取数据的所有函数,并更新它们。这可能必须手动完成,除非这些明确使用float(),在这种情况下,它们由上述方法处理。

如果您当前正在使用该math模块,则必须在所选模块中搜索和替换这些功能。在这种情况下,搜索部分可以很容易地自动化。如果您使用过import math,您可以轻松搜索“ math.”找到需要替换的功能。在这种情况下使用时mpmath,您可以简单地将“ math.”替换为“ mpmath.”,因为mpmath实现了所有功能math。如果你使用过from math import x, y, z,则需要分别搜索 x、y 和 z。您甚至可以编写一个脚本来将函数转换为它们在ormath中的等价物。是否值得这样做取决于代码库的大小和复杂性。Decimalmpf


推荐阅读