Discussion:
groesste bzw. kleinste Zahl in long double
(zu alt für eine Antwort)
Bernhard Ludwig
2004-12-10 21:49:37 UTC
Permalink
ja ich schon wieder :)

ich möchte die grösste bzw. kleinste Zahl die sich im Datentyp long double
speichern lässt ausgeben. Alle Quellen die ich gefunden habe behaupten der
Wertebereich des Typs long double geht von 3.4E-4932 bis 1.1E4932.

Folgendes Programm:

#include <stdio.h>
/*#include <limits.h>*/

int main(void){

double zahl_2=1.234567890123456e-308;
long double zahl_3=1.234567890123456e-308;

printf("double Variable: |%lg|\n", zahl_2);
printf("long double Variable: |%Lg|\n\n", zahl_3);
printf("Größe des Datentyps double: %d Bit\n",sizeof(double)*8);
printf("Größe des Datentyps long double: %d Bit\n",sizeof(longdouble)*8);

return (0);
}

die in der Variablen zahl_3 enthalten Zahl ist annähernd die Grenze für den
Datentyp double. Bis zu diesem Punkt liefert die Ausgabe das von mir
erwartete Ergebnis.
Wenn ich jetzt den Exponenten weiter nach oben schraube(bis E-324) liefert
mir die Ausgabe für beide Datentypen 0. Für double nachvollziehbar, aber
warum ist hier auch für long double die Grenze erreicht?
Wo mache ich einen Fehler?

Bernhard
Stefan Ram
2004-12-10 22:13:43 UTC
Permalink
Post by Bernhard Ludwig
ich möchte die grösste bzw. kleinste Zahl die sich im Datentyp
long double speichern lässt ausgeben. Alle Quellen die ich
gefunden habe behaupten der Wertebereich des Typs long double
geht von 3.4E-4932 bis 1.1E4932.
LDBL_MIN muß nicht kleiner als 1E-37 sein und LDBL_MAX nicht
größer als 1E+37.

5.2.4.2.2 Characteristics of floating types <float.h>
(...)

maximum representable finite floating-point number
(...)
LDBL_MAX

minimum normalized positive floating-point number
(...)
LDBL_MIN
Post by Bernhard Ludwig
Für double nachvollziehbar, aber
warum ist hier auch für long double die Grenze erreicht?
Wo mache ich einen Fehler?
long double muß sich nicht von double unterscheiden.

ISO/IEC 9899:1999 (E) kann hier bezogen werden:

http://suche.beuth.de/perl/powa_beuth/bwr_recherche.find_artikel?p_par3=9899
Dirk Clemens
2004-12-10 22:48:23 UTC
Permalink
Post by Bernhard Ludwig
ja ich schon wieder :)
ich möchte die grösste bzw. kleinste Zahl die sich im Datentyp long double
speichern lässt ausgeben. Alle Quellen die ich gefunden habe behaupten der
Wertebereich des Typs long double geht von 3.4E-4932 bis 1.1E4932.
Dann verwende doch die Konstanten aus float.h:
FLT_MIN, FLT_MAX, DBL_MIN, DBL_MAX, LDBL_MIN, LDBL_MAX
Post by Bernhard Ludwig
...
printf("Größe des Datentyps double: %d Bit\n",sizeof(double)*8);
printf("Größe des Datentyps long double: %d Bit\n",sizeof(longdouble)*8);
Besser: sizeof(long double)*CHAR_BIT
Post by Bernhard Ludwig
die in der Variablen zahl_3 enthalten Zahl ist annähernd die Grenze für den
Datentyp double. Bis zu diesem Punkt liefert die Ausgabe das von mir
erwartete Ergebnis.
Wenn ich jetzt den Exponenten weiter nach oben schraube(bis E-324) liefert
mir die Ausgabe für beide Datentypen 0. Für double nachvollziehbar, aber
warum ist hier auch für long double die Grenze erreicht?
Da die tatsäschliche Implementierung von double systemabhängig ist,
kann ich nur ins blaue mutmaßen:

- long double und double sind identisch
- beide haben die gleiche Bitzahl für den Exponenten und
unterscheiden sich nur in der Länge der Mantisse

Lemmi
Horst Kraemer
2004-12-11 11:24:41 UTC
Permalink
Post by Bernhard Ludwig
ja ich schon wieder :)
ich möchte die grösste bzw. kleinste Zahl die sich im Datentyp long double
speichern lässt ausgeben. Alle Quellen die ich gefunden habe behaupten der
Wertebereich des Typs long double geht von 3.4E-4932 bis 1.1E4932.
Das ist in Bezug auf C und C++ eine Fehlinterpretation. C++ definiert
nicht wie z.B. Java einen allgemeingueltigen Wertebereich fuer einen
Typ, sondern sagt nur, wie gross der Wertebereich *mindestens* sein
muss. Jede C++-Implementierung kann den Wertebereich nach Gutduenken
selber festlegen, solange er nicht kleiner als der vom C++-Standard
festgelegte Mindestbereich ist.

Das, was da oben beschrieben wird, ist nicht "der Wertebereich von
long double", sondern der Wertebereich eines internen Datentyps der
Intel-x86-Coprozessor-Familie, von Intel als "Temporary Real"
bezeichnet, der auf jedem PC mit Intel-kompatiblem
Prozessor|Coprozessor auf Maschinenebene vorliegt. Dieser Datentyp
wird von manchen C- und C++-Implentierungen fuer x86 als "long double"
implementiert - aber nicht von allen. Bei anderen Compilern - wohl
auch bei Deinem - steckt hinter long double schlicht dasselbe wie
double. Der Standard verbietet das nicht.

Der konkrete Wertebereich fuer Deinen Compiler wird durch die Makros
LDBL_MIN und LDBL_MAX angegeben.
--
Horst
Loading...