Wie groß eine Zahl kann Sie speichern in double und float in c?
Ich versuche, genau herauszufinden, wie groß die Zahl, die ich verwenden kann als Gleitkommazahl mit und double
. Aber es speichert nicht den Weg, den ich erwartet außer integer-Wert. double
halten sollte 8 bytes von Informationen, die genügend Platz für eine variable ein, aber Sie hält ihn nicht richtig. Es zeigt 1234567890123456768
in die letzten 2 Ziffern sind anders. Und wenn ich gespeichert 214783648
oder jede Ziffer die Letzte Ziffer in der float-Variablen b
es zeigt den gleichen Wert 214783648
. das soll ja die Grenze. Also, was ist Los?
double a;
float b;
int c;
a = 1234567890123456789;
b = 2147483648;
c = 2147483647;
printf("Bytes of double: %d\n", sizeof(double));
printf("Bytes of integer: %d\n", sizeof(int));
printf("Bytes of float: %d\n", sizeof(float));
printf("\n");
printf("You can count up to %.0f in 4 bytes\n", pow(2,32));
printf("You can count up to %.0f with + or - sign in 4 bytes\n", pow(2,31));
printf("You can count up to %.0f in 4 bytes\n", pow(2,64));
printf("You can count up to %.0f with + or - sign in in 8 bytes\n", pow(2,63));
printf("\n");
printf("double number: %.0f\n", a);
printf("floating point: %.0f\n", b);
printf("integer: %d\n", c);
return 0;
verwenden
Alle definiert in der header-Datei
Speichern Sie UNENDLICH! =)
%zu
drucken Sie die o/p sizeof
Alle definiert in der header-Datei
limits.h
.Speichern Sie UNENDLICH! =)
InformationsquelleAutor Jin kim | 2015-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort auf die Frage, was ist die größte (endliche) Zahl, die gespeichert werden können in eine floating-point-Typ wäre
FLT_MAX
oderDBL_MAX
fürfloat
unddouble
bzw.Jedoch, das bedeutet nicht, dass der Typ kann genau darstellen, jede kleinere Zahl oder ganze Zahl (in der Tat, nicht einmal in der Nähe).
Zuerst müssen Sie verstehen, dass nicht alle bits der Gleitkomma-Zahl "gleich". Eine floating-point-Zahl hat einen exponent (in 8-bit IEEE-754-standard
float
, 11 bits indouble
), und eine Mantisse (23 und 52 bits infloat
, unddouble
beziehungsweise). Die Zahl erhält man durch Multiplikation der Mantisse (hat einen impliziten führenden 1-bit-und Binär-Punkt) von 2exponent (nach der Normalisierung der exponent; eine Binär-Wert wird nicht direkt verwendet). Es gibt auch einen separaten Vorzeichenbit, so gilt das folgende für negative zahlen als gut.Als der exponent ändert, wird der Abstand zwischen aufeinander folgenden Werte der Mantisse Veränderungen, wie gut, D. H., je größer der exponent, die weiter auseinander aufeinander folgenden darstellbaren Werte von dem Fließkomma-Zahl sind. So können Sie zum speichern einer Zahl einer bestimmten Größe genau, aber nicht die "nächste" Zahl. Man sollte auch daran denken, dass einige scheinbar einfache Brüche können nicht dargestellt werden, genau mit einer beliebigen Anzahl von binären Ziffern (z.B.
1/10
mit einem Zehntel, ist eine unendlich sich wiederholende Sequenz in Binär, wie1/3
, ein Drittel, ist in dezimal).Wenn es darum geht zu zahlen, können Sie genau stellen jede ganze Zahl bis zu 2mantissa_bits + 1 Größenordnung. So eine IEEE-754
float
darstellen kann alle ganzen zahlen bis zu 224 und einedouble
bis zu 253 (in der letzten Hälfte von diesen Bereichen die aufeinanderfolgenden floating point Werte sind genau eine ganze Zahl abgesehen, da die gesamte Mantisse verwendet wird, für den integer-Teil). Es gibt einzelne größere ganze zahlen dargestellt werden kann, aber Sie sind voneinander mehr als eine integer auseinander, d.h., Sie können einige ganze zahlen größer als 2mantissa_bits + 1 aber jeder integer nur bis zu dieser Größenordnung.Beispiel:
Ausgänge:
Wie Sie sehen können, hinzufügen
1
2mantissa_bits + 1 macht keinen Unterschied, da das Ergebnis nicht darstellbar ist, aber das hinzufügen2
nicht produzieren die richtige Antwort (wie es geschieht, in dieser Größenordnung die darstellbaren zahlen sind zwei ganze zahlen auseinander, da der Multiplikator verdoppelt hat).TL;DR Ein IEE-754
float
präzise Darstellung aller ganzen zahlen bis zu 224 unddouble
bis zu 253, aber nur einige Ganzzahlen der größere Umfang (der Abstand der darstellbaren Werte sind abhängig von der Größe).InformationsquelleAutor Arkku
sizeof(double)
ist8
, stimmt, aberdouble
braucht einige bits zum speichern der exponent.Vorausgesetzt, IEEE-754 verwendet,
double
können Ganzzahlen bei den meisten 253 genau, das ist weniger als1234567890123456789
.Siehe auch Double-precision-floating-point-format.
InformationsquelleAutor Yu Hao
Können Sie Konstanten verwenden, um zu wissen, was sind die Grenzen :
Von CPP-Referenz
Dies ist nicht die Antwort.
1234567890123456789
ist viel weniger alsDBL_MAX
, die in der Regel1E+37
. Das eigentliche problem in dieser Frage ist nicht die maximale Zahl, diedouble
speichern kann, aber wie groß eine Ganzzahl, diedouble
speichern können genau.DBL_MAX ist "in der Regel
1E+37
"? Tippfehler? Wenn ich mich Recht erinnere, ist es etwas, um1E307
.zu meinem früheren Kommentar: Die mindestens zulässige Wert für
DBL_MAX
ist1E+37
. Es ist in der Regel viel größer, sowas wie1.79769e+308
.E+308? Ich bin verwirrt. Ich wurde gelehrt, dass C ist eine Sprache, die nicht halten kann wirklich große zahlen. Und wir wurden gelehrt, zu speichern riesige zahlen in arrays. Können Sie bitte erklären?
InformationsquelleAutor blue112
Den
sizeof
ein Objekt nur Berichte der Speicherplatz es belegt. Es zeigt nicht die gültige Bereich. Es wäre auch möglich, eineunsigned int
mit z.B. 2**16 (65536) möglich Wert belegen 32 bit im Speicher.Für floating point Objekte, ist es schwieriger. Sie bestehen aus (vereinfacht) zwei Felder: einen integer-Mantisse und einen Exponenten (siehe details im verlinkten Artikel). Beide mit einer festen Breite.
Als die Mantisse hat nur eine begrenzte Reichweite, nachgestellte bits werden abgeschnitten oder gerundet und der exponent korrigiert wird, wenn erforderlich. Dies ist ein Grund, sollte man nie verwenden, floating-point-Typen zu speichern, genaue Werte wie Währung.
In dezimal (Hinweis: Computer verwenden binäre Darstellung) mit 4-stelligen Mantisse:
Die Parameter für Ihre Umsetzung definiert sind, in
float.h
ähnlichlimits.h
bietet Parameter für Ganzzahlen.InformationsquelleAutor too honest for this site
Drucken können Sie die tatsächlichen Grenzen der standard-POD-Typen durch Druck-die Grenzen gespeichert in der 'Grenzen.h' - header-Datei (für C++ - äquivalent ist "std::numeric_limits" Bezeichner wie hier gezeigt:
geben Sie den link-Beschreibung hier)
Aufgrund der Tatsache, dass die hardware funktioniert nicht mit schwimmenden Arten, bzw. nicht dargestellt werden kann, schwimmende Arten von hardware in der Realität, die hardware verwendet die bit-Länge der hardware zur Darstellung einer floating-Typ. Da Sie nicht über ein infinit Länge für schwimmende Arten, Sie können nur zeigen/präsentieren eine double-variable für eine bestimmte Präzision. Die meiste hardware wird verwendet für die schwimmende Art der Präsentation der IEEE-754 standard.
Erhalten Sie mehr Präzision, die Sie könnten versuchen, 'long double' (Abhänging von der hardware das könnte vierfach-Präzision als das doppelte), AVX,SSE-Register, groß-num-Bibliotheken, oder Sie konnte es selbst tun.
InformationsquelleAutor mbed_dev
Unter Linux
#include <values.h>
Unter Windows
#include <float.h>
Es ist eine ziemlich umfassende Liste definiert
InformationsquelleAutor cup