为何`print(np.half(500.2))`与`print(f"{np.half(500.2)}")`输出不同?
numpy.float16两种打印输出差异的原因
你观察到的print(np.half(500.2))输出500.2、f"{np.half(500.2)}"输出500.25的差异,本质是numpy对float16对象的两种字符串生成逻辑不同:
1. 直接print的输出逻辑
当你直接执行print(np.half(500.2))时,numpy调用的是float16类的__str__方法。这个方法的设计目标是尽可能贴近用户输入的原始数值,而非严格输出该float16实际存储的二进制对应值。即便500.2无法被float16精确表示,__str__仍会优先展示用户输入的近似值,所以结果是500.2。
2. f-string的输出逻辑
f-string(包括str.format)会触发float16的__format__方法,或者先将float16转换为更高精度的float64,再按照标准浮点数格式化规则输出该float16实际存储的精确值。由于float16只有10位尾数,精度有限,500.2无法被精确编码,最接近的可表示值是500.25,因此f-string会输出这个真实存储的数值。
验证:float16的真实存储值
正如你在C++中用half.hpp验证的结果,以及二进制分析的结论:
- 500.0对应的
float16二进制为0b0_10111_1111010000(1位符号位+5位指数位+10位尾数位) - 下一个相邻的
float16数值是0b0_10111_1111010001,对应十进制的500.25——这正是500.2转换为float16后实际存储的值。
内容的提问来源于stack exchange,提问作者Cestimium
相关产品推荐
相关产品推荐

