Что вы действительно пытаетесь сделать?
Любые плавающие коды Python будут игнорировать «специально созданный» NaN в лучшем случае и падать в худшем случае.
Если вы передаете это значение чему-то вне кода Python - сериализация,или вызывая C API, просто определите его с точными байтами, которые вы хотите, используя struct, и отправьте эти байты в желаемое место назначения.
Кроме того, если вы используете NumPy, то да, вы можете создать специальныйNaNs и ожидайте, что затем будете повторно объединены в ndarray - но способ сделать это также через диктовку точных байтов, которые вы хотите с struct, и каким-то образом преобразовать тип данных при сохранении содержимого буфера.
Проверьте этоответ о создании 80-битных двойных чисел для использования с NumPy, чтобы получить обходной путь: Longdouble (1e3000) становится inf: Что я могу сделать?
(я попробовал numpy.frombuffer здесь, и этоинтерпретирует последовательность байтов, которую вы там создали, как 32-битную, если вам это подходит:
import numpy as np
import binascii
a = "7f800001"
b = binascii.unhexlify(a) # in Python 2 a.decode("hex") would work, but not Python3
# little endian format we need to revert the byte order
c = "".join(b[::-1])
x = np.frombuffer(c, dtype="float32")
x.tobytes()
напечатает оригинал -
'\x01\x00\x80\x7f'
И проверка массива x покажет, что это на самом деле NaN:
>>> x
array([nan], dtype=float32)
Однако по указанным выше причинам, если вы извлекаете значение из массива numpy с помощью x [0], онобудет преобразован в "pasteurizd" float64 NaN со значением по умолчанию.