Integer zu klein C++?

6 Antworten

Vom Fragesteller 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 
Fragesteller
 23.04.2019, 22:30

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

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

1

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/

janderhelt  23.04.2019, 21:29

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

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

1