Anderes Ergebnis? Wo ist der Fehler!
-
#include <iostream> #include <math.h> using namespace std; int main() { double zahl1=0; double val1 = pow(71, 37); cout<<val1<<endl<<endl; zahl1=fmod(val1, 3713); cout<<zahl1; return 0; /*Nur leider ist mein Ergebnis mit dem C++ Programm = 1927 und mit dem Windows-Rechner 1875 Vielleicht können Sie mir Helfen bei diesem Problem c= 71 (mitBasiswert 37) Modulo 3713; Das Ergebnis vom Windows-Rechnerist das richtige Ergebnis, meint zumindest mein Studienheft */ }
-
double ist ein Gleitkommatyp, d.h. bei großen Zahlen (wie es bei 71^37 der Fall ist) kommt es zu Ungenauigkeiten in den für dich wichtigen niedrigen Stellen. Da es für dich offenbar auf den genauen Wert ankommt würde ich dir zu numerisch genauen Datentypen raten.
Ich weiß gerade nicht auswendig ob ein 128bit-Integer für so große Zahlen bereits ausreicht, falls nicht, such im Internet nach "big integer c++".
Wenn es dir rein um das Ergebnis geht:
http://www.wolframalpha.com/input/?i=71^37+mod+3713
Der Windows-Rechner ist also korrekt.MfG SideWinder
-
Lösungsvorschlag? (Für das richtige Programm)
-
a*b mod c = ( a mod c ) * ( b mod c ) mod c
Das kann benutzt werden, Zwischenergebnisse klein zu halten und du kannst mit normalen integern arbeiten.
z.B.#include <iostream> using namespace std; int sqr(int x) { return x * x; } int pow_mod(int base, int exp, int mod) { return exp == 0 ? 1 : sqr( pow_mod( base, exp / 2, mod ) ) * ( exp % 2 ? base : 1 ) % mod; } int main() { cout << pow_mod( 71, 37, 3713 ) << '\n'; }