Estoy teniendo un problema en una operación matemática y no me doy cuenta cual puede ser la cusa
El código:
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
int MOD = 25000;
float N = 90.24;
int INT =90;
float FRAC = (( N - (float)INT) * (float)MOD);
Serial.print("FRAC ");
Serial.println(FRAC);
}
Jopapa
El resultado debe ser entero (90,24-90)*25000=debería dar 6000
Voy a leer la documentación haber si entiendo pero no debería pasar
Otro ejemplo es
La misma cuenta (90.24-90)*250 el resultado es correcto da 60 tanto en el Arduino como en la vida real es como que algo esta mal definido
Lo que está ocurriendo es lo que te dice Jopapa. Para comprenderlo plenamente, deberías saber cómo se almacenan los números en coma flotante binaria. Es un tema que requiere un tiempo comprender; pero si intentas sencillamente transformar 0,24 a binario verás que te salen muchiiiiiisimos decimales (probablemente incluso resulte un número binario periódico). Otra cosa es que internamente haya redondeos, que directamente te muestren en pantalla el número que quieres ver, pero a medida que se hacen cálculos con ellos ese pequeño desvío se va notando más, hasta que se ven en pantalla.
Bueno esto es así que le vamos a hacer encontré una posible solución
Como MOD lo obtengo de otra cuenta
unsigned int MOD = ((1000*(_FreqRef / PasoCanal)));
FreqRef , PasoCanal son enteros entonces lo puedo hacer en 2 pares
MOD1 = ((FreqRef / PasoCanal)));
MOD = ((1000*( MOD1)));
N lo obtengo de una división por las pocas pruebas que realice no note el problema de punto flotante con este tipo de operación
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
int MOD = 25000;
int MOD1 =25;
float N = 90.16064;
int INT =90;
unsigned long NL= N*100000;
unsigned long INTL=INT*100000;
long NLINTL= NL-INTL;
Serial.print("NL ");
Serial.println(NL);
Serial.print("INTL ");
Serial.println(INTL);
Serial.print("NLINTL ");
Serial.println(NLINTL);
//float FRAC = (( N - (float)INT) * (float)MOD);
unsigned long FRAC =(NLINTL* MOD1)/100;
Serial.print("FRAC ");
Serial.println(FRAC);
}
Por el momento lo que preciso son 5 dijitos de presicion capas que estoy encarando mal todo la parte matemática pero por el momento es lo que me va saliendo
Estoy muy agradecido de que me puedan seguir aconsejando
Perón por la demora no es que lo deje colgado pero se termino la licencia y denuedo a trabajar y no me queda mucho tiempo para el hobby
Lo que tengo que calcular son unos parámetros de configuración del generador de clok a partir de la frecuencia que quiero a la salida