在 VSCode 中运行 Jupyter 笔记本时,我遇到了 Cython 不受保护的除法指令的奇怪行为。使用 启动会话%load_ext cython
,运行:
%%cython
import math
cimport cython
@cython.cdivision(True)
def simpleTest(int d):
cdef double c = 1/math.exp(math.log(math.sqrt(2/d)))
return c
现在运行simpleTest(x)
,对于x
>= 3 的任何值,我得到:
ValueError:数学域错误
但在没有该@cython.cdivision(True)
指令的情况下运行,它对所有x
> 0 都可以正常工作,正如它应该的那样。为什么该指令会破坏这种计算?有更好的方法吗?
您告诉 Cython 像 C 中一样进行除法。在 C 中,整数除法产生整数结果,向 0 舍入。
对于C 除法,
2/d
是。您正在尝试取 0 的对数。0
d > 2