Frage

int main()
{
  float x=3.4e2;
  printf("%f",x);
  return 0;
}

Ausgabe:

340.000000  // It's ok.

Aber wenn Schreib x=3.1234e2 die Ausgabe 312.339996 und wenn x=3.12345678e2 die Ausgabe 312.345673.

Warum sind die Ausgänge dieser Art? Ich denke, wenn ich die Ausgabe sein sollte x=3.1234e2 schreiben 312.340000, aber die tatsächliche Ausgabe ist 312.339996 GCC Compiler.

War es hilfreich?

Lösung

Nicht alle Bruchzahlen haben eine exakte binäre Äquivalent, so dass es auf den nächsten Wert gerundet wird.

Vereinfachtes Beispiel:

Wenn Sie 3 Bits für die Fraktion, können Sie haben:

0
0.125
0.25
0.375
...

0,5 hat eine genaue Darstellung, aber 0,1 als 0.125 gezeigt werden.

Natürlich sind die wirklichen Unterschiede sind deutlich kleiner.

Andere Tipps

Gleitkommazahlen werden normalerweise als Binärbrüche mal eine Potenz von zwei, für die Effizienz dargestellt. Dies ist etwa so genau wie Basis 10 Darstellung, mit der Ausnahme, dass es Dezimalzahlen, die nicht genau als binäre Fraktionen dargestellt werden. Sie werden stattdessen als Annäherungen dargestellt.

Darüber hinaus ist ein float normalerweise 32 Bits lang, was bedeutet, dass es nicht so viele signifikante Ziffern hat. Sie können in Ihren Beispielen, dass sie genau auf etwa 8 signifikanten Stellen sehen.

Sie sind jedoch der Druck, die Zahlen etwas über ihre Bedeutung, und deshalb sind Sie den Unterschied sehen. Sehen Sie sich Ihre printf Format-String-Dokumentation zu sehen, wie weniger Stellen drucken.

können Sie müssen genau Dezimalzahlen darstellen; Dies geschieht häufig in Finanzanwendungen. In diesem Fall benötigen Sie eine spezielle Bibliothek verwenden Zahlen darzustellen, oder einfach berechnen alles als ganze Zahlen (wie Mengen, wie Cent statt wie Dollar und Fraktionen von einem US-Dollar darstellt).

Das Standard ist Was jeder Informatiker Should Know About Gleitkommaarithmetik , aber es sieht so aus, dass für Sie sehr weit fortgeschritten wäre. Alternativ könnten Sie Google Gleitkommaformate (insbesondere IEEE-Standard-Formate) oder auf Wikipedia nachschlagen, wenn Sie die Details wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top