2015-08-31 4 views
4

Этот вопрос является продолжением this one. В Sun's math library (в C), выражениеВ Python, как я могу перевести * (1+ (int *) & x)?

*(1+(int*)&x) 

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

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

+4

Используйте 'struct.pack()', чтобы превратить его в строку байтов. – Kevin

+2

Почему бы вам не ответить на ваши вопросы? – zell

ответ

7

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

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

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

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

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

Смежные вопросы