X-Authentication-Warning: delorie.com: mail set sender to djgpp-workers-bounces using -f X-Recipient: djgpp-workers AT delorie DOT com From: Martin Strömberg Message-Id: <201303111624.r2BGO6lZ014367@dexter.ludd.ltu.se> Subject: Re: Printing sign of NaN. To: djgpp-workers AT delorie DOT com Date: Mon, 11 Mar 2013 17:24:06 +0100 (MET) In-Reply-To: <513900D2.6040106@gmx.de> from "Juan Manuel Guerrero" at Mar 07, 2013 10:04:18 PM X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Reply-To: djgpp-workers AT delorie DOT com Errors-To: nobody AT delorie DOT com X-Mailing-List: djgpp-workers AT delorie DOT com X-Unsubscribes-To: listserv AT delorie DOT com Precedence: bulk According to Juan Manuel Guerrero: [A lot of NaN discussion snipped.] > I have run the code snippet below on linux and using djgpp. > I think when the additions are passed as arguments to printf > the "signed " NaN is read. Both give the same result like below: > > NaN + NaN = -nan NaN + NaN = -nan NaN + v = -nan > NaN + NaN = +nan NaN + NaN = nan NaN + v = nan First let me clearly state that I appreciate your work on DJGPP. It seems that it's only you and Andris that have time to work on DJGPP nowadays. Thank you! Now over to the NaNs. Just because Linux's libc does one thing, it's not automatically the right/best/whatever way to do it. While the sign of the NaN might help to diagnose what went wrong it's not enough. Preferably _all_ the bits of the NaN should be presented. IIRC, that is allowed, but it been a while since I was messing with this. I thought I did it for DJGPP, but I can't see anything in the code about that, or perhaps I'm looking at the wrong places. It can be that I never finished it so I didn't send it. Or perhaps it was just for my own debugging I was messing with NaNs. Anyway, IIRC you are allowed to print "NaN(some representation of the bits of the NaN)" when you print a NaN as long as your *scanf() accept it as well. So I suggest if you really want to make the printing of NaNs better do that. My plan was to just dump the bits of the whole floating point number (just be make implementing it easy), something like (pseudocode) print_double(double d) { if( isnan(d) ) { printf("NaN(0x%x)", (unsigned long long)d); } else { printf("%d", d); } } scanf_double(char string, double *d_p) { unsinged long long ull; if( 1 == sscanf(string, "NaN(%llx)", &ull ) { ull |= 0x; *d_p = *(double *)&ull; } elsif( 1 == sscanf(string, "nan(%llx)", &ull ) { /* Same as above. */ } elsif( X == sscanf(string, ...) { ... } } With that you can forget about the sign as you'll see that by looking at the bit patterns. And it sure is much better than what you're trying to copy from Linux's libc. I just don't see the point of printing only the sign and not the other interesting bits (the mantissa IIRC). Of course I can be totally wrong. It's been many years since I was looking at this. And you're free to do whatever you like. In particular as _YOU_'re the one doing any work on DJGPP's libc. Thank you! -- MartinS