Soru printf ve uzun çift


Windows'da Netbeans ile en son gcc kullanıyorum. Neden olmasın long double iş? Mi printf belirteci %lf yanlış?

Kod:

#include <stdio.h>

int main(void)
{
    float aboat = 32000.0;
    double abet = 5.32e-5;
    long double dip = 5.32e-5;

    printf("%f can be written %e\n", aboat, aboat);
    printf("%f can be written %e\n", abet, abet);
    printf("%lf can be written %le\n", dip, dip);

    return 0;
}

Çıktı:

32000.000000 can be written 3.200000e+004
0.000053 can be written 5.320000e-005
-1950228512509697500000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000.000000
can be written 2.725000e+002
Press [Enter] to close the terminal ...

44
2017-11-03 16:20


Menşei


bytes.com/topic/c/answers/... - gameboy
Açıkçası MinGW ve uzun çift ile bir sorun var - gameboy
olası kopyası C uzun bir çift doğru yazdırılamıyor - phuclv


Cevaplar:


Yanlış değiştiriciye ek olarak, Windows'a gcc hangi bağlantı noktası? mingw Microsoft C kütüphanesini kullanır ve bu kütüphanenin 80 bit uzun çift (Mac için çeşitli nedenlerden dolayı 64 bit uzun çift kullanması) desteği olmadığını hatırlıyorum.


11
2017-11-03 16:35



Evet haklısın - gameboy
bytes.com/topic/c/answers/... - gameboy


Printf manpage'den:

l (ell) Aşağıdaki tam sayı   dönüşüm uzun bir int karşılık gelir   veya imzasız uzun int argüman veya   aşağıdaki n dönüşüm karşılık gelir   uzun int argümanına bir işaretçi veya   takip eden c                 dönüşüm bir wint_t bağımsız değişkenine veya aşağıdaki s   dönüşüm bir işaretçiye karşılık gelir   wchar_t bağımsız değişkeni.

ve

L A aşağıdaki, A, e, E, f, F,   g veya G dönüşümü   uzun çifte argüman. (C99 izin verir   % LF, ancak SUSv2 yapmıyor.)

Yani sen %Le , değil %le

Düzenleme: Bazı araştırmalar, Mingw'in MSVC / win32 çalışma zamanını (printf gibi şeyler için) kullandığını gösteriyor. Yani bir derleyici (gcc gibi) bir yerli uzun çift sağlayan bir çalışma zamanı ile karıştırma gibi görünüyor .. karıştırmak.


39
2017-11-03 16:25



buldum linux.die.net/man/3/printfama% Lf veya% Le de çalışmıyor - gameboy
Windows'da Netbeans ile hangi derleyiciyi kullanıyorsunuz? - nos
son gcc ve MinGW - gameboy


Evet - için long doublekullanmalısın %Lf (yani, büyük harf "L").


33
2017-11-03 16:23





MinGW kullanıyorsanız, sorun varsayılan olarak, MinGW I / O resp kullanır. 80 bit kayan nokta sayılarını desteklemeyen Microsoft C çalışma zamanı biçimlendirme işlevleri (long double == double Microsoft arazisinde).

Ancak, MinGW ayrıca bir dizi alternatif uygulama ile birlikte geliyor. yap Uzun çiftleri doğru şekilde destekleyin. Onları kullanmak için, işlev isimlerini önekle __mingw_ (Örneğin. __mingw_printf). Projenizin doğasına bağlı olarak, global olarak da isteyebilirsiniz #define printf __mingw_printf veya kullan -D__USE_MINGW_ANSI_STDIO (tüm MinGW sürümlerini sağlayan printf-family fonksiyonları).


20
2018-02-20 19:16





Bu meseleyi uzun çiftler test ediyordum, ve alas, bir düzeltmeye rastladım! Projenizi -D__USE_MINGW_ANSI_STDIO ile derlemelisiniz:

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3 / test   $ gcc main.c

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3 / test   $ a.exe c = 0.000000

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3 / test   $ gcc main.c -D__USE_MINGW_ANSI_STDIO

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3 / test   $ a.exe c = 42.000000

Kod:

Jason Huntley@centurian /home/developer/dependencies/Python-2.7.3/test
$ cat main.c
#include <stdio.h>

int main(int argc, char **argv)
{
   long double c=42;

   c/3;

   printf("c=%Lf\n",c);

   return 0;
}

6
2018-03-15 20:19





C99'da uzunluk değiştirici long double gibi görünüyor L ve yok l. man fprintf (veya pencereler için eşdeğer) size belirli platform için söylemelisiniz.


4
2017-11-03 16:23



Çok kötü, o Windows'da ve muhtemelen bir manpage yok. Her neyse, "adam printf" veya "printf manuel sayfa" için google ya da böyle bir şey. - Denilson Sá Maia


Diğer cevaplarda da söylendiği gibi, doğru dönüşüm belirteci "%Lf".

Format uyarısını kullanarak açmak isteyebilirsiniz. -Wformat (veya -Wall, içerir -Wformatgcc çağırma

$ gcc source.c
$ gcc -Wall kaynağı.c
source.c: "Ana" işlevinde:
source.c: 5: uyarı: "% lf" biçimi "double" türünü bekler, ancak argüman 2 "long double" türüne sahiptir
source.c: 5: uyarı: "% le" biçimi "double" türünü bekler, ancak 3. argüman "long double" türüne sahiptir
$

2
2017-11-03 16:34





Java'da Doğru Printf konuşması : -

  double pi = Math.PI;

  System.out.format("%f%n", pi);       // -->  "3.141593"
  System.out.format("%.3f%n", pi);     // -->  "3.142"
  System.out.format("%10.3f%n", pi);   // -->  "     3.142"
  System.out.format("%-10.3f%n", pi);  // -->  "3.142"
  System.out.format(Locale.FRANCE,
                    "%-10.4f%n%n", pi); // -->  "3,1416"

  Calendar c = Calendar.getInstance();
  System.out.format("%tB %te, %tY%n", c, c, c); // -->  "May 29, 2006"

  System.out.format("%tl:%tM %tp%n", c, c, c);  // -->  "2:34 am"

  System.out.format("%tD%n", c);    // -->  "05/29/06"

-3
2018-05-05 15:04