X-Authentication-Warning: delorie.com: mail set sender to djgpp-workers-bounces using -f X-Recipient: djgpp-workers AT delorie DOT com X-Authenticated: #27081556 X-Provags-ID: V01U2FsdGVkX19WVDwafBFWjA2m3iy4/Fb70CEHcp925PaoIp0tD9 qOj7XZSg+tDzFr Message-ID: <5144F255.3010402@gmx.de> Date: Sat, 16 Mar 2013 23:29:41 +0100 From: Juan Manuel Guerrero User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121025 Thunderbird/16.0.2 MIME-Version: 1.0 To: djgpp-workers AT delorie DOT com Subject: Behavior of NaN when returned by a function and assigned to a variable Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit X-Y-GMX-Trusted: 0 Reply-To: djgpp-workers AT delorie DOT com Please see the code snippet below. The 3 functions create a SNaN. The first digit after the decimal point is 0 and at least one other digit is not 0. The assignment like this: fv.f = ff(); converts the SNaN returned by ff() into a QNaN stored in fv. This is true for float and double but not for long double that remains as SNaN. Can someone explain me what the reason for this behavior is? I have run the same code on my linux box and in this case all SNaN remain SNaN after the assignment. If more info is needed please let me know. Regards, Juan M. Guerrero Output of the coode snippet: nan: s:0 e:ff m:400001 QNaN. Integer bit not printed nan: s:0 e:7ff mh:80000 ml:1 QNaN. Integer bit not printed nan: s:0 e:7fff mh:80000000 ml:1 SNaN. Integer bit printed #include #include #include float ff(void) { _float_union_t v; v.f = NAN; v.ft.mantissa = 0x01U; /* SNaN. Set the integer bit. */ return v.f; } double fd(void) { _double_union_t v; v.d = NAN; v.dt.mantissal = 0x01U; v.dt.mantissah = 0x00U; /* SNaN. */ return v.d; } long double fld(void) { _longdouble_union_t v; v.ld = NAN; v.ldt.mantissal = 0x01U; v.ldt.mantissah = 0x80000000U; /* SNaN. Set the integer bit. */ return v.ld; } int main(void) { _float_union_t fv; _double_union_t dv; _longdouble_union_t ldv; fv.f = ff(); printf("%g: s:%u e:%x m:%x\n", fv.f, fv.ft.sign, fv.ft.exponent, fv.ft.mantissa); dv.d = fd(); printf("%g: s:%u e:%x mh:%x ml:%x\n", dv.d, dv.dt.sign, dv.dt.exponent, dv.dt.mantissah, dv.dt.mantissal); ldv.ld = fld(); printf("%Lg: s:%u e:%x mh:%x ml:%x\n", ldv.ld, ldv.ldt.sign, ldv.ldt.exponent, ldv.ldt.mantissah, ldv.ldt.mantissal); return 0; }