DOUBLE und LONG DOUBLE
-
Hallo !
C++ sollte ja eigentlich den Datentyp LONG DOUBLE kennen.
Wenn ich jetzt aber eine Variable deklariere: long double x=1.010010099560;
und die dann mit ihr selbst addiere komme ich bis 9.07844e+307 und danach kommen nur mehr 1.#INF
Das ist aber das ganz normale Double-Format.Ich benutze Visual C++ 6.0
Vielleicht hats ja damit was zu tun !Danke gleichmal für Tips
lG
Gawan
-
Gawan schrieb:
C++ sollte ja eigentlich den Datentyp LONG DOUBLE kennen.
Nein, long double heißt der -- der Unterschied zwischen Groß- und Kleinbuchstaben wird hier großgeschrieben
Das ist aber das ganz normale Double-Format.
Ich benutze Visual C++ 6.0
Vielleicht hats ja damit was zu tun !Soweit ich weiß, sind die Typen double und long double beim VC++ intern gleich repräsentiert. Das ist auch durchaus standardkonform, long double muss nur mindestens genauso gut sein wie double. Warum VC++ nicht den hardwaremäßig zur Verfügung stehenden 10-Byte-Typ benutzt, weiß ich nicht, manche anderen Compiler tun das.
-
Nein, das hat nix damit zutun! Der standard sagt nur float<=double<=long double
-> Auf 32-Bit-Systemen ist es üblich, dass double genauso groß ist wie long double...
-
alles klar, dann hat sich das erledigt
hab eine 32Bit-Maschine
Danke !
-
Bei meinem gcc ist sizeof(long double) == 12. Ich hab ebenfalls eine 32bit-Maschine
-
Was willst du damit sagen? Was sagt den sizeof(double)==sizeof(long double)?
-
Auf meinem 64 Bitter ist long double 128. Mit dem gcc ist's in Windows 64, aber mit dem VC++ ist er nur 32.
-
Man könnte doch mit
#include <iomanip.h> cout.setf(ios::fixed); cout<<setprecision(12);
tricksen...
-
ness schrieb:
Was willst du damit sagen?
Dass deine Aussage, auf 32bit-Systemen sei double == long double, falsch ist. Dazu hätte ich natürlich noch sagen müssen, dass double bei mir 8 Byte groß ist, sorry.
-
Lars Hupel schrieb:
Man könnte doch mit
#include <iomanip.h> cout.setf(ios::fixed); cout<<setprecision(12);
tricksen...
Was soll das bitte bringen???
randa schrieb:
Auf meinem 64 Bitter ist long double 128. Mit dem gcc ist's in Windows 64, aber mit dem VC++ ist er nur 32.
Sicher? Ich dachte bei dev-cpp sei long double auch nur 31? (Was fürn OS haste auf deinem 64-Bitter?)
-
Tschuldigung, habe das Problem nicht ganz verstanden.
Also ich habe ein 64-bit System (weiß ich nicht ob das unter WXP berücksichtigt wird) und bei Dev-C++ ist long double nicht viel genauer als double oder float.
-
ness schrieb:
Sicher? Ich dachte bei dev-cpp sei long double auch nur 31? (Was fürn OS haste auf deinem 64-Bitter?)
Wer hat denn was von dev-cpp gesagt?
64 Bit Mode ist bei suse Linux.
-
Lars Hupel schrieb:
Also ich habe ein 64-bit System (weiß ich nicht ob das unter WXP berücksichtigt wird) und bei Dev-C++ ist long double nicht viel genauer als double oder float.
Du sprichst aber von der Konsolenausgabe und der Rest von der internen Repräsentation. Das ist ein himmelweiter Unterschied!
-
long double mit 128 bits ist schön und gut - aber definitiv quälend langsam auf x86 maschinen (auch mit 64bit erweiterung).
ich denke der grund, warum der 10byte float typ (von vc) nicht unterstützt wird, liegt darin, dass man ihn nur eingeschränkt nutzen kann. es ist nicht möglich direkt mit diesen floats zu rechnen, diese werte müssen stets erst in ein register geladen werden. das beeinträchtigt nicht ganz unwesentlich die codeerzeugung/optimierung - auf jeden fall wäre es häufig deutlich langsamer - die 12 zusätzlichen bits (=knapp 4 dezimalstellen) an genauigkeit sind eh nicht berauschend, höchtens der erweiterte wertebereich im exponenten könnte gelegentlich nützlich sein.
-
randa schrieb:
Wer hat denn was von dev-cpp gesagt?
Ich denke der basiert auf nem win-port vom gcc?
-
long double mit 128 bits ist schön und gut - aber definitiv quälend langsam auf x86 maschinen
Wer sich um die Performance sorgt der wird nicht long double nutzen, somit ist das Argument hinfällig.
es ist nicht möglich direkt mit diesen floats zu rechnen, diese werte müssen stets erst in ein register geladen werden.
So weit ich weis ist das auch bei float und double von nöten.
-
Ben04 schrieb:
long double mit 128 bits ist schön und gut - aber definitiv quälend langsam auf x86 maschinen
Wer sich um die Performance sorgt der wird nicht long double nutzen, somit ist das Argument hinfällig.
war auch eher ein hinweis als ein argument. immerhin ist ein double erheblich genauer als float - trotzdem ist der geschwindigkeitsvorteil von floats nicht proportional dazu. - bei long doubles sähe das ganz anders aus.
es ist nicht möglich direkt mit diesen floats zu rechnen, diese werte müssen stets erst in ein register geladen werden.
So weit ich weis ist das auch bei float und double von nöten.
die meisten binären rechenoperationen (d.h. add,sub,mul,div) können auch mit speicheroperanden (im float/double format) operieren, so dass nur ein operand bereits (direkt oder implizit als ergebnis einer vorherigen operation) geladen sein muss, das hat deutliche vorteile.