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\')
CPython definition of nan
When Python reports a nan, where does that come from?
Py_NAN in the CPython C source code
(Py_HUGE_VAL * 0.)
Py_HUGE_VAL is probably defined as HUGE_VAL--it has a note to say it should be HUGE_VAL except on platforms where that is broken.float('nan') which is defined from Py_NAN in CPython's C source code.Reading Python and pywin32 Source Code
I've had a look at the C source code for pywin32, in particular win32com, which forms the Python↔COM translation layer. That code:
PyNumber_Float() to convert it to a Python float (if it isn't already)PyFloat_AsDouble() to convert it to a plain C double value.
double directly contained in the PyFloatObject member ob_fval.So it looks as though I've traced a NaN from the COM interface back to a plain C double type containing Py_NAN, whatever that turns out to be on the Windows platform.
TestStand NAN Value
Now I've tried this with NI TestStand. First I tried:
quiet_nan = struct.unpack(">d", "\x7f\xf8\x00\x00\x00\x00\x00\x01")[0]
# Set the variable's value in TestStand
locals_prop_object.SetValNumber(var_name, 0, quiet_nan)
But that still appeared in TestStand as IND. So then I created a TestStand file with variables set to IND and NAN, and read the values from Python. It turns out that TestStand's NAN has a value of FFFF000000000001. According to Kevin's Summary Charts that is a negative quiet NAN. TestStand's IND does have the expected value for Indeterminate, FFF8000000000000.
Success
So, after all that, I have succeeded in setting a NAN in TestStand, from Python:
# Make a NAN suitable for TestStand
teststand_nan = struct.unpack(">d", "\xff\xff\x00\x00\x00\x00\x00\x01")[0]
# Set the variable's value in TestStand
locals_prop_object.SetValNumber(var_name, 0, teststand_nan)