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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 21:36:11