I have a Mathematica expression that is mapped onto an external C
function via MathLink
. The external function passes a double
array (using MLPutReal64List[]
), which Mathematica interprets as a list of Real
's. Sometimes the external function sends values for which the C
math library function isnan(value)
returns 1
(say from division by zero, or log(0)
). Mathematica reads these values as NaN`
. For example,
In[1]:= result = externalFunction[]
Out[1]= {NaN`, 0.18225}
Evaluating {NaN`, 0.182255} gives a syntax error:
In[2]:= {NaN`, 0.182255}
Syntax::tsntxi: "{NaN`,0.182255}" is incomplete; more input is needed.
Syntax::sntxi: Incomplete expression; more input is needed.
which makes sense, since a variable name is expected to follow the `
, giving some variable in the NaN
context.
But mathematica accepts result[[1]]
as a number:
In[3]:= NumericQ[result[[1]]]
Out[3]= True
In[4]:= NumberQ[result[[1]]]
Out[4]:= True
!!
Yet I haven't been able to find a pattern that matches NaN`
and not all other numbers (for use in Position
, Cases
, etc.).
So what are ways of a) passing NaN's from c into Mathematica so that Mathematica interprets them as Indeterminate
, or b) handling these NaN
s inside mathematica (with a pattern match to replace them with Indeterminate
, for example).
Is it possible to construct the first element of result
using keyboard input? Note that InputForm[result[[1]]]
gives NaN
, and NumericQ[InputForm[result[[1]]]]
gives False
.
Answer
NaN (or Not-a-Number is used in floating point arithmetic to represent values that are undefined or unrepresentable, such as $0/0,\ \infty/\infty$, etc. Mathematica typically returns Indeterminate
for these, but several other languages return NaN
.
To work with NaN
s, you must load the ComputerArithmetic
package as <
NaN
s like any other symbol (or perhaps with other, unknown consequences depending on the setup). Loading the package will give you the results as expected, and pattern matching is pretty straightforward too.
Comments
Post a Comment