为何np.log(np.exp(x))的结果与输入x不相等?
为什么np.log(np.exp())的返回值和输入不相等?
出现这种情况主要有两个核心原因:
1. 浮点数精度误差
计算机使用二进制浮点数存储数值,绝大多数十进制小数无法被精确表示(比如0.1)。当你对一个浮点数x执行np.exp(x)再np.log()的操作时,中间计算过程会引入微小的精度偏差,最终结果和原始x会有极细微的差异。直接用==做严格相等比较时,这种微小差异会被判定为不相等,返回False。
举个直观的例子:
import numpy as np x = 0.1 print(f"原始值: {x}") print(f"np.exp(x): {np.exp(x)}") print(f"np.log(np.exp(x)): {np.log(np.exp(x))}") print(f"直接比较结果: {x == np.log(np.exp(x))}") # 大概率返回False
解决这类问题的正确方式是使用np.allclose()函数,它会在一个可接受的误差范围内判断数值是否近似相等:
np.allclose(_temp['pct'].values, np.log(np.exp(_temp['pct'].values)))
该函数默认的相对误差容忍度是1e-05,绝对误差是1e-08,足以覆盖浮点数计算带来的微小偏差。
2. 极端值导致的溢出/下溢
当输入的数值是极大的正数时,np.exp(x)会溢出为inf(无穷大),此时np.log(inf)的结果还是inf,和原始的极大正数不相等;如果输入是极小的负数,np.exp(x)会下溢为0.0,np.log(0.0)的结果是-inf,同样和原始的极小负数不相等。这两种情况都会导致==比较返回False。
示例:
# 极大正数 x = 1000.0 print(f"np.exp(x): {np.exp(x)}") # 输出inf print(f"np.log(np.exp(x)): {np.log(np.exp(x))}") # 输出inf print(f"直接比较结果: {x == np.log(np.exp(x))}") # 返回False # 极小负数 x = -1000.0 print(f"np.exp(x): {np.exp(x)}") # 输出0.0 print(f"np.log(np.exp(x)): {np.log(np.exp(x))}") # 输出-inf print(f"直接比较结果: {x == np.log(np.exp(x))}") # 返回False
内容的提问来源于stack exchange,提问作者Kevin Liu
相关产品推荐
相关产品推荐

