gpt4 book ai didi

Python 浮点精度格式说明符

转载 作者:太空狗 更新时间:2023-10-29 20:20:29 25 4
gpt4 key购买 nike

假设我有一些 32 位数字和一些 64 位数字:

>>> import numpy as np
>>> w = np.float32(2.4)
>>> x = np.float32(4.555555555555555)
>>> y = np.float64(2.4)
>>> z = np.float64(4.555555555555555)

我可以用 %f 打印出来,但它有额外的、不需要的小数:

>>> '%f %f %f %f' % (w, x, y, z)
'2.400000 4.555555 2.400000 4.555556'

我可以使用 %g 但它的默认精度似乎很小:

>>> '%g %g %g %g' % (w, x, y, z)
'2.4 4.55556 2.4 4.55556'

我在想我应该为 32 位值使用 .7 之类的东西,为 64 位值使用 .15 之类的东西:

>>> '%.7g %.7g %.15g %.15g' % (w, x, y, z)
'2.4 4.555555 2.4 4.55555555555556'

这似乎工作得相当好,但精度数也用于小数点前的数字,例如34567.375768.

总而言之,将浮点值序列化为文本的正确方法是什么,以便为 32 位和 64 位值保留适当的精度,但不使用任何不必要的空间?

更新:

认为输出应该是什么的例子:

number                float32     float64
5 5 5
0.1 0.1 0.1
2.4 2.4 2.4
4.555555555555555 4.5555553 4.5555555555555554
12345678.92345678635 12345679.0 12345678.923456786

我用 .7/.16 得到了什么。这实际上看起来不错:

>>> v32 = np.array([5, 0.1, 2.4, 4.555555555555555, 12345678.92345678635], dtype=np.float32)
>>> v64 = np.array([5, 0.1, 2.4, 4.555555555555555, 12345678.92345678635], dtype=np.float64)
>>> ('%.7g ' * len(v32)) % tuple(v32)
'5 0.1 2.4 4.555555 1.234568e+07 '
>>> ('%.16g ' * len(v64)) % tuple(v64)
'5 0.1 2.4 4.555555555555555 12345678.92345679 '

最佳答案

您可以尝试使用 np.finfo 函数来获取与您的 float 相对应的精度

finfo32 = np.finfo(np.float32)
finfo64 = np.finfo(np.float64)

finfo32.resolution = 1e-6
finfo64.resolution = 1e-15

现在您知道您想要多少位小数,比如 6,只需使用 rstrip("0") 来去除不必要的 0:

print ("%.6f" % your_float).strip("0")

如果您倾向于 %g,也许您可​​能想要使用动态格式,例如:

>>> strf = lambda v: ("%%.%ig" % max(np.ceil(np.log10(v)), 7)) % v
>>> strf(123.456789)
'123.45679'
>>> strf(123456789.12345)
'123456789'

关于Python 浮点精度格式说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12485005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com