Hola
Hice pruebas con el convertidor de números que trae CCS.
Primero ingresé el flotante 4805.8021, y el convertidor entrega 0x8B162E6B como los datos que se ingresan a los 4 bytes de la variable.
Luego borré el dato que capturé en flotante y borré el int que me entregó, y pegué el entero 0x8B162E6B para ver como hacía la reconversión a flotante...
El error que existe se debe a que se debe truncar el número flotante para poderlo convertir. El error que aquí existió es: -0.0001.
Hice otra prueba:
Flotante capturado: 123.45689999999 flotante binario: 8576E9EF
Binario capturado: 8576E9EF Flotante reconvertido: 1.2345690E+02
Error: 0.00000000001
Flotante capturado: 32.650856423 flotante binario: 84029A7A
Binario capturado: 84029A7A Flotante reconvertido: 3.2650856E+01
Error: 0.029999577
Flotante capturado: 0.0023657223321 flotante binario: 761B0A3C
Binario capturado: 761B0A3C Flotante reconvertido: 2.3657223E-03
Error: -0.0000000000321
Flotante capturado: 6.5434562136466 flotante binario: 815163FE
Binario capturado: 815163FE Flotante reconvertido: 6.5434560E+00
Error: -0.0000002136466
El error varía dependiendo del tamaño del entero, su exponente y la cantidad de decimales, pero la reconversión nunca es igual al número completo original, lo trunca.
También puse el número 4805.802123654654654654, y el int que genera deja de cambiar, se queda fijo en 0x8B162E6B, a partir del noveno dígito ignora los decimales.
Leí el archivo float.h de ccs y encontré que sí existe el double, hice una prueba con double y sí me dejó compilar...
#include <18F452.h>
#use delay(clock=4000000)
#include <stdlib.h>
char cadena[12]={"4805.8021"};
double total;
void main()
{
total=(double)atof(cadena);
while(1);
}
Pero no lo pude simular, no sé si funcione, sobre todo porque atof entrega datos en float, y pues aunque use el casting no sirve de mucho.
Además el archivo float.h no muestra diferencia alguna entre float, double y long double, que es como mencionas Gonzalo.