Hm. $x starts undefined
[0] Perl> use Devel::Peek;; [0] Perl> Dump $x;; SV = NULL(0x0) at 0x3c6d400 REFCNT = 1 FLAGS = ()
You set $x to the maximum unsigned integer value; it becomes an IV:
[0] Perl> $x = ~0;; [0] Perl> Dump $x;; SV = IV(0x3c6d3f8) at 0x3c6d400 REFCNT = 1 FLAGS = (IOK,pIOK,IsUV) UV = 18446744073709551615
You add 2 to it, it overflows the IV, so perl converts it to an NV (NB: No NaN arises from the overflow of the IV.)
[0] Perl> $x += 2;; [0] Perl> Dump $x;; SV = PVNV(0x3cb85e8) at 0x3c6d400 REFCNT = 1 FLAGS = (NOK,pNOK) IV = -1 NV = 1.84467440737096e+019 PV = 0
Then, you raise that NV to the power 35; and the NV overflows; resulting in an NV with the floating point value of positive infinity (1.#INF) (NB:the "result to large" error):
[0] Perl> $x **=35;; [Result too large] Perl> Dump $x;; SV = PVNV(0x3cb85e8) at 0x3c6d400 REFCNT = 1 FLAGS = (NOK,pNOK) IV = -1 NV = 1.#INF PV = 0
You then divide the NV 1.#INF, by itself, and you produce an indeterminate floating point value (1.#IND):
[0] Perl> $x /= $x;; [0] Perl> Dump $x;; SV = PVNV(0x3cb85e8) at 0x3c6d400 REFCNT = 1 FLAGS = (NOK,pNOK) IV = -1 NV = -1.#IND PV = 0
The (special form of) NaN was produced by operating upon (erroneous) floating point (NV) values; not integer (IV) overflow.
NaN is a purely floating point concept, and cannot arise as a result of integer overflow.
In reply to Re^12: NaN output
by BrowserUk
in thread NaN output
by spikeinc
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |