大家。我最近一直在学习浮点截断错误。但我发现
print(np.half(500.2))
和 print(f"{np.half(500.2)}")
会产生不同的结果。这是我在 IPython 中获得的日志。
In [11]: np.half(500.2)
Out[11]: np.float16(500.2)
In [12]: print(np.half(500.2))
500.2
In [13]: print(f"{np.half(500.2)}")
500.25
half.hpp
来与numpy比较结果。看来 500.2
应该被截断为 500.25
而不是它本身。0b0_01000_1111010000
。所以下一个 float16 数字应该是 0b_01000_1111010001
,十进制格式是 500.25。那么,是什么让
print(np.half(500.2))
与 print(f"{np.half(500.2)}")
不同呢?希望看到您的答复。
print
调用 __str__
,而 f 字符串调用 __format__
。具有空格式规范的 __format__
通常相当于 __str__
,但并非所有类型都以这种方式实现它,并且 numpy.half
是实现不同行为的类型之一:
In [1]: import numpy
In [2]: x = numpy.half(500.2)
In [3]: str(x)
Out[3]: '500.2'
In [4]: format(x, '')
Out[4]: '500.25'