Redondear números en MT4 mediante NormalizeDouble - página 17

 
pavlick_:

Escribí un poco de código de entrenamiento (me interesaba hurgar por mi cuenta) que hace aparecer las entrañas del número flotante.

La salida en f == 0,5 + 1/(2^24). 1/(2^24) es el dígito más joven de la mantisa en un grado determinado:

¿Qué querías ver allí exactamente? Los números flotantes tienen un bit por signo, 8 bits por exponente y los 23 restantes son mantisa, es decir, la precisión máxima es de 23 decimales en representación binaria, o 7 decimales. Para los números dobles, hay 1 bit por signo, 11 bits por exponente, los 52 bits restantes son la mantisa, la precisión máxima es de 52 decimales en representación binaria o 16 decimales. ¿Por qué hay un código para esto?

 
Sergei Vladimirov:

¿Qué querías ver allí exactamente? Los números flotantes tienen un bit por signo, 8 bits por exponente, los 23 restantes son mantisa, es decir, la máxima precisión de 23 decimales en representación binaria, o 7 decimales. Para los números dobles, hay 1 bit por signo, 11 bits por exponente, los 52 bits restantes son la mantisa, la precisión máxima es de 52 decimales en representación binaria o 16 decimales. ¿Por qué hay un código para esto?

"La teoría sin la práctica está muerta y es infructuosa, la práctica sin la teoría es inútil y perniciosa". Y todo tipo de cosas interesantes con números flotantes abundan:
float a, b, f;
a=123456789;
b=123456788;    
f=a-b;
cout << f;
// cout: 8
 
pavlick_:
"La teoría sin la práctica está muerta y es infructuosa, la práctica sin la teoría es inútil y perjudicial". Y hay todo tipo de cosas interesantes con los números flotantes:

Sólo pensé que tal vez esperabas algo único en MKL.

Y lo del desbordamiento de la mantisa es interesante. Para el primer grado. )

void OnStart()
{
        float f1 = (float)1.1;
        float f2 = (float)2.2;
        float f3 = (float)3.3;
        
        if((f1 * f2) * f3 == f1 * (f2 * f3))
                Print("Выражения равны.");
        else
                Print("Нифига не равны!");
}
 
Para el primer grado. )
Claro, dinos, la mayoría de los programadores no están al día en el tema, y yo mismo tengo algunas lagunas.
 
pavlick_:
Claro, dime, la mayoría de los programadores no están al día en el tema, yo mismo tengo algunas lagunas.
Bueno, no sé, nos formaron en aritmética binaria para que se nos quedara grabada en la cabeza de por vida. ) Otra cosa es que no todos somos programadores. En general, no cree que mi pregunta es una especie de piedra en su jardín, sólo pensé que el propósito de su programa - para ver algunas diferencias en el MCL de la norma, por lo que pregunté.
 
int main(){
  // МКЛ аналог numeric_limits<float>::epsilon() - FLT_EPSILON
  float a = (float)10 + numeric_limits<float>::epsilon();
  float b = (float)1 + numeric_limits<float>::epsilon();
  float c = (float)0.5 + numeric_limits<float>::epsilon();
  print_float(a);
  print_float(b);
  print_float(c);
}

----a--------------
value = 10
mantissa 24:
1,01000000000000000000000
exponenta - 127 = 3

мантиса без прибавки эпсилон:
1,01000000000000000000000
----b--------------
value = 1.0000001192092896
mantissa 24:
1,00000000000000000000001
exponenta - 127 = 0

мантиса без прибавки эпсилон:
1,00000000000000000000000
----c--------------
 value = 0.50000011920928955
mantissa 24:
1,00000000000000000000010
exponenta - 127 = -1

мантиса без прибавки эпсилон:
1,00000000000000000000000