problema conversione gradi decimali in sessagesima

ho un problema con questo codice

/*
 44° 24' 40.727
 */

float dato = 44.411313;
void setup()
{
  // start serial port at 9600 bps:
  Serial.begin(9600);
  gradiPrint(dato);
}

void gradiPrint(double number)
{
  

  
  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);
  
  Serial.print(" ");
  

remainder= remainder * 60;

   //Serial.print(remainder);

int_part = (unsigned long)remainder;
  remainder = remainder - (double)int_part;
  Serial.print(int_part);
    
  remainder= remainder * 60;
  
  
      Serial.print(" "); 
      
      
int_part = (unsigned long)remainder;
  remainder = remainder - (double)int_part;
  Serial.print(int_part);
  
 Serial.print(".");

  remainder = remainder*100;

int_part = (unsigned long)remainder;
Serial.print(int_part);


}
void loop(){}

restituisce il risultato sbagliato... l'ultima cifra ma non capisco perchè il processo di conversione dovrebbe essere esatto ma penso ci siano errori di approssimazione nei vari passaggi, ma perchè?

any ideas?

Non ho fatto un controllo aprofodito ma credo che sia causato dalla precisione limitata del formato float che usa Arduino. Con una certo numero di Byte usato per i float i numeri di cifre decimali é limitato. Questo lo noti in questi calcoli.

sulla pagina http://arduino.cc/en/Reference/Float é scritto:

"Datatype for floating-point numbers, a number that has a decimal point. Floating-point numbers are often used to approximate analog and continuous values because they have greater resolution than integers. Floating-point numbers can be as large as 3.4028235E+38 and as low as -3.4028235E+38. They are stored as 32 bits (4 bytes) of information.

Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point. Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.

Floating point numbers are not exact, and may yield strange results when compared. For example 6.0 / 3.0 may not equal 2.0. You should instead check that the absolute value of the difference between the numbers is less than some small number.

Floating point math is also much slower than integer math in performing calculations, so should be avoided if, for example, a loop has to run at top speed for a critical timing function. Programmers often go to some lengths to convert floating point calculations to integer math to increase speed. "

Questo dovrebbe darti risposta al tuo problema.

Ciao Uwe

ok il problema è che sforo le 7 cifre di precisione...

però ora mi sorge un dubbio: come evito di andare oltre le 7 cifre con un float mentre converto?

Non usi uno float ma un unsignet long e moltiplichi il numero per 10.000.00 cosí calcoli con numeri interi e non decimali. Ciao Uwe

nemmeno così!! sforo sicuramente le cifre perchè:

double dato = 44.411313;
void setup()
{
  // start serial port at 9600 bps:
  Serial.begin(9600);
  unsigned long a = (unsigned long)(dato * 1000000);
  Serial.println(a);

}

restituisce: 44411312

noo... non ditemi che è colpa dell'architettura 8 bit....