Beim Ausführen der folgenden Codezeilen:
%Vor% Ich war überrascht, die Ausgabe zu sehen, es kommt heraus, dass es 1
10
99
1000
9999
statt 1
10
100
1000
10000
ist.
Was könnte der mögliche Grund sein?
Hinweis
Wenn Sie glauben, dass es eine Gleitkomma-Ungenauigkeit ist, die in der obigen for-Schleife bei i = 2
liegt, sind die in der Variablen a
gespeicherten Werte 99
.
Aber wenn du stattdessen schreibst
%Vor% Nun wird der Wert von a als 100
ausgegeben. Wie ist das möglich?
Ich kann nicht einmal c buchstabieren, aber ich kann dir sagen warum.
Sie haben a
als int
festgelegt. pow()
erzeugt eine Fließkommazahl, die in EINIGEN Fällen nur ein Haar weniger als 100 oder 10000 sein kann (wie wir hier sehen können.)
Dann stopfst du das in die ganze Zahl, die zu einer ganzen Zahl TRUNKT. Sie verlieren also diesen Bruchteil. Hoppla. Wenn Sie wirklich ein Integer-Ergebnis benötigen, kann round eine bessere Methode für diese Operation sein.
Seien Sie vorsichtig, auch wenn die Leistung groß genug ist, kann der Fehler tatsächlich groß genug sein, um einen Fehler zu verursachen, der Ihnen etwas gibt, was Sie nicht erwarten. Denken Sie daran, dass Fließkommazahlen nur so viel Präzision tragen.
Die Funktion pow()
gibt eine double
zurück. Sie weisen es der Variablen a
vom Typ int
zu. Dadurch wird der Gleitkommawert nicht "abgerundet", sondern gekürzt. Also gibt pow()
etwas wie 99.99999 ... für 10 ^ 2 zurück, und dann schmeißt man einfach den .9999 ... Teil weg. Besser sagen a = round(pow(10, i))
.
Dies ist mit Fließkomma-Ungenauigkeit zu tun. Obwohl Sie int
s übergeben, werden sie seit dem pow
implizit in einen Gleitkommatyp konvertiert Funktion ist nur für Fließkomma-Parameter definiert.
Mathematisch ist die ganzzahlige Potenz einer ganzen Zahl eine ganze Zahl.
In einer guten Qualität pow()
Routine sollte diese spezielle Berechnung keine Rundungsfehler erzeugen. Ich habe Ihren Code auf Eclipse / Microsoft C ausgeführt und folgende Ausgabe erhalten:
Dieser Test gibt NICHT an, ob Microsoft Floats und Rundungen verwendet oder ob sie den Typ Ihrer Zahlen erkennen und die entsprechende Methode auswählen.
Also, ich habe den folgenden Code ausgeführt:
%Vor%Und bekam folgende Ausgabe:
%Vor% Niemand hat geschrieben, wie man wirklich richtig macht - anstelle von pow
function muss man nur eine Variable haben, die die aktuelle Macht verfolgt:
Diese fortlaufende Multiplikation mit zehn liefert garantiert die richtige Antwort und ist ganz OK (und viel besser als pow, selbst wenn es die richtigen Ergebnisse liefert) für Aufgaben wie das Konvertieren von Dezimalzeichenfolgen in ganze Zahlen.