How to distinguish different types of NaN float in Python

后端 未结 4 1227
悲&欢浪女
悲&欢浪女 2021-02-13 22:27

I\'m writing Python 2.6 code that interfaces with NI TestStand 4.2 via COM in Windows. I want to make a \"NAN\" value for a variable, but if I pass it float(\'nan\')

4条回答
  •  独厮守ぢ
    2021-02-13 23:02

    I dug a bit for you, and I think you might be able to use the struct module in combination with the information on at Kevin's Summary Charts. They explain the exact bit patterns used for the various kinds of IEEE 754 floating point numbers.

    The only thing you probably will have to be careful for, if I read the topics on this IND-eterminate value, is that that value tends to trigger some kind of floating point interrupt when assigned directly in C code, causing it to be turned into a plain NaN. Which in turn meant those people were advised to do this kind of thing in ASM rather than C since C abstracted that stuff away.. Since it is not my field, and that I am not sure to what extent this kind of value would mess with Python, I figured I'd mention it so you can at least keep an eye for any such weird behaviour. (See the accepted answer for this question).

    >>> import struct
    
    >>> struct.pack(">d", float('nan')).encode("hex_codec")
    'fff8000000000000'
    
    >>> import scipy
    >>> struct.pack(">d", scipy.nan).encode("hex_codec")
    '7ff8000000000000'
    

    Referring to Kevin's Summary Charts, that shows that float('nan') is actually technically the Indeterminate value, while scipy.nan is a Quiet NaN.

    Let's try making a Signaling NaN, and then verify it.

    >>> 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'
    

    No, the Signaling NaN gets converted to a Quiet NaN.

    Now let's try making a Quiet NaN directly, and then verify it.

    >>> 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'
    

    So that's how to make a proper Quiet NaN using struct.unpack()--at least, on a Windows platform.

提交回复
热议问题