You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何`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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:14:59