version 1.1, 1997/05/21 20:40:07
|
version 1.9, 2007/12/31 17:34:59
|
Line 1
|
Line 1
|
/* cheap ecvt replacement */ |
/* cheap ecvt replacement |
|
|
|
Copyright (C) 1998,2000,2007 Free Software Foundation, Inc. |
|
|
|
This file is part of Gforth. |
|
|
|
Gforth is free software; you can redistribute it and/or |
|
modify it under the terms of the GNU General Public License |
|
as published by the Free Software Foundation; either version 2 |
|
of the License, or (at your option) any later version. |
|
|
|
This program is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
GNU General Public License for more details. |
|
|
|
You should have received a copy of the GNU General Public License |
|
along with this program; if not, write to the Free Software |
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. |
|
*/ |
|
|
|
#include <stdio.h> |
#include "config.h" |
#include "config.h" |
#include <math.h> |
#include <math.h> |
extern double floor(double); |
extern double floor(double); |
Line 13 char* ecvt(double x, int len, int* exp,
|
Line 33 char* ecvt(double x, int len, int* exp,
|
int i, j; |
int i, j; |
double z; |
double z; |
|
|
|
if (isnan(x)) { |
|
*sign=0; |
|
*exp=0; |
|
return "nan"; |
|
} |
|
if (isinf(x)) { |
|
*sign=0; /* this mimics the glibc ecvt */ |
|
*exp=0; |
|
if (x<0) |
|
return "-inf"; |
|
else |
|
return "inf"; |
|
} |
|
|
if(len > (MAXCONV-1)) len = MAXCONV-1; |
if(len > (MAXCONV-1)) len = MAXCONV-1; |
|
|
if(x<0) |
if(x<0) |
Line 36 char* ecvt(double x, int len, int* exp,
|
Line 70 char* ecvt(double x, int len, int* exp,
|
for(i=0; i < len; i++) |
for(i=0; i < len; i++) |
{ |
{ |
z=floor(x); |
z=floor(x); |
|
if(z<0) z = 0; |
scratch[i]='0'+(char)((int)z); |
scratch[i]='0'+(char)((int)z); |
x = (x-z)*10; |
x = (x-z)*10; |
} |
} |
Line 53 char* ecvt(double x, int len, int* exp,
|
Line 88 char* ecvt(double x, int len, int* exp,
|
scratch[j]='0'; |
scratch[j]='0'; |
} |
} |
} |
} |
if(j==0) |
if(j<0) |
{ |
{ |
scratch[0]='1'; |
scratch[0]='1'; |
*exp += 1; |
*exp += 1; |
Line 69 char* ecvt(double x, int len, int* exp,
|
Line 104 char* ecvt(double x, int len, int* exp,
|
int main(int argc, char ** argv) |
int main(int argc, char ** argv) |
{ |
{ |
int a, b; |
int a, b; |
char * conv=ecvt(PI*1e10,20,&a,&b); |
char * conv=ecvt(9e0,20,&a,&b); |
|
|
printf("ecvt Test: %f -> %s, %d, %d\n",PI,conv,a,b); |
printf("ecvt Test: %f -> %s, %d, %d\n",9e0,conv,a,b); |
} |
} |
#endif |
#endif |
|
|