Return to BSD News archive
Newsgroups: comp.os.386bsd.bugs
Path: sserve!newshost.anu.edu.au!harbinger.cc.monash.edu.au!msuinfo!agate!howland.reston.ans.net!vixen.cso.uiuc.edu!milo.mcs.anl.gov!karrels
From: karrels@mcs.anl.gov (Edward L. Karrels)
Subject: float->string bug in FreeBSD 1.1 release
Message-ID: <KARRELS.94Jul2120712@elf.mcs.anl.gov>
Sender: usenet@mcs.anl.gov
Organization: Math & Computer Science Divison, ANL
Date: Sat, 2 Jul 1994 17:07:11 GMT
Lines: 46
FreeBSD 1.1 seems to have problems converting NaN floats to strings.
Other machines just convert them to "NaN", but I'm getting floating-point
exceptions. Doubles seems OK, though I haven't really tested them. I just
ran across this problem as I was converting random files into binary
representations of floats, doubles, ints, and longs. Only floats had problems.
Both sprintf and printf (at least) have this problem.
Sample:
#include <stdio.h>
#define LITTLE_ENDIAN
typedef struct {
#ifdef LITTLE_ENDIAN
/* little endian is when the lower addresses represent less significant
bytes, right? I always get that confused. Anyway, for this to work
properly (for this program, to work properly is to die of a floating-
point exception) on an i386, you must define LITTLE_ENDIAN */
unsigned long mantissa : 23;
unsigned long exponent : 8;
unsigned long sign : 1;
#else
unsigned long sign : 1;
unsigned long exponent : 8;
unsigned long mantissa : 23;
#endif
} myfloat;
main () {
union {
myfloat m;
float f;
} z;
z.m.mantissa = 0; /* +infinity */
z.m.exponent = 255;
z.m.sign = 0;
printf( "z = %g\n", z.f );
z.m.mantissa = 1; /* NaN */
printf( "z = %g\n", z.f );
}