Integer zu klein C++?

6 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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.

Woher ich das weiß:Hobby – Hobby, Studium, gebe Nachhilfe

JustSayNo 
Beitragsersteller
 23.04.2019, 22:30

Oh. 20 Millionen sind viel... Ich wollte doch nur alle Möglichkeiten der Anzeige auf einem WQHD-Bildschirm berechnen...

PWolff  24.04.2019, 12:02
@JustSayNo

"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 ?

http://www.cplusplus.com/doc/tutorial/variables/


PWolff  24.04.2019, 12:21

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.

janderhelt  23.04.2019, 21:29

int ist im bereich von  -2 147 483 648 und 2 147 483 647. (Wikipedia)