3 * Copyright (c) 1987 Regents of the University of California.
4 * All rights reserved. The Berkeley software License Agreement
5 * specifies the terms and conditions for redistribution.
8 #if defined(LIBC_SCCS) && !defined(lint)
9 static char sccsid[] = "@(#)atof.c 2.2 (Berkeley) 1/22/87";
13 * C library - ascii to floating
19 /*#define HUGE 1.701411733192644270e38*/
22 _DOUBLE fp_atof(p) register char *p; {
24 _DOUBLE fl, flexp, exp5;
25 _DOUBLE big = { 0, 056200 << 16 }; /*= 72057594037927936.;*/ /*2^56*/
26 _DOUBLE ten = { 0, 041040 << 16 }; /*= 10.;*/
27 /*_DOUBLE fp_ldexp();*/
29 register int eexp, exp, neg, negexp, bexp;
32 while((c = *p++) == ' ')
42 /*fl = 0;*/ fl.l = 0; fl.h = 0;
44 while ((c = *p++), isdigit(c)) {
46 fl = fp_add(fp_mul(ten, fl), fp_int_to_double(c-'0'));
53 while ((c = *p++), isdigit(c)) {
55 fl = fp_add(fp_mul(ten, fl), fp_int_to_double(c-'0'));
64 if ((c == 'E') || (c == 'e')) {
72 while ((c = *p++), isdigit(c)) {
73 eexp = 10*eexp+(c-'0');
87 if((nd+exp*negexp) < -LOGHUGE){
88 /*fl = 0;*/ fl.l = 0; fl.h = 0;
91 /*flexp = 1;*/ flexp.l = 0; flexp.h = 040200 << 16;
92 /*exp5 = 5;*/ exp5.l = 0; exp5.h = 040640 << 16;
96 flexp = fp_mul(flexp, exp5);
100 exp5 = fp_mul(exp5, exp5);
103 fl = fp_div(fl, flexp);
105 fl = fp_mul(fl, flexp);
106 fl = fp_ldexp(fl, negexp*bexp);