*BSD News Article 9709


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.
%
%
%