2013-02-14 11 views
19

Pracuję nad aplikacją, która działa na różnych wersjach systemu operacyjnego Unix i Windows 32-bit i 64-bitowego.Co to jest specyfikator formatu dla `long double`

Używam typ long double danych Kiedy zrobić sprintf() i używane long double z %lf w nim to działa dobrze z okien nie daje jakiegokolwiek błędu, jednak na platformie Solaris daje zrzutu.

Przykładowy kod dla tego samego problemu jest następujący.

void main(){ 
    string size = "16622"; 
    string sizeFact = "20"; 
    long long sizeLongLong = strtoll(size); 
    int factInt = atoi(sizeFact); 
    long double sizeLongDouble = (long double) sizeLongLong/pow(2, factInt); 
    char buf[512]; 
    sprintf(buf, "%.3lf %s", sizeLongDouble, "str");  
} 

Jak wspomniano powyżej kod działa poprawnie na Windows 32bit i 64bit jednak dla sprintf daje mi rdzeń na Solaris.

Próbowałem odlewania typu w sprintf to działało dobrze.

sprintf(buf, "%.3lf %s", (double) sizeLongDouble, "str"); 

Jaki jest specyfikator formatu dla long double?

Jaki błąd popełniam tutaj, czy używam niewłaściwego specyfikatora formatu, z powodu którego podaje on rdzeń?

Dlaczego muszę pisać jeszcze raz w sprintf()?

Odpowiedz

16

Dla long double należy użyć formatu "%Lf". Formatowanie z małym L (tj. "%lf") nie ma wpływu na systemy POSIX (patrz the specification).

+0

Wierzę, że to zależy od kompilatora. Czy '% Lf' działa na wszystkich wersjach' g ++ 'i' gcc'? –

+0

Próbowałem używać LF, które działało, czy działało dla wszystkich wersji g ++, gcc i visual studio na wszystkie smaki platformy Unix (32 i 64bit) i platformy Windows (32 i 64bit)? –

+0

@PrasadSDeshpande Jest to określone w POSIX, więc powinno działać we wszystkich środowiskach uniksowych lub uniksowych. –

0

W zależności od kompilatora, widziałem %Lf i %llf wypróbować oba i zobaczyć, który działa. Zastosowany %lf to specyfikator formatu dla double, a nie dla long double. Wierzę, że na g++ powinieneś użyć %llf, podczas gdy w visual studio jest to %Lf.

+0

'% Lf' jest tym, czego powinieneś używać w standardowym C.'% llf' jest nieprawidłowe, ale jest to przydatna informacja, jeśli chodzi o niezgodną implementację. – hvd

+0

Wiem to z konkursów informatycznych, w których zawsze mam z nimi problemy. Jeśli użycie 'llf' nie działa, używam' Lf'. Przez większość czasu 'llf' jest tym, który działa. Jeśli dostałem nickle za każdym razem straciłem kilka z tego powodu ... –

3

The documentation czyni to całkiem jasne:

L

następnym , A, E, E, F, K, G lub G konwersji odpowiada długa podwójna argumentacja. (C99> zezwala na% LF, ale SUSv2 nie.)

Powinieneś więc użyć %Lf.

0

Dodałbym to jako komentarz, ale nie mogę tego jeszcze zrobić. Ważne jest również, aby pamiętać, że można również użyć „p” notacji wykładniczej dla long double w ten sposób:

  • stałym punktem notacja: %Lf
  • wykładnicza notacja: %Le
  • notacja P: %La
Powiązane problemy