<float.h> problem
-
Tim schrieb:
Also ich sehe da keinen L modifier im Code?
ja. wie ich vorhin schon sagte. "%Lg" gibt die gleiche Ausgabe wie "%g".
#include <stdio.h> #include <float.h> int main() { printf("FLT_MIN: %g\n",FLT_MIN); printf("FLT_MAX: %g\n\n",FLT_MAX); printf("DBL_MIN: %g\n",DBL_MIN); printf("DBL_MAX: %g\n\n",DBL_MAX); printf("LDBL_MIN: %Lg\n",LDBL_MIN); // <--- printf("LDBL_MAX: %Lg\n",LDBL_MAX); // <--- return 0; }
Ausgabe:
`FLT_MIN: 1.17549e-038FLT_MAX: 3.40282e+038
DBL_MIN: 2.22507e-308
DBL_MAX: 1.79769e+308
LDBL_MIN: -0
LDBL_MAX: -1.#QNAN`
genau das gleiche. an dem L kanns also nicht liegen.
außerdem scheinen mir auch die anderen werte falsch zu sein. ich kann problemlos eine float-variable "überdeklarieren", ohne das der compiler, wie sonst bei einem overflow, eine warnung ausgibt.
sehr komisch.
-
%Lg mit einem großen ell.
#include <stdio.h> #include <float.h> int main() { printf("FLT_MIN: %g\n",FLT_MIN); printf("FLT_MAX: %g\n\n",FLT_MAX); printf("DBL_MIN: %g\n",DBL_MIN); printf("DBL_MAX: %g\n\n",DBL_MAX); printf("LDBL_MIN: %Lg\n",LDBL_MIN); // Mit dem großen ELL printf("LDBL_MAX: %Lg\n",LDBL_MAX); // Mit dem großen ELL return 0; }
gibt bei mir
FLT_MIN: 1.17549e-038 FLT_MAX: 3.40282e+038 DBL_MIN: 2.22507e-308 DBL_MAX: 1.79769e+308 LDBL_MIN: 3.3621e-4932 LDBL_MAX: 1.18973e+4932
gcc, der mit Code::Blocks gekommen ist.
Egal ob c99 oder c89
-
also bei mir kommt trotz dem GROSSEN L die gleiche scheiße.
hat da wohl jemand was nachlässig implementiert oder was?
wenni ich deinen code kompiliere und auführe, dann kommt folgende ausgabe:
`FLT_MIN: 1.17549e-038FLT_MAX: 3.40282e+038
DBL_MIN: 2.22507e-308
DBL_MAX: 1.79769e+308
LDBL_MIN: -0
LDBL_MAX: -1.#QNAN`
-
Ist das zufälligerweise ein Mingw port?
-
Tim schrieb:
Ist das zufälligerweise ein Mingw port?
ja.
ist DAS wohl das problem?
und ich dachte, die von dem projekt wissen was sie tun
-
Such mal bitte die float.h im Dateisystem und paste mal auf eine paste-Seite. Und mach mal:
#include <stdio.h> #include <float.h> int main() { long double ldbl_min = LDBL_MIN; long double ldbl_max = LDBL_MAX; printf("FLT_MIN: %g\n",FLT_MIN); printf("FLT_MAX: %g\n\n",FLT_MAX); printf("DBL_MIN: %g\n",DBL_MIN); printf("DBL_MAX: %g\n\n",DBL_MAX); printf("LDBL_MIN: %Lg\n",ldbl_min); printf("LDBL_MAX: %Lg\n",ldbl_max); return 0; }
-
also das mit dem posten mache ich ungern (copyright und so).
allerdings geht der quellcode immernoch NICHT, obwohl ich deine änderunge vorgenommen habe.
vielleicht sollte das mal jemand als bug melden.
woher kommt eigentlich dieses "#QNAN"?
gcc (GCC) 4.6.2 Copyright (C) 2011 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.
-
Das Problem ist imho, dass für die MSVC runtime long double == double ist. Für den gcc (und auch Mingw Port) gilt aber long double > double. Sprich gcc kann 80Bit Fließkomma zwar intern darstellen, aber die MSVC runtime kann es nicht ausgeben (da dort auch long double nur 64Bit breit ist).
-
gut dann wär das wenigstens geklärt.
DirkB schrieb:
gibt bei mir
FLT_MIN: 1.17549e-038 FLT_MAX: 3.40282e+038 DBL_MIN: 2.22507e-308 DBL_MAX: 1.79769e+308 LDBL_MIN: 3.3621e-4932 LDBL_MAX: 1.18973e+4932
gcc, der mit Code::Blocks gekommen ist.
Egal ob c99 oder c89diese zahlen sind aber richtig, oder?
-
Die Frage ob "richtig" stellt sich nicht. Die können von System zu System - oder wie hier nun - von Umgebung zu Umgebung unterschiedlich sein. Der Standard [1] definiert nur Mindestgrenzen die eine Umgebung mindestens darstellen können muss (sollte in der Realität).
[1] Hier wäre ein Link zum Standard gewesen, aber wegen COPYRIGHT UND SO geht das nicht...