Kann mir jemand erklären, wie das [.precision]
in printf mit dem Spezifizierer "% g" funktioniert? Ich bin ziemlich verwirrt von der folgenden Ausgabe:
Ich habe gelernt, dass %g
die kürzeste Darstellung verwendet.
Aber die folgenden Ausgaben verwirren mich immer noch
%Vor% Meine Frage ist: Warum gibt %.16g
die genaue Anzahl an, während %.17g
nicht?
Es scheint, dass 16 signifikante Ziffern genau sein können. Könnte mir jemand den Grund sagen?
%g
verwendet die kürzeste Darstellung.
Gleitkommazahlen im Computer werden nicht mit der Basis gespeichert von 10
, aber 2
. Das bedeutet, dass es in der Regel einige Rundungsfehler gibt, wenn eine Dezimalzahl in einem Fließkomma-Binärwert dargestellt wird.
Wenn Sie %.16g
angeben, sagen Sie, dass Sie die kürzeste Darstellung mit einem Maximum von 16
signifikant signifikanten Ziffern wünschen.
Wenn die kürzeste Darstellung mehr als 16
Ziffern hat, wird printf
sie verkürzen. Kürzung wird die 2
am Ende schneiden, so dass Sie mit 3122.550000000000
, das ist tatsächlich 3122.55
in der kürzesten Form, das ist, warum die Zahl.
%g
gibt Ihnen immer das kürzeste mögliche Ergebnis, aber wenn Sie sagen, dass Sie 17
Genauigkeitsstellen möchten, und 17
th Stelle einen Wert enthält, der sich von 0
unterscheidet, erhalten Sie am Ende alle Nullen und der Wert am Ende: 3122.5500000000002
.
Meine Frage ist: warum
%.16g
gibt die genaue Anzahl, während%.17g
kann nicht?
Es ist tatsächlich die %.17g
, die Ihnen das genaue Ergebnis gibt, während %.16g
Ihnen nur eine ungefähre Rundung mit einem Fehler liefert (im Vergleich zum Wert im Speicher).
Wenn Sie eine festere Genauigkeit wünschen, verwenden Sie stattdessen %f
oder %F
.