SymPy,如何强制浮点来防止Cython nogil contex中的错误

2024-05-29 11:08:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我在编译由SymPy编写的包含整数的Cython代码时遇到问题。一个例子是:

3.814697265625e-7*x1t*(-300540195*xi1**20 + 2294446650*xi1**18 - 707153400*xi1**17 - 6644311875*xi1**16 + 3102350400*xi1**15 + 9947431000*xi1**14 - 5616324000*xi1**13 - 8551893350*xi1**12 + 5408312000*xi1**11 + 4341581244*xi1**10 - 2974571600*xi1**9 - 1270659390*xi1**8 + 931170240*xi1**7 + 196911000*xi1**6 - 155195040*xi1**5 - 13159575*xi1**4 + 11668800*xi1**3 + 193050*xi1**2 - 257400*xi1 + xi2*(300540195*xi2**19 - 2294446650*xi2**17 + 707153400*xi2**16 + 6644311875*xi2**15 - 3102350400*xi2**14 - 9947431000*xi2**13 + 5616324000*xi2**12 + 8551893350*xi2**11 - 5408312000*xi2**10 - 4341581244*xi2**9 + 2974571600*xi2**8 + 1270659390*xi2**7 - 931170240*xi2**6 - 196911000*xi2**5 + 155195040*xi2**4 + 13159575*xi2**3 - 11668800*xi2**2 - 193050*xi2 + 257400))

给出相同错误的最小示例是:

cdef double ctest(double x) nogil:
    return 2294446650*x # <-- here is the problem

def test():
    return ctest(x=3.)

错误信息是:

cdef double ctest(double x) nogil:
    return 2294446650*x
                    ^
_stack.pyx:2:21: Coercion from Python not allowed without the GIL

...
cdef double ctest(double x) nogil:
    return 2294446650*x
                    ^
_stack.pyx:2:21: Operation not allowed without gil

...
cdef double ctest(double x) nogil:
    return 2294446650*x
                      ^
_stack.pyx:2:23: Converting to Python object not allowed without gil

如果函数编写为:

cdef double ctest(double x) nogil:
    return 2294446650.*x # <-- note the added floating point

问题:

1)有人知道如何强制SymPy用浮点写表达式吗?你知道吗

2)如果#1不可能,是否可以在Cython中执行某些操作来防止此错误?你知道吗


Tags: thereturnstacknotcythonwithoutdoublesympy
1条回答
网友
1楼 · 发布于 2024-05-29 11:08:33

evalf()方法将表达式中的所有数字系数转换为浮点:

>>> a = (3.814697265625e-7*x1t*(-300540195*xi1**20 + 2294446650*xi1**18 - 707153400*xi1**17 - 6644311875*xi1**16 + 3102350400*xi1**15 + 9947431000*xi1**14 - 5616324000*xi1**13 - 8551893350*xi1**12 + 5408312000*xi1**11 + 4341581244*xi1**10 - 2974571600*xi1**9 - 1270659390*xi1**8 + 931170240*xi1**7 + 196911000*xi1**6 - 155195040*xi1**5 - 13159575*xi1**4 + 11668800*xi1**3 + 193050*xi1**2 - 257400*xi1 + xi2*(300540195*xi2**19 - 2294446650*xi2**17 + 707153400*xi2**16 + 6644311875*xi2**15 - 3102350400*xi2**14 - 9947431000*xi2**13 + 5616324000*xi2**12 + 8551893350*xi2**11 - 5408312000*xi2**10 - 4341581244*xi2**9 + 2974571600*xi2**8 + 1270659390*xi2**7 - 931170240*xi2**6 - 196911000*xi2**5 + 155195040*xi2**4 + 13159575*xi2**3 - 11668800*xi2**2 - 193050*xi2 + 257400)))
>>> a.evalf()
3.814697265625e-7*x1t*(-300540195.0*xi1**20 + 2294446650.0*xi1**18 - 707153400.0*xi1**17 - 6644311875.0*xi1**16 + 3102350400.0*xi1**15 + 9947431000.0*xi1**14 - 5616324000.0*xi1**13 - 8551893350.0*xi1**12 + 5408312000.0*xi1**11 + 4341581244.0*xi1**10 - 2974571600.0*xi1**9 - 1270659390.0*xi1**8 + 931170240.0*xi1**7 + 196911000.0*xi1**6 - 155195040.0*xi1**5 - 13159575.0*xi1**4 + 11668800.0*xi1**3 + 193050.0*xi1**2 - 257400.0*xi1 + xi2*(300540195.0*xi2**19 - 2294446650.0*xi2**17 + 707153400.0*xi2**16 + 6644311875.0*xi2**15 - 3102350400.0*xi2**14 - 9947431000.0*xi2**13 + 5616324000.0*xi2**12 + 8551893350.0*xi2**11 - 5408312000.0*xi2**10 - 4341581244.0*xi2**9 + 2974571600.0*xi2**8 + 1270659390.0*xi2**7 - 931170240.0*xi2**6 - 196911000.0*xi2**5 + 155195040.0*xi2**4 + 13159575.0*xi2**3 - 11668800.0*xi2**2 - 193050.0*xi2 + 257400.0))

相关问题 更多 >

    热门问题