为何tf.linspace()返回长小数?TensorFlow与NumPy结果差异咨询
为什么TensorFlow的linspace会返回近似小数,而NumPy不会?
这其实是浮点数精度特性和两个库默认数据类型差异导致的典型问题,咱们掰开揉碎了说:
1. 两者默认用的浮点数精度不一样
NumPy的linspace默认采用float64(双精度浮点数),而TensorFlow的tf.linspace默认是float32(单精度浮点数)。双精度能提供远高于单精度的存储精度,能更接近我们想要的十进制精确值。
2. 十进制小数在二进制里不一定能精确表示
像0.6这种十进制数,转换成二进制是无限循环的:0.100110011001...。而浮点数的存储位数是有限的:
float32只有23位有效二进制位,只能截取一段循环值来近似存储,结果就会变成0.60000014或者-0.5999999这种看起来“奇怪”的数;float64有52位有效位,近似误差极小,打印时会被自动格式化成我们直观预期的0.6。
3. 验证:统一数据类型后结果一致
如果你给TensorFlow指定float64类型,输出就和NumPy完全一样了:
import tensorflow as tf print(tf.linspace(-3.0, 3.0, 11, dtype=tf.float64))
输出:
tf.Tensor([-3. -2.4 -1.8 -1.2 -0.6 0. 0.6 1.2 1.8 2.4 3. ], shape=(11,), dtype=float64)
4. 关于打印显示的小细节
NumPy的float64结果误差太小,打印时会被自动四舍五入成我们熟悉的十进制数;而float32的误差刚好没被格式化掉,所以就露出了“真面目”——本质上两者都是浮点数近似,只是精度不同导致显示效果有差异。
内容的提问来源于stack exchange,提问作者Hu Xixi
相关产品推荐
相关产品推荐

