Я немного покопался для вас, и я думаю, что вы могли бы использовать модуль struct
в сочетании с информацией на Сводные диаграммы Кевина . Они объясняют точные битовые комбинации, используемые для различных типов чисел с плавающей запятой IEEE 754.
Единственное, с чем вам, вероятно, придется быть осторожным, если я прочту разделы об этом IND
-определенном значении, это то, что это значение имеет тенденцию вызывать какое-то прерывание с плавающей запятой при назначении непосредственно в коде C, вызывая это должно быть превращено в простой NaN. Что, в свою очередь, означало, что этим людям советовали делать такие вещи в ASM, а не в C, так как C абстрагировал эти вещи. Так как это не моя область, и я не уверен, в какой степени это значение будет мешать Питон, я решил упомянуть об этом, чтобы вы могли, по крайней мере, следить за любым таким странным поведением. (См. Принятый ответ для этого вопроса ).
>>> import struct
>>> struct.pack(">d", float('nan')).encode("hex_codec")
'fff8000000000000'
>>> import scipy
>>> struct.pack(">d", scipy.nan).encode("hex_codec")
'7ff8000000000000'
Ссылаясь на Сводные диаграммы Кевина , которые показывают, что float('nan')
фактически технически является неопределенным значением, в то время как scipy.nan
является тихим NaN.
Давайте попробуем создать Сигнальный NaN, а затем проверить это.
>>> try_signaling_nan = struct.unpack(">d", "\x7f\xf0\x00\x00\x00\x00\x00\x01")[0]
>>> struct.pack(">d", try_signaling_nan).encode("hex_codec")
'7ff8000000000001'
Нет, Сигнальный NaN преобразуется в Тихий NaN.
Теперь давайте попробуем создать тихий NaN напрямую, а затем проверить его.
>>> try_quiet_nan = struct.unpack(">d", "\x7f\xf8\x00\x00\x00\x00\x00\x00")[0]
>>> struct.pack(">d", try_quiet_nan).encode("hex_codec")
'7ff8000000000000'
Так вот, как сделать правильный тихий NaN, используя struct.unpack()
- по крайней мере, на платформе Windows.