Executando um notebook Jupyter no VSCode, estou tendo um comportamento bizarro com a diretiva de divisão desprotegida do Cython. Iniciando a sessão com %load_ext cython
, execute:
%%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
Agora execute simpleTest(x)
e para qualquer valor x
>= 3 eu recebo:
ValueError: erro de domínio matemático
Mas rodando sem a @cython.cdivision(True)
diretiva funciona bem para todos x
> 0, como deveria. Porque é que a directiva quebra este cálculo? Existe uma abordagem melhor?
Você está dizendo ao Cython para dividir como em C. Em C, a divisão inteira produz resultados inteiros, arredondando para 0.
Com divisão C,
2/d
é0
parad > 2
. Você está tentando calcular o logaritmo de 0.