Ковыряюсь с библиотекой ctypes. Хочу добиться в питоновом скрипте такого же поведения, как в С.
Например, имеется С-шный код
int a = 117440517;
float b = 117440520.0;
if (a == b)
printf("equal");
else
printf("non equal");
В С эти значения при сравнении будут неотличимы друг от друга (Выводится “equal”).
Если такое же попытаться провернуть с типами из ctypes, то результат будет другой (“non equal”)
Это пример, кажется с Вики, про неявное приведение типов и возможные проблемы при этом.
Не рекомендуется, но используется.
Сам вопрос обусловлен необходимостью работы с legacy-прогой на CUDA, которая работает с float и как раз эти неявные приведения активно практикует (да, она ужасна:) ). Потеря точности от сравнения невелика, но хотелось бы, чтобы питоновский скрипт выдавал те же результаты, что и С-шный код.
Так она пусть практикует, а “снаружи” в своем коде можно нормально делать )
Вообще такие сравнения и в Си же вроде зависят от компилятора и т.д., так что точно так же вряд ли получится.
В любом случае наверно придется написать какую-нибудь функцию cmp_numbers для сравнения по любым правилам отличным от ==, так что можно там сразу и написать правильно.
Сейчас так и организовано. Из питона дергается функция в dll, которая сравнивает с сишным кастом int к float. Хотелось бы сделать все в питоновкском коде.
Нет, т.к. здесь не учитывается особенности каста сишного int к float. Например, для приведенного примера разница будет 3 и получится не тот результат, что в С.
Во, похоже на то, что надо. Спасибо!
Есть прога для CUDA, которая работает с float значениями. В источник данных для проги данные пишутся как int (другой прогой).
Хотелось бы в питоне получить такое же поведение, чтобы проводить некоторые вычисления с поведение, и только потом запихивать это в CUDA-прогу.