Rundung von Zahlen in MT4 über NormalizeDouble - Seite 17

 
pavlick_:

Ich habe einen kleinen Übungscode geschrieben (ich wollte selbst ein wenig herumstöbern), der das Innenleben der Gleitkommazahl aufdeckt.

Die Ausgabe bei f == 0,5 + 1/(2^24). 1/(2^24) ist die jüngste Stelle der Mantisse bei einem bestimmten Grad:

Was genau wollten Sie dort sehen? Fließkommazahlen haben ein Bit für das Vorzeichen, 8 Bits für den Exponenten und die restlichen 23 Bits sind die Mantisse, d. h. die maximale Genauigkeit beträgt 23 Dezimalstellen in der Binärdarstellung oder 7 Dezimalstellen. Bei doppelten Zahlen gibt es 1 Bit pro Vorzeichen, 11 Bits pro Exponent, die restlichen 52 Bits sind die Mantisse, die maximale Genauigkeit beträgt 52 Dezimalstellen in binärer Darstellung oder 16 Dezimalstellen. Warum gibt es dafür einen Code?

 
Sergei Vladimirov:

Was genau wollten Sie dort sehen? Fließkommazahlen haben ein Bit pro Vorzeichen, 8 Bits pro Exponent, die restlichen 23 sind Mantisse, d.h. die maximale Genauigkeit von 23 Dezimalstellen in Binärdarstellung oder 7 Dezimalstellen. Bei doppelten Zahlen gibt es 1 Bit pro Vorzeichen, 11 Bits pro Exponent, die restlichen 52 Bits sind die Mantisse, die maximale Genauigkeit beträgt 52 Dezimalstellen in binärer Darstellung oder 16 Dezimalstellen. Warum gibt es dafür einen Code?

"Theorie ohne Praxis ist tot und fruchtlos, Praxis ohne Theorie ist nutzlos und schädlich." Und es gibt allerlei interessante Dinge mit fließenden Zahlen:
float a, b, f;
a=123456789;
b=123456788;    
f=a-b;
cout << f;
// cout: 8
 
pavlick_:
"Theorie ohne Praxis ist tot und fruchtlos, Praxis ohne Theorie ist nutzlos und schädlich." Und es gibt jede Menge interessanter Dinge mit fließenden Zahlen:

Ich dachte nur, dass Sie vielleicht etwas Einzigartiges in MKL erwartet haben.

Und die ganze Sache mit dem Mantissenüberlauf ist interessant. Für die erste Klasse. )

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("Нифига не равны!");
}
 
Für die erste Klasse. )
Sicher, sagen Sie es uns, die meisten Programmierer sind in diesem Bereich nicht auf dem Laufenden, und ich habe selbst einige Lücken.
 
pavlick_:
Natürlich, sagen Sie mir, sind die meisten Programmierer in diesem Bereich nicht auf dem Laufenden, und ich habe selbst einige Lücken.
Nun, ich weiß nicht, wir wurden in der binären Arithmetik geschult, so dass sie sich für immer in unseren Köpfen festgesetzt hat. ) Ein weiterer Punkt ist, dass nicht alle von uns Programmierer sind. Im Allgemeinen denken Sie nicht, dass meine Frage ist eine Art Stein in Ihrem Garten, ich dachte nur, dass der Zweck Ihres Programms - um einige Unterschiede in der MCL von der Norm zu sehen, so fragte ich.
 
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
Grund der Beschwerde: