<float.h> problem



  • hallo,

    wie genau kann ich FLT_MIN und FLT_MAX, bzw. DBL_MIN und DBL_MAX, bzw. LDBL_MIN und LDBL_MAX mit printf ausgeben?

    printf("%?\n",FLT_MIN);

    ?



  • %g für float und double bzw. %Lg für long double

    Klar geht auch %f (%Lf), aber das wird nicht so viel bringen
    %e (%Le) geht auch.



  • %g funktioniert gut, aber nicht bei long double. da kommt eine fehlerhafte ausgabe. bist du sicher, dass es %Lg ist? wennich nur %g schreib, gehts auch nicht.



  • Nach C99 Standard ist es %Lg
    Welcher Compiler hast du denn?



  • DirkB schrieb:

    Nach C99 Standard ist es %Lg
    Welcher Compiler hast du denn?

    gcc.

    soweit ich weiß, kompiliert der standardmäßig im c89-modus



  • Du kannst ja mal selber nachlesen. Unter http://www.c-plusplus.net/forum/300567 findest du die Links zu den Standards (bzw. deren Vorabdruck)
    Demnach gilt das auch schon seit C89.



  • ja ok kann ja sein.

    #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: %g\n",LDBL_MIN);
    	printf("LDBL_MAX: %g\n",LDBL_MAX);
    	return 0;
    }
    

    ausgabe:
    `FLT_MIN: 1.17549e-038

    FLT_MAX: 3.40282e+038

    DBL_MIN: 2.22507e-308

    DBL_MAX: 1.79769e+308

    LDBL_MIN: -0

    LDBL_MAX: -1.#QNAN`

    LDBL_MAX ist also wirklich "-1.#QNAN"? wohl eher nicht.

    was ist da los?



  • Also ich sehe da keinen L modifier im Code?



  • 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-038

    FLT_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-038

    FLT_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 c89

    diese 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...


Anmelden zum Antworten