代码之家  ›  专栏  ›  技术社区  ›  feetwet

@cython.cdivision(True)在奇怪的场景中导致“数学域错误”

  •  -2
  • feetwet  · 技术社区  · 2 年前

    在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,这是应该的。为什么指令会破坏这个计算?有更好的方法吗?

    1 回复  |  直到 2 年前
        1
  •  0
  •   user2357112    2 年前

    你告诉Cython像C中那样除法。在C中,整数除法产生整数结果,向0取整。

    在C划分的情况下, 2/d 0 对于 d > 2 。你正试图取0的对数。