Возвращение Cython двойного комплекса в комплекс с плавающей точкой приводит к тому, что выражение не находится в чистом C - PullRequest
0 голосов
/ 05 июня 2018

У меня проблема с попыткой использовать complex64_t в Cython.Вот мой простой пример с Cython.

cimport numpy as cnp

cdef extern from "complex.h":
    double complex cexp(double complex)

cpdef example():
    cdef float b = 2.0
    cdef cnp.complex64_t temp1
    cdef cnp.complex128_t temp2

    temp1 = cexp(1j * b)
    temp2 = cexp(1j * b)

Когда я запускаю файл со следующим setup.py

from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension
import numpy as np


ext_modules = [
    Extension(
        "bug_example",
        ["bug_example.pyx"],
        include_dirs=[np.get_include()],
    )
]


setup(
    name='bug_example',
    ext_modules=cythonize(ext_modules, annotate=True,
                          compiler_directives={'boundscheck': False})
)

Все компилируется без проблем, но я получаю желтый (не чистый C) в строке, содержащей

temp1 = cexp(1j * b)

, но не в

temp2 = cexp(1j * b)

Похоже, это проблема возврата двойного комплекса в комплекс с плавающей точкой.Я пытался привести его к явному плавающему комплексу, например:

temp1 = <float complex>(cexp(1j * b))

Но это не имеет значения.

Может кто-нибудь помочь мне исправить мой код, чтобы строка с temp1 не помоглаиметь больше желтый и чистый C. Это позволит мне использовать openmp в Cython.

1 Ответ

0 голосов
/ 05 июня 2018

Желтый цвет обусловлен __Pyx_CREAL и __Pyx_CIMAG, что не должно быть проблемой, но кто знает ...

Чтобы избежать этого, вы должны избегать приведения с double до float и обратно.

Например:

cimport numpy as cnp

#take the float version (cexpf) instead of double-version (cexp)
cdef extern from "complex.h":
     float complex cexpf(float complex)

#1j maps to double complex, so create a float version
cdef float complex float_1j = 1j

cpdef example():
    cdef float b_float = 2.0                              #use float not double
    cdef cnp.complex64_t temp1 = cexpf(float_1j*b_float)  #everything is float
...