I recently stumbled upon two new methods added to 2020r1: Double.IsInfinite
and Double.IsNotANumber
. I currently do these checks extensively in my physics engine but have to use the slow Double.ToString
method and then check the String
for "nan"
or "inf"
. Unfortunately, these methods are completely broken.
Example:
// Infinity
Var posInf As Double = 1.0 / 0.0
Var negInf As Double = -1.0 / 0.0
// Some NaN values.
Var ZeroZero As Double = 0.0 / 0.0
Var infMinusInf As Double = posInf - posInf
Var infMultZero As Double = posInf * 0.0
// These should be set to True but are erroneously set to False.
Var isNanDouble1 As Boolean = ZeroZero.IsNotANumber // False (incorrect)
Var isNanDouble2 As Boolean = infMinusInf.IsNotANumber // False (incorrect)
Var isNanDouble3 As Boolean = infMultZero.IsNotANumber // False (incorrect)
// Test the `Double.IsInfinite` method.
Var isInfDouble1 As Boolean = posInf.IsInfinite // False (incorrect)
Var isInfDouble2 As Boolean = negInf.IsInfinite // False (incorrect)
// Using the slow `Double.ToString` method gives the correct results.
Var isNanString1 As Boolean = If(ZeroZero.ToString.IndexOf("nan") <> -1, True, False) // True (correct)
Var isNanString2 As Boolean = If(infMinusInf.ToString.IndexOf("nan") <> -1, True, False) // True (correct)
Var isNanString3 As Boolean = If(infMultZero.ToString.IndexOf("nan") <> -1, True, False) // True (correct)
Var isInfString1 As Boolean = If(posInf.ToString.IndexOf("inf") <> -1, True, False) // True (correct)
Var isInfString2 As Boolean = If(negInf.ToString.IndexOf("inf") <> -1, True, False) // True (correct)
// Test with an actual real number.
Var d As Double = 100.45
Var isNanDouble4 As Boolean = d.IsNotANumber // False (correct)
Var isNanString4 As Boolean
If d.ToString.IndexOf("nan") <> -1 And d.ToString.IndexOf("inf") <> -1 Then
isNanString4 = True
Else
isNanString4 = False
End If
Break
Feedback case: <https://xojo.com/issue/61805>
This is on macOS 10.15.6 running 2020r1.
@William_Yu: I believe you implemented these method of your own accord. Did something break when they were renamed to be API 2.0 compliant (they used to be called Double.IsNaN
and Double.IsInfinite
)?