В Python, как я могу перевести *(1+(int*)&x)?

Этот вопрос является продолжением этого. В математической библиотеке Sun (в C) выражение

*(1+(int*)&x)

используется для получения старшего слова числа с плавающей запятой x, Здесь ОС считается 64-битной с прямым порядком байтов.

Я думаю, как перевести выражение C выше на Python? Сложность заключается в том, как перевести "&" и "*" в выражении. Кстати, может, в Python есть какая-то встроенная функция, которая получает старшее слово числа с плавающей запятой?

1 ответ

Решение

Вы можете сделать это легче с struct:

high_word = struct.pack('<d', x)[4:8]
return struct.unpack('<i', high_word)[0]

Вот, high_word это bytes объект (или str в 2.x), состоящий из четырех старших байтов x в порядке байтов (используя 64-битный формат IEEE с плавающей запятой). Затем мы распаковываем его обратно в 32-разрядное целое число (которое возвращается в одноэлементном кортеже, следовательно, [0]).

Это всегда использует little-endian для всего, независимо от того, что лежит в основе вашей платформы. Если вам нужно использовать собственный порядок байтов, замените < с = (и использовать > или же ! заставить большой порядок байтов). Это также гарантирует 64-битные двойные и 32-битные целые числа, чего нет у C. Вы также можете удалить эту гарантию, но для этого нет веских оснований, поскольку это делает ваш вопрос бессмысленным.

Хотя это можно сделать с помощью арифметики с указателями, это может повлечь за собой ctypes и преобразование из Python float в C float все равно будет относительно дорогим. struct код намного проще для чтения.

Другие вопросы по тегам