假设我有一些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 '
"%.3f" % z
-> '4.556',"%.3f" % q
-> '2131234.556' 这段代码有什么问题? - Dr. Jan-Philip Gehrcke