Archiv verlassen und diese Seite im Standarddesign anzeigen : math.h: pow() rechnet falsch?
Moin!
Folgende Zeile:
printf( "%u\n", pow( 2, 8*sizeof(int) ) -1 ); gibt mir 4292870144 aus, obwohl sie ja, laut Taschenrechner, 4294967295 ausgeben müsste. Auch mit
pow(2, 32) - 1 ist das Ergebnis falsch.
Woran liegt das?
anda_skoa
15-03-2007, 16:40
Ein double kann zwar einen sehr großen Zahlenraum abbilden, aber eben nur mit eingeschränkter Präzission.
Ciao,
_
%u ist doch das Umwandlungszeichen für eine vorzeichenlose Ganzzahl. Die 2^32 müsste eigentlich den Zahlenbereich eines vorzeichenlosen Integers umfassen. Wenn ich die -1 weglasse, wird auch 0 ausgegeben. So weit passt das also, nur das Ergebnis ist falsch.
Einen double-Wert habe ich doch da nirgends drin.
Yonibear
15-03-2007, 18:40
Das Problem ist dass der Format-String nicht dafür sorgt dass die Funktion wirklich die entsprechenden Typen erwartetet. Du übergibst also einen double, der als Integer interpretiert wird, was natürlich Unsinn ist.
Du musst also entweder %f im Format-String verwenden oder du castest das Ergebnis explizit nach unsigned int.
anda_skoa
15-03-2007, 20:43
Einen double-Wert habe ich doch da nirgends drin.
Komisch, die Manpage von pow() sagt bei mir, daß es diese Signatur hat
double pow(double x, double y);
Ciao,
_
peschmae
15-03-2007, 21:10
gcc -Wall hätte alles verraten. Aber damit wäre Programmieren ja langweilig ;)
MfG Peschmä
Komisch, die Manpage von pow() sagt bei mir, daß es diese Signatur hat
double pow(double x, double y);
Ah, ja... richtig.
Gibt es eine Möglichkeit Exponentialrechnung innerhalb des Wertebereichs eines Integers ohne Ungenauigkeiten durchzuführen, ohne aufs * zurückgreifen zu müssen?
Ah, ja... richtig.
Gibt es eine Möglichkeit Exponentialrechnung innerhalb des Wertebereichs eines Integers ohne Ungenauigkeiten durchzuführen, ohne aufs * zurückgreifen zu müssen?
Ich kenn keine - aber davon unabhängig ist pow(2, 32) nicht im Wertebereich eines Integers. Ein int kann nur bis zu (2^31)-1 darstellen. Selbst ein uint kann nur bis zu (2^32)-1.
Um aber pow(2,32)-1 auszurechnen, musst du erstmal pow(2,32) ausrechnen. Damit hast du dann einen Überlauf und somit entweder negative (int) oder "nur" sehr kleine Zahlen (uint), in jedem Fall aber nicht das Ergebnis von 2^32.
Du brauchst hier mindestens 64 bit Zahlen - mach dich evtl. sogar mal auf die Suche nach einer Mathe Bibliothek.
Wozu brauchst du das ganze denn überhaupt? Wenn du einfach nur einem int sein Maximum zuweisen willst, reicht auch z.B. INT_MAX.
CU
Andi
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.