Annotation of 43BSDReno/lib/libc/hp300/stdlib/atof.c, revision 1.1.1.1

1.1       root        1: /*-
                      2:  * Copyright (c) 1990 The Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * This code is derived from software contributed to Berkeley by
                      6:  * the Systems Programming Group of the University of Utah Computer
                      7:  * Science Department.
                      8:  *
                      9:  * Redistribution and use in source and binary forms are permitted
                     10:  * provided that: (1) source distributions retain this entire copyright
                     11:  * notice and comment, and (2) distributions including binaries display
                     12:  * the following acknowledgement:  ``This product includes software
                     13:  * developed by the University of California, Berkeley and its contributors''
                     14:  * in the documentation or other materials provided with the distribution
                     15:  * and in all advertising materials mentioning features or use of this
                     16:  * software. Neither the name of the University nor the names of its
                     17:  * contributors may be used to endorse or promote products derived
                     18:  * from this software without specific prior written permission.
                     19:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     20:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     21:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     22:  */
                     23: 
                     24: #if defined(LIBC_SCCS) && !defined(lint)
                     25: static char sccsid[] = "@(#)atof.c     5.1 (Berkeley) 5/12/90";
                     26: #endif /* LIBC_SCCS and not lint */
                     27: 
                     28: #include <ctype.h>
                     29: 
                     30: double _twoemax =
                     31: #ifdef IEEE
                     32:        9007199254740992.;      /*2^53*/
                     33: #else
                     34:        72057594037927936.;     /*2^56*/
                     35: #endif
                     36: 
                     37: #ifdef hp300
                     38: /* attempt to be as exact as possible */
                     39: struct {
                     40:        long d_high;
                     41:        long d_low;
                     42: } _exp5[] = {
                     43:        { 0x40140000, 0x00000000 },     /* 5 */
                     44:        { 0x40390000, 0x00000000 },     /* 25 */
                     45:        { 0x40838800, 0x00000000 },     /* 625 */
                     46:        { 0x4117d784, 0x00000000 },     /* 390625 */
                     47:        { 0x4241c379, 0x37e08000 },     /* 152587890625 */
                     48:        { 0x4493b8b5, 0xb5056e17 },     /* 2.3283064365387e+022 */
                     49:        { 0x49384f03, 0xe93ff9f6 },     /* 5.42101086242753e+044 */
                     50:        { 0x52827748, 0xf9301d33 },     /* 2.93873587705572e+089 */
                     51:        { 0x65154fdd, 0x7f73bf3f }      /* 8.63616855509445e+178 */
                     52: };
                     53: #else
                     54: double _exp5[] = {
                     55:        5.,
                     56:        25.,
                     57:        625.,
                     58:        390625.,
                     59:        152587890625.,
                     60:        23283064365386962890625.,
                     61: #ifdef IEEE
                     62:        5.4210108624275231e+044,
                     63:        2.9387358770557196e+089,
                     64:        8.6361685550944492e+178,
                     65: #endif
                     66: };
                     67: #endif
                     68: 
                     69: double
                     70: atof(p)
                     71: register char *p;
                     72: {
                     73:        extern double ldexp();
                     74:        register c, exp = 0, eexp = 0;
                     75:        double fl = 0, flexp = 1.0;
                     76:        int bexp, neg = 1, negexp = 1;
                     77: 
                     78:        while((c = *p++) == ' ');
                     79:        if (c == '-') neg = -1; else if (c == '+'); else --p;
                     80: 
                     81:        while ((c = *p++), isdigit(c))
                     82:                if (fl < _twoemax) fl = 10*fl + (c-'0'); else exp++;
                     83:        if (c == '.')
                     84:        while ((c = *p++), isdigit(c))
                     85:                if (fl < _twoemax)
                     86:                {
                     87:                        fl = 10*fl + (c-'0');
                     88:                        exp--;
                     89:                }
                     90:        if ((c == 'E') || (c == 'e'))
                     91:        {
                     92:                if ((c= *p++) == '+'); else if (c=='-') negexp = -1; else --p;
                     93:                while ((c = *p++), isdigit(c)) eexp = 10*eexp + (c-'0');
                     94:                if (negexp < 0) eexp = -eexp; exp += eexp;
                     95:        }
                     96:        bexp = exp;
                     97:        if (exp < 0) exp = -exp;
                     98: 
                     99:        for (c = 0; c < sizeof(_exp5)/sizeof(_exp5[0]); c++)
                    100:        {
                    101: #ifdef hp300
                    102:                if (exp & 01) flexp *= *(double *)&_exp5[c];
                    103: #else
                    104:                if (exp & 01) flexp *= _exp5[c];
                    105: #endif
                    106:                exp >>= 1; if (exp == 0) break;
                    107:        }
                    108: 
                    109:        if (bexp < 0) fl /= flexp; else fl *= flexp;
                    110:        fl = ldexp(fl, bexp);
                    111:        if (neg < 0) return(-fl); else return(fl);
                    112: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.