- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在将 SymPy 表达式转换为 NumPy longdoubles(下面的代码片段)时,我注意到 NumPy 结果中的最后三位数字通常是垃圾。我不明白为什么会发生这种情况,因为我明确指出 NumPy 结果应该是 dtype=np.longdouble
.我做错了什么,有没有(直接的)方法来解决它?
There doesn't seem to be a single mention of SymPy in NumPy's documentation ,所以我不确定 NumPy 到底是什么 array
构造函数在给定 SymPy 输入时执行。
from sympy import *
import numpy as np
print(np.finfo(np.longdouble))
symMat = Matrix([[sqrt(5), sqrt(7)]])
print(symMat)
print(N(symMat, 19))
np.set_printoptions(precision = 18)
numMat = np.array(symMat, dtype=np.longdouble)
print("", repr(numMat))
numMat = np.array(N(symMat, 19), dtype=np.longdouble)
print("", repr(numMat))
这会产生以下输出:
Machine parameters for float128
---------------------------------------------------------------
precision = 18 resolution = 1e-18
machep = -63 eps = 1.084202172485504434e-19
negep = -64 epsneg = 5.42101086242752217e-20
minexp = -16382 tiny = 3.3621031431120935063e-4932
maxexp = 16384 max = 1.189731495357231765e+4932
nexp = 15 min = -max
---------------------------------------------------------------
Matrix([[sqrt(5), sqrt(7)]])
Matrix([[2.236067977499789696, 2.645751311064590591]])
array([[2.236067977499789805, 2.645751311064590716]], dtype=float128)
array([[2.236067977499789805, 2.645751311064590716]], dtype=float128)
最佳答案
我很确定 np.longdouble
只需通过 __float__
转换输入:
In [4]: np.array([float(N(sqrt(5), 19))], dtype=np.longdouble)
Out[4]: array([2.236067977499789805], dtype=float128)
Python 通常没有很好的方式在不同的非整数类型之间进行互操作:所有东西通常都经过浮点数。话虽如此,numpy 不承认 sympy 的 Rational 遵循数字 ABC,因此在这种情况下可以进行更好的转换。对于 SymPy 的 Float 没有什么好方法,因为 Real ABC 除了将浮点类型转换为
float
之外,没有提供任何方式来互操作浮点类型。 :
Float
手动执行此操作。进入
Rational
并将分子和分母提取为整数,其中
np.longdouble
可以处理:
In [28]: M = Matrix([[sqrt(5), sqrt(7)]])
In [29]: Mfr = M.applyfunc(lambda e: Rational(N(e, 19)))
In [30]: Mfr
Out[30]:
⎡10312043428088987147 24402748658945006457⎤
⎢──────────────────── ────────────────────⎥
⎣4611686018427387904 9223372036854775808 ⎦
In [31]: Mnum = Mfr.applyfunc(lambda e: e.numerator)
In [32]: Mden = Mfr.applyfunc(lambda e: e.denominator)
In [33]: Mnum
Out[33]: [10312043428088987147 24402748658945006457]
In [34]: Mden
Out[34]: [4611686018427387904 9223372036854775808]
In [35]: to_np = lambda A: np.array([[int(e) for e in row] for row in A.tolist()], dtype=np.longdouble)
In [36]: a = to_np(Mnum) / to_np(Mden)
In [37]: a
Out[37]: array([[2.236067977499789696, 2.64575131106459059 ]], dtype=float128)
关于python - 将 SymPy 表达式转换为 SymPy longdoubles 的精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68100807/
早上好 我正在从 FITS 文件中读取两个数字(代表单个数字的整数和浮点部分),将它们转换为长 double (在我的机器中为 128 位),然后将它们相加。 结果不如我对使用 128 位 float
我正尝试在我的 Python 代码中使用 np.longdouble dtype,并尝试使用 NumPy 来操作我从使用 Cython 编译的 C 模块中获得的长 double 值。 假设我这样做:
(网络上其他大多数相关问题都涉及C的longdouble和python之间的转换。这个问题是不同的。) 我不明白为什么我不能像这样在 python 中正确获取 longdouble: In [72]:
在将 SymPy 表达式转换为 NumPy longdoubles(下面的代码片段)时,我注意到 NumPy 结果中的最后三位数字通常是垃圾。我不明白为什么会发生这种情况,因为我明确指出 NumPy
我想使用 scipy.stats 进行一些概率计算,并避免下溢/溢出:除了使用适当的日志函数之外,我还尝试使用 numpy.longdouble (Ubuntu 上的 float128)来提高浮点精度
我有时间使用 dtype numpy.longdouble,当我尝试将这些值与 timedelta 函数一起使用时,我遇到了错误。但是当我将它转换为 numpy.float64 时,一切都很好。有人可
我一直在玩C99的quad precision长双。据我了解,(特定于平台的)numpy 支持 long double和 128 位 float 。 我遇到了一些我无法解释的事情。 给定: >>> i
我有一段代码,其中一部分计算是使用 NumPy 函数和 longdouble 完成的,另一部分是使用 SymPy 符号微分和数值计算完成的,然后连接在一起(到 SymPy float )。 Sympy
我是一名优秀的程序员,十分优秀!