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 (); }
гостевая; E-mail |