Integer zu klein C++?
Ich habe ein Programm zum Potenzieren geschrieben. Soweit so gut, aber bei größeren Zahlen scheint kein richtiges Ergebnis rauszukommen.
5 hoch 2 ist dann 25 usw.
16581375 hoch 3686400 ist sicher nicht 4148166657, oder? Ist doch viel zu klein. Oder kommt mir so vor.
Was hab ich falsch gemacht?
#include <iostream>
using namespace std;
int main()
{
int basis;
int potenz;
cout << "Basis eingeben: ";
cin >> basis;
cout << "Potenz eingeben: ";
cin >> potenz;
unsigned long int result = 1;
for (int i = 0; i < potenz; i++)
{
result = result * basis;
//cout << result << endl;
}
cout << "Das Ergebnis ist: " << result << endl;
}
6 Antworten
C und C++ schneiden die höherwertigen Bits ab, wenn sie nicht in den Datentyp hineinpassen.
Das Ergebnis ist hier eine Zahl mit über 20 Millionen Stellen. Da müsstest du ein BigInteger-Package nehmen.
"nur" ... Wir befinden uns hier im Bereich der "kombinatorischen Zahlen", einem Bereich, wo "astronomische Zahlen" im Vergleich mikroskopisch klein sind.
Typen haben einen begrenzten Wertebereich, aber schauen wir uns das mal an:
16 581 375 - Das ist in der Region 2^24, hierfür würde ein 32 Bit int noch reichen, schauen wir uns den Exponent an:
3 686 400 - Etwa 2^22. Also bräuchtest Du für das Ergebnis einen 'Integer' mit 24*2^22 Bit, bzw 2^27 Bits.
Daß das nicht mehr mit normalen Integertypen klappt, sollte offensichtlich sein.
Also brauchst Du ein big number Bibliothek, bzw. eine für arbitary precision, z.B. GNU-MP - oder aber Du implementierst es selbst.
Hier richtig (öfters getestet). Hoffe ich konnte weiterhelfen.
#include <iostream>
using namespace std;
#include <cstdlib>
int main() {
unsigned long long int exponent=0;
unsigned long long int basis=0;
unsigned long long int calc=1;
int a=0;
cout<<"Basis: ";
cin>>basis;
cout<<"Exponent: ";
cin>>exponent;
for(a=0;a<exponent;a++) {
calc=calc*basis;
}
cout<<basis<<" hoch "<<exponent<<" = ";
cout<<calc;
cout<<endl;
system("pause");
return 0;
}
Code:
#include <iostream>
using namespace std;
#include <cstdlib>
int main() {
unsigned long long int exponent;
unsigned long long int basis;
unsigned long long int calc;
int a;
cout<<"Basis: ";
cin>>basis;
cout<<"Exponent: ";
cin>>exponent;
for(a=0;a<exponent;a++) {
calc=basis*basis;
}
cout<<basis<<" hoch "<<exponent<<" = ";
cout<<calc;
cout<<endl;
system("pause");
return 0;
}
integer hat gewisse grenzen, wie wäre es mit float ?
Wir bräuchten hier einen float-Typ mit mindestens 27 Bit für den Exponenten. (28, inkl. "Vorzeichenbit")
(Berechnung: Eingabe für wolframalpha.com:
Ceiling(log(log(16581375)/log(2) * 3686400)/log(2))
)
Demnach reicht nicht mal ein IEEE-754-Float mit achtfacher Genauigkeit ("octuple precision") mit seinen 18 Bit für den Exponenten: https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats
Ohne Erweiterungspaket ist da also z. Z. nichts zu machen.
Oh. 20 Millionen sind viel... Ich wollte doch nur alle Möglichkeiten der Anzeige auf einem WQHD-Bildschirm berechnen...