`print(np.half(500.2))` 与 `print(f"{np.half(500.2)}")` 有何不同

问题描述 投票:0回答:1

大家。我最近一直在学习浮点截断错误。但我发现

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
  1. 我在c++中使用
    half.hpp
    来与numpy比较结果。看来
    500.2
    应该被截断为
    500.25
    而不是它本身。
  2. 在二进制格式中,500.0 是
    0b0_01000_1111010000
    。所以下一个 float16 数字应该是
    0b_01000_1111010001
    ,十进制格式是 500.25。

那么,是什么让

print(np.half(500.2))
print(f"{np.half(500.2)}")
不同呢?希望看到您的答复。

python numpy half-precision-float
1个回答
0
投票

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'
© www.soinside.com 2019 - 2024. All rights reserved.