Hallo, ich teste gerade mit dem gcc und speziell mit dem Datentyp long double, weil ich den Datentyp vom darstellbaren Zahlenbereich her brauche (möglicher Exponent kleiner als 1.0E-308, was bei einem normalen double die Untergrenze ist). Beim Testen verhält sich der gcc jedoch sehr merkwürdig, was ich (momentan) nicht nachvollziehen kann. Hier das Testprogrmm:
#include <stdio.h> void main() { double d; long double d2;
printf("sizeof(d)=%d, sizeof(ld)=%d\n",sizeof(d),sizeof(d2));
d=1.0E-200; d2=1.0E-200;
printf("d =%25.18E\n",d); printf("ld=%25.18E\n",d2);
d2=d2*d2; printf("d =%25.18E\n",d); printf("ld=%25.18E\n",d2);
d=d*d; printf("d =%25.18E\n",d); printf("ld=%25.18E\n",d2);
}
und die Ausgabe:
sizeof(d)=8, sizeof(ld)=16 d =9.999999999999999821E-201 ld=9.999999999999999821E-201 d =9.999999999999999821E-201 ld=9.999999999999999821E-201 d = 0.000000000000000000E+00 ld= 0.000000000000000000E+00
Nach der 1. Multiplikation d2*d2 scheint garnichts zu passieren ? Nach der 2. Multiplikation d*d wird auch d2 aufeinmal geändert ? Von Ergebnis her hätte ich erwartet, daß d2 den Wert noch darstellen kann, also Ergebnis 1.0E-400 ? Kompiliert habe ich das ganze unter Suse 12.3 64 bit mit
gcc double_test.c -lm -o double_test
gcc-Version ist:
gcc (SUSE Linux) 4.7.2 20130108 [gcc-4_7-branch revision 195012] Copyright (C) 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Was mache ich falsch ? Muß ich beim Kompilieren noch spezielle weitere Module angeben ? Kann ich auch den nativen FPU-Typ Extended (mit 80Bit) ansprechen ? Jürgen -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
On Sun, Jul 21, 2013 at 05:47:55PM +0200, Jürgen Hochwald wrote:
Hallo,
ich teste gerade mit dem gcc und speziell mit dem Datentyp long double, weil ich den Datentyp vom darstellbaren Zahlenbereich her brauche (möglicher Exponent kleiner als 1.0E-308, was bei einem normalen double die Untergrenze ist).
Beim Testen verhält sich der gcc jedoch sehr merkwürdig, was ich (momentan) nicht nachvollziehen kann.
Hier das Testprogrmm:
#include <stdio.h> void main() { double d; long double d2;
printf("sizeof(d)=%d, sizeof(ld)=%d\n",sizeof(d),sizeof(d2));
d=1.0E-200; d2=1.0E-200;
printf("d =%25.18E\n",d); printf("ld=%25.18E\n",d2);
d2=d2*d2; printf("d =%25.18E\n",d); printf("ld=%25.18E\n",d2);
d=d*d; printf("d =%25.18E\n",d); printf("ld=%25.18E\n",d2);
}
und die Ausgabe:
sizeof(d)=8, sizeof(ld)=16 d =9.999999999999999821E-201 ld=9.999999999999999821E-201 d =9.999999999999999821E-201 ld=9.999999999999999821E-201 d = 0.000000000000000000E+00 ld= 0.000000000000000000E+00
Nach der 1. Multiplikation d2*d2 scheint garnichts zu passieren ? Nach der 2. Multiplikation d*d wird auch d2 aufeinmal geändert ? Von Ergebnis her hätte ich erwartet, daß d2 den Wert noch darstellen kann, also Ergebnis 1.0E-400 ?
Immer mal mit -Wall bauen: gcc -c xx.c -Wall -O2 xx.c:2:6: warning: return type of ‘main’ is not ‘int’ [-Wmain] xx.c: In function ‘main’: xx.c:6:3: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat] xx.c:6:3: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘long unsigned int’ [-Wformat] xx.c:12:3: warning: format ‘%E’ expects argument of type ‘double’, but argument 2 has type ‘long double’ [-Wformat] xx.c:16:3: warning: format ‘%E’ expects argument of type ‘double’, but argument 2 has type ‘long double’ [-Wformat] xx.c:20:3: warning: format ‘%E’ expects argument of type ‘double’, but argument 2 has type ‘long double’ [-Wformat] You need to use %LE When I switch d2 printing to use %LE then I get: sizeof(d)=8, sizeof(ld)=16 d =9.999999999999999821E-201 ld=9.999999999999999821E-201 d =9.999999999999999821E-201 ld=9.999999999999999642E-401 d = 0.000000000000000000E+00 ld=9.999999999999999642E-401 CIao, Marcus -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am Montag, 22. Juli 2013, 08:21:58 schrieb Marcus Meissner:
On Sun, Jul 21, 2013 at 05:47:55PM +0200, Jürgen Hochwald wrote:
Hallo,
ich teste gerade mit dem gcc und speziell mit dem Datentyp long double, weil ich den Datentyp vom darstellbaren Zahlenbereich her brauche (möglicher Exponent kleiner als 1.0E-308, was bei einem normalen double die Untergrenze ist).
Beim Testen verhält sich der gcc jedoch sehr merkwürdig, was ich (momentan) nicht nachvollziehen kann.
Hier das Testprogrmm:
#include <stdio.h> void main() {
double d; long double d2;
printf("sizeof(d)=%d, sizeof(ld)=%d\n",sizeof(d),sizeof(d2));
d=1.0E-200; d2=1.0E-200;
printf("d =%25.18E\n",d); printf("ld=%25.18E\n",d2);
d2=d2*d2; printf("d =%25.18E\n",d); printf("ld=%25.18E\n",d2);
d=d*d; printf("d =%25.18E\n",d); printf("ld=%25.18E\n",d2);
}
und die Ausgabe:
sizeof(d)=8, sizeof(ld)=16 d =9.999999999999999821E-201 ld=9.999999999999999821E-201 d =9.999999999999999821E-201 ld=9.999999999999999821E-201 d = 0.000000000000000000E+00 ld= 0.000000000000000000E+00
Nach der 1. Multiplikation d2*d2 scheint garnichts zu passieren ? Nach der 2. Multiplikation d*d wird auch d2 aufeinmal geändert ? Von Ergebnis her hätte ich erwartet, daß d2 den Wert noch darstellen kann, also Ergebnis 1.0E-400 ?
Immer mal mit -Wall bauen: gcc -c xx.c -Wall -O2
xx.c:2:6: warning: return type of ‘main’ is not ‘int’ [-Wmain] xx.c: In function ‘main’: xx.c:6:3: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat] xx.c:6:3: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘long unsigned int’ [-Wformat] xx.c:12:3: warning: format ‘%E’ expects argument of type ‘double’, but argument 2 has type ‘long double’ [-Wformat] xx.c:16:3: warning: format ‘%E’ expects argument of type ‘double’, but argument 2 has type ‘long double’ [-Wformat] xx.c:20:3: warning: format ‘%E’ expects argument of type ‘double’, but argument 2 has type ‘long double’ [-Wformat]
You need to use %LE
When I switch d2 printing to use %LE then I get: sizeof(d)=8, sizeof(ld)=16 d =9.999999999999999821E-201 ld=9.999999999999999821E-201 d =9.999999999999999821E-201 ld=9.999999999999999642E-401 d = 0.000000000000000000E+00 ld=9.999999999999999642E-401
CIao, Marcus
Ups, das mit dem '%d' im printf hatte ich übersehen bei dem Probieren mit verschiedenen Formaten. Ich hatte ua. auch mit '%le' getestet, aber ein kleines l reicht wohl nicht. Erst mit dem großen L (%Le) funktioniert es. Trotzdem vilene Dank! Jürgen -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo Jürgen, On Sun, 21.07.2013 17:47:55 Jürgen Hochwald wrote:
Beim Testen verhält sich der gcc jedoch sehr merkwürdig, was ich (momentan) nicht nachvollziehen kann.
Dann nimm doch "zum Spass" einfach mal den g++, evt. entdeckst du dann deine Fehlerchen. ;) #include <iostream> #include <iomanip> using namespace std; int main() { double d; long double d2; cout << "sizeof(d)=" << sizeof(d) << ", sizeof(ld)=" << sizeof(d2) << endl; d = 1.0E-200; d2 = 1.0E-200; cout.precision(18); cout << "d = " << d << endl; cout << "ld = " << d2 << endl; d2 = d2 * d2; cout << "d = " << d << endl; cout << "ld = " << d2 << endl; d = d * d; cout << "d = " << d << endl; cout << "ld = " << d2 << endl; return 0; } Roman -- Roman Fietze Telemotive AG Buero Muehlhausen Breitwiesen 73347 Muehlhausen Tel.: +49(0)7335/18493-45 http://www.telemotive.de ---------------------------------------------------------------------------------- Neuer Produktkatalog online unter http://www.telemotive.de/4/de/produktkatalog ---------------------------------------------------------------------------------- fast * easy-to-use * high performance * flexible blue PiraT2 - die neue Datenlogger Generation! Sichern Sie sich jetzt Ihr Exemplar! Infomaterial und Angebote: bluePiraTinfo@telemotive.de Telemotive AG we drive your ideas! ---------------------------------------------------------------------------------- Firmensitz: Telemotive AG - Breitwiesen - 73347 Mühlhausen Vorstand: Franz Diller, Markus Fischer, Markus Stolz Vorstandsvorsitzender: Peter Kersten Aufsichtsratsvorsitzender: Dipl. Kaufmann Thomas Derlien Amtsgericht: Ulm HRB 541321 ----------------------------------------------------------------------------------- -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
participants (3)
-
Jürgen Hochwald
-
Marcus Meissner
-
Roman Fietze