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: V01U2FsdGVkX1/Sw6Jo5L3Sq0yAsqcZs1rp4dxXG5mXWKujb/+xdu fPSEOlfJarm/d6 Message-ID: <5137961A.4000505@gmx.de> Date: Wed, 06 Mar 2013 20:16:42 +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 CC: Eli Zaretskii Subject: Re: Printing sign of NaN. References: <51364BCD DOT 1030807 AT gmx DOT de> <83y5e11pn7 DOT fsf AT gnu DOT org> In-Reply-To: <83y5e11pn7.fsf@gnu.org> 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 Am 05.03.2013 22:51, schrieb Eli Zaretskii: >> Date: Tue, 05 Mar 2013 20:47:25 +0100 >> From: Juan Manuel Guerrero >> >> ONFY while I was testing trunc() I noted that printf did not print the >> sign of NaN. The committed small patch below fixes the issue. > Isn't NaN always negative? Do you succeed in printing both negative > and positive NaN with this patch? > > Apologies if my failing memory just failed me again. I noted this issue when testing the test programs for trunc[fl] on my linux box. Please see the code snippet below: ---- code start ---- #include typedef struct { unsigned mantissal:32; unsigned mantissah:32; unsigned exponent:15; unsigned sign:1; } long_double_t; typedef union { long double ld; long_double_t ldt; } _longdouble_union_t; int main(void) { /* NaN definitions according 253665.pdf Table 4-3. Floating-Point Number and NaN Encodings */ _longdouble_union_t snan_p, snan_n; /* SNaN. */ snan_p.ldt.mantissal = 0x00000001U; snan_p.ldt.mantissah = 0x80000000U; snan_p.ldt.exponent = 0x7FFFU; snan_p.ldt.sign = 0; snan_n.ld = snan_p.ld; snan_n.ldt.sign = 1; printf("SNaN:\n" "%+Lg %-Lg\n" "%+Lg %-Lg\n", snan_p.ld, snan_p.ld, snan_n.ld, snan_n.ld); /* QNaN. */ snan_p.ldt.mantissah = 0xC0000000U; snan_n.ldt.mantissah = 0xC0000000U; printf("QNaN:\n" "%+Lg %-Lg\n" "%+Lg %-Lg\n", snan_p.ld, snan_p.ld, snan_n.ld, snan_n.ld); /* QNaN floating-point indefinite. */ snan_p.ldt.mantissal = 0x00000000U; snan_n.ldt.mantissal = 0x00000000U; printf("QNaN floating-point indefinite:\n" "%+Lg %-Lg\n" "%+Lg %-Lg\n", snan_p.ld, snan_p.ld, snan_n.ld, snan_n.ld); return 0; } ---- code end ---- This produces the following output on my linux box (gcc (SUSE Linux) 4.6.2, glibc 2.14.1): SNaN: +nan nan -nan -nan QNaN: +nan nan -nan -nan QNaN floating-point indefinite: +nan nan -nan -nan I do not know if this is a bug or a feature, but my intention was to imitate this behavior. Neither less according to 253665.pdf 4.8.3.4 NaNs, the sign of NaNs are ignored. I do not know what consequences this should have when writing code. > Isn't NaN always negative? Do you succeed in printing both negative > and positive NaN with this patch? Yes, I can print both signs with this change. In this line: if (_ldouble < 0 || (IS_NAN(ieee_value) && ieee_value.ldt.sign)) _ldouble < 0 is always false if _ldouble is a NaN. I was not aware of this. Iff _ldouble is a NaN then value of ieee_value.ldt.sign determinates the sign to be printed. Regards, Juan M. Guerrero