Tienes toda la razón, la función atof( ) de por sí no funciona como debería puesto que la precisión de un float no es tan exacta como debiera, pero no por la función en sí, sino por la precisión del float. Aun así lo que está claro es que en tu código no va ni a leerse dicha función porque no has incluido la librería <stdlib.h> que es la que la contiene. Además deberías declarar una cadena de carácteres y no un carácter.
Código c:
Ver original#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(){char rt[20];
float numero;
return 0;}
Así no tendrás ni warnings en compilación y funciona "bien". Si ya declaras double en vez de float a "numero" tendrás mucha más precisión, pero a altos niveles pierde exactitud ya te digo. Vale, diréis, "son sólo decimales", ¿pero si luego quieres ese float para multiplicarlo por algo? He hecho en un momentín una implementación y también pierde exactitud, más que nada para ver si era cosa del atof( ) (función que para nada conocía) o de almacenamiento, y queda claro que es de almacenamiento, te la dejo por site interesa saber qué hace atoaf( ) (porque me imagino que esto será lo que hace).
Código c:
Ver original#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(){
char rt[20];
double num = 0.0, aux;
int i, j, k;
/*Nos vamos hasta el último carácter antes de la coma o el punto.*/
/*En caso de que sea un entero, vamos hasta el final del número.*/
for(i=0, j=1; rt[i]>47 && rt[i]<58; ++i);
/*Guardamos la parte entera del número.*/
for(k=i-1; k>-1; --k, j*=10)
num = num + (rt[k]-48)*j;
/*Si estamos en coma o el punto, hay parte decimal, si no, no.*/
if(rt[i]==',' || rt[i]=='.'){
++i;
for(k=1; rt[i]!='\0'; ++k, ++i){
aux = rt[i] - 48;
for(j=0; j<k; ++j)
aux = aux * 0.1;
num = num + aux;
}
}
return 0;
}