4 Stimmen

Kann ich erwarten, dass die Werte von Fließkommazahlen, die ich von Literalkonstanten festlege, nach der Zuweisung an andere Variablen unverändert bleiben?

Wenn ich so etwas mache:

float a = 1.5f;
float b = a;

void func(float arg)
{
  if (arg == 1.5f) printf("Du bist großartig!");
}

func(b);

Wird der Text jedes Mal gedruckt (und auf jedem Rechner)?

EDIT

Ich meine, ich bin mir nicht wirklich sicher, ob der Wert irgendwann durch die FPU geht, auch wenn ich keine Berechnungen durchführe, und wenn ja, ob die FPU die binäre Darstellung des Werts ändert. Ich habe irgendwo gelesen, dass die (ungefähren) gleichen Gleitkommawerte mehrere binäre Darstellungen nach IEEE 754 haben können.

0voto

Nathan Fellman Punkte 115324

Es sollte jedes Mal und auf jedem Gerät gedruckt werden. Sie verwenden nicht das Ergebnis einer Berechnung, daher gibt es keinen Grund anzunehmen, dass sich die Werte ändern würden.

Eine Einschränkung: Bestimmte "magische" Zahlen stammen möglicherweise nicht aus dem Speicher. Auf x86 haben wir die folgenden Anweisungen:

  • FLDZ - lädt 0,0 in ST(0)
  • FLD1 - lädt 1,0 in ST(0)
  • FLD2T - lädt log2(10) in ST(0)
  • FLD2E - lädt log2(e) in ST(0)
  • FLDPI - lädt pi in ST(0)
  • FLDLG2 - lädt log10(2) in ST(0)
  • FLDLN2 - lädt ln(2) in ST(0)

Wenn Sie also mit einem dieser Werte vergleichen und möglicherweise nicht den genauen Wert wie das von Ihnen referenzierte const-Literal erhalten.

0voto

xtofl Punkte 39285

Ich glaube nicht, dass es gleich verhalten wird:

float f1 = .1; 
// compiliert als
// 64-Bit-Literal in EAX:EBX

if( f1 == .1 ) 
// lädt .1 in 80 Bits des FPU-Registers 1
// kopiert EAX:EBX in FPU-Register 2 (lässt die letzten 16 Bits unverändert)
// ruft FPU-Vergleichsinstruktion auf
//

Wenn der Compiler den oben genannten Code generiert, wird die Bedingung niemals wahr sein: Die 16 Bits werden unterschiedlich sein, wenn die 64-Bit-Version von .1 mit ihrer 80-Bit-Version verglichen wird.

Zusammenfassend: nein: Sie können mit diesem Code auf jedem einzelnen Rechner keine Gleichheit garantieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X