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 ();
}

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz