Merkwürdiges Verhalten der pow-Funktion

8

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?

    
Mayank Jha 09.08.2013, 21:25
quelle

5 Antworten

14

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.

    
user85109 09.08.2013 21:28
quelle
10

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)) .

    
Lee Daniel Crocker 09.08.2013 21:30
quelle
9

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.

    
DrYap 09.08.2013 21:27
quelle
1

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:

%Vor%

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%     
JackCColeman 09.08.2013 22:48
quelle
0

Niemand hat geschrieben, wie man wirklich richtig macht - anstelle von pow function muss man nur eine Variable haben, die die aktuelle Macht verfolgt:

%Vor%

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.

    
Antti Haapala 28.06.2017 21:34
quelle

Tags und Links