7000 OK
25000 OK
40000 OK
18464 Tu esperas 84.000 pero te pone eso menos el limite (84.000-65536)
2928 Tu tsperas 144.000 pero te pone eso menos dos limites (144.000-65536-65536)
15392 Tu esperas 212.000 pero te pone eso menos tres limites (212.000-65536-65536-65536)
int x = 20000;
long xlong;
int rint;
long rlong;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("valor de x: ");
Serial.println(x);
rint=(x+x);
Serial.print("valor de x+x en un INT: ");
Serial.print(rint);
Serial.println(" SE DESBORDO");
rlong=(x+x);
Serial.print("valor de x+x en un LONG: ");
Serial.print(rlong);
Serial.println(" TAMBIEN SE DESBORDO");
xlong=x;
rlong=(xlong+xlong);
Serial.print("valor de x+x en un LONG pasando previamente el valor de x a un LONG: ");
Serial.print(rlong);
Serial.println(" FUNCIONA !!!");
delay(30000);
}
Ambas propuestas han funcionado, y se obtiene el resultado correcto sin "desbordaminetos".
La de GO_zalo:
int n = 6;
int x[6] = {7000, 9000, 5000, 11000, 10000, 13000};
int y[6] = {1, 2, 3, 4, 5, 6};
long sumXY;
sumXY += (long)x * (long)y*; * 2) La de cas6678: int n = 6; long x[6] = {7000, 9000, 5000, 11000, 10000, 13000}; long y[6] = {1, 2, 3, 4, 5, 6}; long sumXY; sumXY += x * y*;* Muchas gracias a los dos!!! Un abrazo
Hola.
El problema es mas simple, define X e Y como unsigned int, porque el desbordamiento se produce al rebasar el +32767 que pasa a ser considerado como entero negativo.
Ejemplo:
/*
1 * 7000 = 7000
2 * 9000 = 18000
3 * 5000 = 15000
4 * 11000 = 44000
5 * 10000 = 50000
6 * 13000 = 78000
RESULT sumXY = 212000
*/
long n = 6; // number of data points input so far
unsigned int x[6] = {7000, 9000, 5000, 11000, 10000, 13000};
unsigned int y[6] = {1, 2, 3, 4, 5, 6};
long sumXY;
void setup() {
Serial.begin(9600);
}
void loop() {
sumXY = 0; //initialize variables to 0
for (int i = 0; i < n; i++) {
sumXY += x[i] * y[i]; //sum(x[i]*y[i])
}
Serial.println(sumXY);
delay(10000);
}
A fin de cuentas un entero con signo cubre el rango +32767 a -32768, que es ampliamente rebasado en tu ejemplo. Sin embargo un entero sin signo cubre el rango 0 a +65535 que es suficiente.
Parece que esta semana es la semana del UNSIGNED....
Alfaville. El ejemplo que has puesto esta mal. Te sugiero que copies tu codigo y lo hagas correr y nos comentes los resultados. Es verdad que en tu ejemplo el desbordamiento se produce mas tarde, pero se produce igual.
Dices que 65535 es sufucuente, al parecer no has leido ni las primeras lineas del primer mensaje donde gdconesa nos dice que quiere llegar a 212.000
Si sigo tu codigo me dara si no me equivoco 146464 (212000-65535)
Con respecto a la solucion de GO_zalo, evidentemente es mas practica que la mia porque consume muchos menos recursos, no hace que todo el array sea un long sino que solo lo convierte a long una vez (una vez por cada ciclo de for), me gusta mas.