Corro el programa así:
ShotExc = BallXF-374.6
y resulta 1.70530256582424e-13
...lo corro así:
ShotExc = BallXF
y resulta 374.6
O SEA: Lo segundo es lo que busco, lo que creo está bien, pero también le quiero restar 374.6 (para saber si es mayor que eso mismo; antes de llevarlo a programación lo había hecho en Excel sin do whiles, etc, el punto es que por eso no se me ocurrió usar comparaciones con if). AHORA........... Cuando a BallXF (que en este caso es 374.6) le resto 374.6... ME DA UN RESULTADO RARO @%#!!!!! WHY?????
ShotExc en ese caso debería ser 0 !!!!!!!
Flash 5 (the very old one, maybe is for that).
Probé así por las dudas:
ShotExc = Number (BallXF)-374.6;
...pero no cambia.
Así:
ShotExc = BallXF;
ShotExc = ShotExc-374.6;
...y sigue.
Así:
ShotExc = Number (BallXF);
ShotExc = ShotExc-374.6;
DAMN!!!
Ok lo puedo solucionar con un if (aunque si quiero usar la diferencia respecto a 374.6 la tengo que escribir manualmente O.O ), pero esto me preocupa, debe haber algún error mío o, sino....... Si hay cuentas que la compu o Flash 5 o lo que sea no hace bien, y pretendo hacer un programa que hace cuentas MUY VARIADAS, entonces posiblemente ocurra más de un error. Bueno supongo que es normal que haya errores pero... ¿por cuentas tan simples? Me había pasado con +0.1 o cosas por el estilo, pero esto es distinto, es más: Hago esto:
ShotExc = BallXF*10;
y me da 3746 o sea bien.
Hago esto:
ShotExc = -374.6*10;
y me da -3746
is good too!
Entonces, hago esto:
ShotExc = BallXF*10-374.6*10;
(en verdad tendría que hacer (BallXF*10-374.6*10)/10 pero como debe dar 0 no importa el /10).
y me da 0. Nop, me da: 1.81898940354586e-12
¿?
ShotExc = (BallXF*10-374.6*10)/10;
1.81898940354586e-13
¿Alguna idea, consejo, etc?
ShotExc = BallXF-374
0.600000000000193
???
Sobran 0.000000000000193
ShotExc = BallXF-0.6;
374
ShotExc = ShotExc-374;
1.70530256582424e-13
ShotExc = BallXF-0.6;
374
ShotExc = ShotExc-373;
1.00000000000017
ShotExc = ShotExc-1;
1.70530256582424e-13
Qué hace???? Supongo que el 17 tiene algo que ver con el 1.7 y el -13 con los 13 ceros antes del punto, pero igual ¿por qué no da 0.00000000000017 ?
¡Hola! Te estás topando con el hermosísimo problema de los números de punto flotante. En los lenguajes típicos, la forma de representar números reales es con punto flotante. En vez de guardar 3.3333... con precisión infinita, se guarda una cantidad finita de dígitos (en base 2).
Al restar dos números muy parecidos, en vez de obtener 0 estás obteniendo un número muy chiquito: 1.70530256582424e-13 son doce ceros después de la coma y después 1705 y el resto. "e-13" significa "el número anterior multiplicado por 10 elevado a la -17", que da ese valor minúsculo.
A veces es molesto que 0 no dé 0. Si realmente querés que te dé 0, podés hacer:
valor = calcularValor;
if (valor < 0.00001) && (valor > -0.00001) {
vvalor = 0;
}
Pah no entendí mucho, me gustaría pero preciso ver ejemplos y todo eso veré como hago. Pero muy buena la solución ^^ +1 para NaBUru!
No me di cuenta tanto en el momento pero tu respuesta me sirvió pila para entender que no era que la compu estuviera haciendo mal las cuentas ni error mío. Thanks!
Dije mal, e-13 obviamente significa "el número anterior multiplicado por 10 elevado a la -13", no -17.
El estándar internacional IEEE 754 (http://en.wikipedia.org/wiki/IEEE_754-2008) propone al detalle cómo se representar los números en punto flotante.
Para hacerla fácil, con 32 bits se puede hacer precisión simple. IEEE 754 dice:
o- 1 bit es para el signo del número.
o- 8 bits van para el exponente, es decir cubre números desde 10 elevado a la -126 hasta elevados a la 127.
o- 23 son para la base, es decir números desde 1,1000000 hasta 1,11111111 (en binario). El bit antes de la coma siempre es 1 y no se guarda en ningún bit.
Un número es signo * 1,base * 10^exponente. Por tanto, si el bit del signo es 0, el exponente es 0 y la base es 1001, el número es 1,00001001 * 10^0, es decir 1,00001001 * 1, es decir 1,03515625.
Si te preguntás cómo se calculan los "decimales" en binario es fácil:
o- 1b es 1, 10b es 2, 100b es 4, 1000b es 8...
o- 0,1b es 1/2, 0,01b es 1/4, 0,001b es 1/8, 0,0001b es 1/16...
No me acuerdo cómo se representa el cero.
Eso de los bits me es muy complicado, lo que me interesa en este momento es lo básico digamos: ¿Estar elevado a la -13 significa que tiene 12 ceros delante? Más simple: ¿1^-5 = 0.0001?
No me acuerdo de memoria, lo tengo que pensar:
1 = 10^0
10 = 10^1
100 = 10^2
0,1 = 10^-1
0,01 = 10^-2
0,001 = 10^-3
0,0001 = 10^-4
0,00001 = 10^-5
una pequeña aclaración: es
(-1)^ signo * 2 ^ exponente * 1,base (siendo la base del exponente el 2, no 10).
Uy, tenés razón, cuando puse "signo * 1,base * 10^exponente" debí decir "signo * 1,base * 2^exponente". ¡Gracias!
You must log in to post.