Return to BSD News archive
Received: by minnie.vk1xwt.ampr.org with NNTP
id AA6330 ; Fri, 08 Jan 93 01:04:22 EST
Path: sserve!manuel.anu.edu.au!munnari.oz.au!sgiblab!zaphod.mps.ohio-state.edu!usc!cs.utexas.edu!sun-barr!sh.wide!wnoc-tyo-news!news.u-tokyo.ac.jp!yayoi!tansei1!mhiroshi
From: mhiroshi@tansei.cc.u-tokyo.ac.jp (H. Murakami)
Newsgroups: comp.unix.bsd
Subject: [386bsd] vfprintf routine's trouble.
Message-ID: <3862@tansei1.tansei.cc.u-tokyo.ac.jp>
Date: 10 Jan 93 01:30:06 GMT
Sender: news@tansei.cc.u-tokyo.ac.jp
Organization: Hokkaido Univ. However I am subject to tansei for JUNET.
Lines: 50
% cat a.c
/*
* This demonstrates a not so important flaw
* in the vfprintf rountine of 386bsd0.1
* when printing the extremal value.
* This is detected by the warning messages of the enquire.c
*/
#include <math.h>
main()
{
double x;
static double y;
int *iy = (int *) &y;
char t[128]; char *sx;
/* 2^(-1022): the smallest normalized double. */
x = ldexp(1.0,-1022);
/* sx is the over-precision value of x. */
sx = "2.22507385850720138e-308";
sprintf(t, "%.15le", x);
sscanf(t, "%le", &y);
printf("%s\n%08x %08x\n\n", t, iy[0], iy[1], y);
sprintf(t, "%.16le", x);
sscanf(t, "%le", &y);
printf("%s\n%08x %08x\n\n", t, iy[0], iy[1], y);
sscanf(sx, "%le", &y);
printf("%s\n%08x %08x\n\n", sx, iy[0], iy[1], y);
}
%
%
% gcc a.c
% a.out
2.225073858507201e-308
00000000 00100000 << THIS IS THE CORRECT BIT PATTERN OF 2^(-1022).
2.2250738585072010e-308 << same value except the last wrong digit of zero.
ffffffff 000fffff << THIS IS A LITTLE BIT SHORT (wrong).
2.22507385850720138e-308
00000000 00100000 << THIS IS THE CORRECT BIT PATTERN.
%
%
%