long double "kaputt"?
-
Irgendwie "funktioniert" der Datentyp
long doublebei mir nicht mehr. Hier ein Beispielprogramm und die dazugehörigen Ausgaben als Kommentare:#include <iostream> using namespace std; int main() { long double b = 5.5; cout << b << "\n"; //-1.27223e-077 cin >> b; cout << b << "\n"; //alles mögliche, zb. Bei 4: -0, 3: -2 oder bei 5: -1.49167e-154 b = 0; cout << b; //0 }Alle anderen Standard-datentypen funktionieren, nur
long doublemacht nur noch Blödsinn. Ich hab gedacht ich hätte zu viel am Compiler rumgespielt und hab mal alle Zusatzoptionen abgeschaltet - aber nichts ändert sich. Was mach ich falsch..?
-
Mach mal die Ausgabe zusätzlich mit printf(). Dann kann man evtl. schon was ausschliessen. Compiler etc. waren noch gleich?
-
Ich habs eben mit printf() probiert, kein Unterschied. Hier die Daten meiner IDE (Code::Blocks):
svn build rev 5489 (2009-03-27 21:56:32) gcc 4.2.1 Windows/unicodeAls ich früher noch das normale Code::Blocks verwendet hab, lief alles mit long double. Jetzt nicht mehr, jetzt benutz ich den Build von der CD vom Buch "Der C++-Programmierer", weil da auch alle Bibliotheken mitinstalliert werden usw.
Ich bezweifle aber, dass es daran liegt, dass ich ein self-build benutze, immerhin ist long double ja ein Basisdatentyp und geht immer.
-
so ne ferndiagnose bei dem, was hier bisher bekannt ist, ist schwierig.
Probier doch mal das hier:
long double a = 5.5; double b = a; cout << b << '\n'; cout << sizeof(double) << '\n'; cout << sizeof(long double) << '\n';und sag, was rauskommt.
Vielleicht hast Du es "irgendwie hinbekommen", dass long double 80bit breit ist, wobei die Standardbiliotheks-Implementierung gar nicht darauf eingestellt ist und long double wie double behandelt.
-
Microsoft hatte (hat?) wohl mal einfach long double für nichtig erklärt. Und macht daraus einfach ein double. Das gibt dann natürlich Probleme wenn man z.B. eine mit vc erstellt lib in ein Programm einbindet welches mit dem gcc erstellt wird.
-
krümelkacker schrieb:
so ne ferndiagnose bei dem, was hier bisher bekannt ist, ist schwierig.
Probier doch mal das hier:
long double a = 5.5; double b = a; cout << b << '\n'; cout << sizeof(double) << '\n'; cout << sizeof(long double) << '\n';und sag, was rauskommt.
Vielleicht hast Du es "irgendwie hinbekommen", dass long double 80bit breit ist, wobei die Standardbiliotheks-Implementierung gar nicht darauf eingestellt ist und long double wie double behandelt.
Folgende Ausgabe krieg ich:
5.5 8 12Hab ich vorher übrigens auch schon getestet, hab ich aber nicht erwähnt..
Also, woran könnte es denn liegen?@Osbios wie meinst du das?
-
Ich meine damit, dass es in einigen Varianten von VC kein long double gibt.
Alle Bibliotheken die nun damit erstellt wurden haben überall wo long double steht in Wirklichkeit nur double.Und wenn du nun mit einem anderen Compiler daherkommst der long double unterstützt, und dieser long double in den Header-Dateien dieser Bibliotheken findet. Dann übergibt dein Programm long double wo die Lib in Wirklichkeit double erwartet und dann die Daten falsch verarbeitet.
Hiernach: http://support.microsoft.com/kb/129209
gibt es dieses "Feature" bis "VC 6.0 Service Pack 5".Es muss also irgendwo zwischen cout und der textausgabe noch etwas geben was zwar long double in der Header-Datei stehen hat, aber mit einer dieser VC++ Versionen erstellt wurde.
-
Es muss also irgendwo zwischen cout und der textausgabe noch etwas geben was zwar long double in der Header-Datei stehen hat, aber mit einer dieser VC++ Versionen erstellt wurde.
Klingt für mich irgendwie weit hergeholt. Dann hab ich wohl einfach nur Pech^^
Danke für die Antworten
-
Ich kann den Fehler nicht reproduzieren unter Windows XP, MinGW-TDM (GCC 4.5.1) 32-Bit.
sizeof(long double) ist bei mir auch 12, hätte aber 8 wie bei double erwartet.
kk
-
Wieso denn 8? long double belegt doch Standardsgemäß üblicherweise immer 12 Bytes.
double üblicherweise 8.