Адрес этой страницы изменился на http://www.nickolay.info/algorithms/cpp_atof.html. Причины переезда
Pers.narod.ru. Алгоритмы. Пишем собственную функцию atof |
Упражнения на написание собственных версий функций преобразования строки в число и числа в строку весьма популярны при изучении Си - так повелось ещё с Кернигана и Ричи. Приведённая ниже версия atof() не отличается простотой, зато работает практически без погрешностей на больших диапазонах исходных данных.
#include <stdio.h>
#include <conio.h>
#define byte unsigned char
unsigned strlen (byte *s) {
unsigned l=0;
while (*s++!='\0') l++;
return l;
}
double atof(byte *s,double f) {
byte *r;
int z=1;
if (*s=='-') { z=-1; s++; }
int i;
int n_d=0,n_e=0; //n_d - number position DOT in string
r=s;
for (i=1;i<strlen(s);i++) {
if ((*r=='e')||(*r=='E')) { n_e=i; }
r++;
}
if (n_e!=0) {
byte *r,*t;
int i;
int n_d=0;
t=r=s;
for (i=1;i<n_e;i++) {
if (*r=='.') {n_d=i;}
r++;
}
if (n_d==0) n_d=n_e;
double cp=0;
r=t;
for (i=1; i<n_d-1;i++) { r++; }
for (i=1; i<n_d;i++) {
int p=1;
for (int j=0; j<i-1; j++) p*=10;
cp+=((int)*r-48)*(p);
r--;
}
double dp=0;
r=t;
for (i=1; i<n_d+1;i++) { r++; }
for (i=1; i<n_e-n_d;i++) {
double p=1;
for (int j=0; j<i; j++) p*=0.1;
dp+=((int)*r-48)*(p);
r++;
}
double ep,p;
r=t;
int x=1;
int u=0;
for (i=1; i<strlen(s-1)-n_e+1;i++) {
r--;
}
if (*r=='-') { x=-1;n_e++; }
r=t;
if (x==-1) {
for (i=1; i<strlen(s);i++) { r++; }
for (i=1; i<strlen(s)-n_e+1;i++) {
p=1;
for (int j=0; j<i-1; j++) p*=10;
u+=((int)*r-48)*(p);
r--;
}
p=1;
for (int j=0; j<u; j++) p*=0.1;
ep=p;
printf("ep = %f\n",ep);
} //x==-1
else {
for (i=1; i<strlen(s);i++) { r++; }
for (i=1; i<strlen(s)-n_e+1;i++) {
p=1;
for (int j=0; j<i-1; j++) p*=10;
u+=((int)*r-48)*(p);
r--;
}
p=1;
for (int j=1; j<u+1; j++) p*=10;
ep=p;
}
if (z==-1) f=0-(cp+dp)*ep;
else f=(cp+dp)*ep;
return f;
}
else {
byte *r,*t;
int i;
int n_d=0;
t=r=s;
for (i=1;i<strlen(s);i++) {
if (*r=='.') { n_d=i; }
r++;
}
if (n_d==0) n_d=strlen(s)+1;
double cp=0;
r=t;
for (i=1; i<n_d-1;i++){r++;}
for (i=1; i<n_d;i++) {
int p=1;
for (int j=0; j<i-1; j++) p*=10;
cp+=((int)*r-48)*(p);
r--;
}
double dp=0;
r=t;
for (i=1; i<n_d+1;i++) { r++; }
for (i=1; i<strlen(s)-n_d+1;i++) {
double p=1;
for (int j=0; j<i; j++) p*=0.1;
dp+=((int)*r-48)*(p);
r++;
}
if (z==-1) f=0-(cp+dp);
else f=(cp+dp);
return f;
}
}
void main () {
clrscr();
double d=0;
byte s[20];
printf ("Input float number for convert:\n");
scanf ("%s",s);
printf ("Convert float number = %lf",atof(s,d));
fflush (stdin);getchar ();
}
|
|