Paradoja de NormalizarDoble - página 11

 
transcendreamer:

Lo que me molesta es que cuando calculo un número fraccionario, lo normalizo, lo escribo en una variable y luego lo leo y lo normalizo de nuevo, me salen colas

Por ejemplo

basis[0]=NormalizeDouble(sum_A,2);

GlobalVariableSet("Equity-"+portfolio_id,basis[0]); 

...

current=NormalizeDouble(GlobalVariableGet("Equity-"+portfolio_id),2);

text = "Positions synchronized at " + current + " for portfolio: " + portfolio_name;

if(!automatic) MessageBox(text,""); else Print(text);

Ahora lo he cambiado por

text = "Positions synchronized at " + DoubleToStr(current,2) + " for portfolio: " + portfolio_name;

if(!automatic) MessageBox(text,""); else Print(text);

y parece que no hay colas, whew, whew, whew...

Ya he escrito, lo repetiré: algunos números no existen en binario. No hay 0,1, ni 0,3 y muchos otros. No importa cuántas veces escribas double val = NormalizeDouble(0.1434, 1), nunca obtendrás 0.1 porque no existe tal número.

Por ejemplo, los números se representan de la siguiente manera:

0,1 = 0,10000000000000001
0,2 = 0,2000000000001
0,3 = 0,2999999999999999999
0,4 = 0,4000000000000000002
0,6 = 0,59999999999999998

pero
0,125 = 0,125
0,25 = 0,25
0,5 = 0,5

Si esto es muy molesto, tienes que redondear o escribir tu propia bicicleta para representar números fraccionarios (puede haber algunas bibliotecas, no he mirado en ello) que no utilizarán fpu.

Y no se añaden colas durante la conversión a cadena, están ahí inicialmente.

 
transcendreamer:

así que he resuelto mi pregunta, podemos cerrar el tema

solución: hay que forzar el redondeo, incluso después de la normalización

Solución equivocada. Al redondear, hay que multiplicar, redondear y dividir. Después de la última división, el número no estará normalizado.
 
transcendreamer:

muy posiblemente... pero en cuanto al resultado final, ¡hay cola!

...

No hay colas después de la normalización.
 
Integer:
No hay colas después de la normalización.

Creo que estás engañando al hombre. ¿Qué quiere decir que no hay colas después de la normalización? No puede haber colas sólo en la cadena que obtuvimos de un número y redondeamos el valor (redondeado ya en la cadena, no en el doble). Pero hay colas después de NormalizeDouble().

 
Integer:
Solución equivocada. Al redondear, hay que multiplicar, redondear y dividir. Después de la última división, el número no estará normalizado.

¿Qué quiere decir con normalización? Stringo decía aquí que el algoritmo es algo así:

double NormalizeDouble(double val, int digits)
{
    val *= 10 ^ digits
    округляем к ближайшему целому
    val /= 10 ^ digits
    return val
}
 
pavlick_:

Creo que estás engañando al hombre. ¿Qué quiere decir que no hay colas después de la normalización? No puede haber colas sólo en la cadena que obtuvimos de un número y redondeamos el valor (redondeado ya en la cadena, no en el doble). Pero después de NormalizeDouble() hay colas.

Bueno, si te gusta creer que estoy engañando a alguien, créeme. He visto todo tipo de personas aquí, no me sorprenderá su posición de "principios".
 
pavlick_:

¿Qué quiere decir con normalización? Stringo decía aquí que el algoritmo es algo así:

Sería mucho más interesante lo que usted entiende por normalización.
 
Integer:
Te hago una pregunta concreta y me echas agua. Es normal que expliques y argumentes tu punto de vista.
 
pavlick_:
Te hago una pregunta concreta y me echas agua. ¿Cómo es normal explicar y argumentar tu punto de vista?
¿Leer los libros de texto y la documentación en voz alta, o qué? ¿O leer el diccionario en voz alta, sobre la palabra "aproximadamente"?
 
Integer:
¿Leer los libros de texto y la documentación en voz alta o qué? ¿O leer el diccionario en voz alta, sobre la palabra "aproximadamente"?
Está claro, no tenemos nada que hablar. Y será mejor que no te metas en las conversaciones si no eres responsable de tus palabras.
Razón de la queja: