TODOPIC

Otros Microcontroladores / Dispositivos programables => Arduino => Mensaje iniciado por: humberto 02 en 07 de Mayo de 2017, 12:26:02

Título: Aporte - Cálculos con muchos Decimales en Arduino
Publicado por: humberto 02 en 07 de Mayo de 2017, 12:26:02
(https://k61.kn3.net/taringa/8/A/E/8/F/6/Humberto02/AEF.jpg)

Es hora de volver a la escuela: Números Reales

El conjunto de los números reales pertenece a la recta numérica que comprende a los números racionales y a los números irracionales. Esto quiere decir que incluyen a todos los números positivos y negativos, el símbolo cero, y a los números que no pueden ser expresados mediante fracciones de dos enteros que tengan como denominador a números no nulos (excluye al denominador cero).

¿Intentaste trabajar con un GPS, Sensor de Temperatura, Balanza, etc. Con ARDUINO?

Dependiendo del trabajo que desarrolles con Arduino verás que es casi imposible operar con decimales “confiables”.

Para ello haremos este ejemplo

Suma de valores
33,5672311112 + 12,5555517456

Si comenzamos a trabajar con el Visor Serial verás que los decimales cambian y por ende el resultado no será el correcto.

Sketch normal (con resultados incorrectos)
Código: [Seleccionar]
#define test_type float
#include <SoftwareSerial.h>

test_type AA = 23.1213333891;
test_type BB = 12.2311211112;
test_type CC = AA + BB;
test_type DD = CC * -1;

void setup(){
     Serial.begin(9600);

     Serial.print("AA= ");
     Serial.println(AA,10);
     Serial.print("BB= ");
     Serial.println(BB, DEC);
     Serial.println("");
     Serial.print("CC con DEC= ");
     Serial.println(CC, DEC);
     Serial.print("CC con ,10= ");
     Serial.println(CC,10);
     Serial.print("DD es CC*-1= ");
     Serial.println(DD, 10);
}

void loop(){}

¿Cómo resolvemos este problema?
Afortunadamente contamos con una librería que lo resuelve

Código: [Seleccionar]
#include <BigNumber.h>
#include <SoftwareSerial.h>

void setup(){
     Serial.begin(9600);
     BigNumber::begin(10);
     
     BigNumber A = ("23.1213333891");
     BigNumber B = ("12.2311211112");
     BigNumber C ("-1");
     BigNumber D ("");
     
     D = (A + B) * C;
     
     Serial.print("A ");
     Serial.println(A);
     Serial.print("B ");
     Serial.println(B);
     Serial.print("C ");
     Serial.println(C);
     Serial.print("D ");
     Serial.println(D);
}

void loop(){}


Aquí podrás levantar la librería para trabajar con los decimales:
http://www.gammon.com.au/Arduino/BigNumber.zip (http://www.gammon.com.au/Arduino/BigNumber.zip)

Espero que tengas muy presente este tema, podrías necesitarlo algún día.

Desde Gualeguaychú Entre Ríos te envío un Cordial Saludo y como siempre ... Te deseo lo mejor!
Título: Re:Aporte - Cálculos con muchos Decimales en Arduino
Publicado por: KILLERJC en 07 de Mayo de 2017, 14:34:58
Me fije exactamente como es que se maneja, y por dentro lo hace con strings, lo que si toca uno de los temas que en los microcontroladores no usamos, que es la memoria dinamica. De todas formas buena libreria.

Para los que quieren usarla y no de Arduino pueden usar los archivos number.*
Título: Re:Aporte - Cálculos con muchos Decimales en Arduino
Publicado por: fandiño en 24 de Junio de 2017, 22:17:03
muy bueno, no sabia que eso existía. es útil para nuestros proyectos de electricidad.