web-dev-qa-db-fra.com

Quel est le spécificateur de format pour `long double`

Je travaille sur une application qui fonctionne avec différentes versions de systèmes d'exploitation Unix et Windows 32 bits et 64 bits.

J'utilise le type de données long double. Lorsque je fais sprintf() et que j'utilise long double avec %lf, cela fonctionne correctement avec Windows ne donne aucun type d'erreur, mais sur la plate-forme Solaris, il crée un vidage mémoire.

Voici un exemple de code pour le même problème.

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");    
}

Comme mentionné ci-dessus, le code fonctionne bien sous Windows 32 bits et 64 bits, mais pour Sprintf, il me donne le cœur sous Solaris.

J'ai essayé le casting avec sprintf, cela a bien fonctionné.

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

Quel est le spécificateur de format pour long double?

Quelle est l'erreur que je fais ici, est-ce que j'utilise un spécificateur de format incorrect à cause duquel il donne un noyau?

Pourquoi dois-je taper cast une fois de plus dans sprintf ()?

22
Prasad S Deshpande

Pour long double, vous devez utiliser le format "%Lf". Le formatage avec un petit L (c.-à-d. "%lf") n’a aucun effet sur les systèmes POSIX (voir la spécification ).

20
Some programmer dude

La documentation rend ceci assez clair:

L

Une conversion suivante a, A, e, E, f, F, g ou G correspond à un double argument long. (C99> autorise% LF, mais pas SUSv2.) 

Donc, vous devriez utiliser %Lf.

3
unwind

J'ajouterais ceci comme commentaire mais je ne peux pas le faire pour le moment. Il est également important de noter que vous pouvez également utiliser la notation exponentielle 'p' pour long double de cette manière:

  • Notation à virgule fixe: %Lf
  • Notation exponentielle: %Le
  • notation p: %La
0
lhcopetti

En fonction du compilateur, j'ai vu %Lf et %llf essayer les deux et voir lequel fonctionne. Le %lf que vous utilisez est le spécificateur de format pour double pas pour long double. Je crois que sur g++, vous devriez utiliser %llf, tandis que sur Visual Studio, il s'agit de %Lf.

0
Ivaylo Strandjev