Неправильный математический результат при вызове расширения C в Python

#python #python-c-extension

#python #python-c-extension

Вопрос:

Я вызываю pow() функцию математической библиотеки C. Моя установка — Python3.5 в Windows 10, но я попробовал ту же программу в Python2.7 с тем же результатом. Возврат из функции не соответствует ожиданиям. Не уверен, что происходит. Код приведен ниже. Результат, который я получаю, равен 1.0.

 from ctypes import *

libc = cdll.msvcrt
libc.pow.argtypes = [c_double, c_int]
libc.pow.restype = c_double
libc.pow(2.3, 2)
  

Ответ №1:

Дважды проверьте свои типы, я почти уверен, что прототип для pow

двойной pow(двойной a, двойной b);

Так что изменяет эту строку

libc.pow.argtypes = [c_double, c_int]

Для

libc.pow.argtypes = [c_double, c_double]

Всякий раз, когда вы вызываете функции c из python, всегда проверяйте правильность типов, которые вы вводите из python, не полагайтесь на приведение, как в c / c

Комментарии:

1. Это правильно. Похоже на ошибку интерфейса. Он должен перехватить это как неправильный тип аргумента, а не возвращать неправильный результат.

Ответ №2:

Существует несоответствие типов. Также используйте c_double для power. Вот так. Это должно сработать.

libc.pow.argtypes = [c_double, c_double]

Комментарии:

1. IIRC, ваше добавление «также» является излишним.

2. @Hurkyl Спасибо. Отредактировано.

Ответ №3:

pow в C libray принимает double, double в качестве входных аргументов. Вот почему.

 from ctypes import *

libc = cdll.msvcrt
libc.pow.argtypes = [c_double, c_double]
libc.pow.restype = c_double
libc.pow(2.3, 2.0)