SymPy表达式转换为NumPy longdouble时的精度异常问题
误差产生原因
- NumPy的
array构造器没有针对SymPy数值类型做专门适配,处理SymPy的表达式、Float对象时,会默认调用其__float__方法转换为Python原生双精度浮点数(仅支持15~17位有效数字),此时精度已经丢失,后续指定dtype=np.longdouble只是将低精度值升格存储,无法恢复丢失的末位精度。 - 你测试中使用
N(symMat, 19)得到的仍是SymPy内置的高精度Float对象,传入NumPy时依然会触发转双精度的逻辑,因此两次转换的结果完全一致,都存在末三位误差。
简单解决方法
通过「SymPy高精度值转十进制字符串→NumPy从字符串解析为longdouble」的路径转换,即可完整保留np.longdouble支持的18位有效精度,示例修改代码如下:
from sympy import * import numpy as np symMat = Matrix([[sqrt(5), sqrt(7)]]) np.set_printoptions(precision = 18) # 批量转换矩阵的实现 numMat = np.array( [[np.longdouble(str(N(val, 19))) for val in row] for row in symMat.tolist()], dtype=np.longdouble ) print(repr(numMat))
运行后可以得到和N(symMat, 19)输出一致的longdouble矩阵,末位无误差。
内容的提问来源于stack exchange,提问作者Ailurus
相关产品推荐
相关产品推荐

