Error Messages/40506
Example warning text
Variable Va3 computes the product INF*0, resulting in NaN (an indeterminant number).
Cause
You probably know that any number multiplied by zero is zero, and that any positive number multiplied by infinity is infinity. But when you consider multiplying 0 times infinity, both of these cannot be true. In mathematics, the product of zero times infinity is indeterminant, or not defined. In Analytica (as well as in most software programs), the special numeric value NaN denotes an indeterminant number.
By employing limits, it is possible to construct theoretical mathematical constructions that imply a finite result for INF*0
. For example, consider the function
- [math]\displaystyle{ f(x) = tan(x) * x }[/math]
(Note: x here is in radians, whereas the Tan(x) function in Analytica expects x to be in degrees). At [math]\displaystyle{ x=\pi/2 }[/math], INF*0 occurs, so that [math]\displaystyle{ f(\pi/2) }[/math] is not defined; however,
- [math]\displaystyle{ \lim_{x\rightarrow \pi/2} f(x) = -1 }[/math]
implying that the correct value here for INF*0
should be -1
. But if you apply the same logic to [math]\displaystyle{ g(x)=2*f(x) }[/math], you would conclude that the correct value for INF*0
ought to be -2
. You can see that with different mathematical constructions, you can create a valid argument that any value you desire is the natural result of INF*0
. Because the multiplication operator can't possibly know which theoretical mathematical construction should apply, it cannot possibly know what the "correct" result should be, and hence, this is why an indeterminate number is returned.
The IEEE 754 standard is a widely accepted standard for how floating point numbers should represented in a computer's memory, and how arithmetic operations should be carried out. Analytica follows the IEEE 754 standard, which stipulates that the special value INF multiplied by zero should be the special value NaN.
In Analytica 3.x and earlier, Analytica returned 0 for NaN*0
. This was changed in Analytica 4.0 to comply with the IEEE 754 standard.
Remedies
In some cases, you might use multiplication to zero out certain values, as in this example
(direction = 'East' Or direction = 'West')*distance
This is a valid and concise way of doing this, but only provided that distance
is guaranteed to be finite. If there is any chance that distance
could validly be INF, then you would need to use
If direction = 'East' Or direction = 'West' Then distance Else 0
Zeroing by multiplication does have the advantage that it will trigger this warning if an INF is encountered. This is an advantage in that you might catch an error in your model logic when a non-finite value would never occur.
Enable comment auto-refresher