В 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
код намного проще для чтения.