2017-04-10 1 views
1

travaillant sur une application de calculatrice multiplateforme, je viens de remarquer que sur les valeurs W32 NaN/Inf sont converties différemment en chaînes que sur OSX/linux. à savoir.Comment est-ce que je fais printf utilise 'nan' sur w32?

linux/Mac OS X utilise nan rsp inf, alors que W32 utilise quelque chose comme 1.#INF resp. 1.#QNAN.

Quelle est la manière canonique d'obtenir une représentation identique sur toutes les plateformes?

je voudrais éviter de vérifier manuellement les valeurs avec isnan() et isinf() et les hardcoding inf resp nan représentations de chaîne. (J'ai lu un commentaire dans What is the difference between IND and NAN numbers que le véritable "coupable" est l'implémentation de la libc, plutôt que la plate-forme).

+0

Il n'y en a tout simplement pas, aucune norme n'exige la représentation * string * de la valeur double. Pas même les valeurs doubles normales, parfois une période et parfois une virgule. La représentation MSVC est assez bancale, vous pouvez en faire un [beaucoup plus wonkier] (https://blogs.msdn.microsoft.com/oldnewthing/20130228-01/?p=5103) :) Vous devrez le faire cohérent vous-même. –

+0

Qu'est-ce que le tricker, c'est que vous voulez probablement aussi l'inverse - en changeant le texte - et toutes ses variantes - dans un NaN. – chux

Répondre

1

En C11 (et peut-être plus tôt), ces représentations sont mandaté par la spécification, au moins partiellement. A partir de la norme ISO/IEC 9899: 2011, section 7.21.6.1 La fonction fprintf, paragraphe 8:

A double l'argument représentant une infinité est converti en un des styles [-]inf ou [-]infinity - quel style est défini par l'implémentation. Un argument de type double représentant un NaN est converti en l'un des styles [-]nan ou [-]nan(n-char-séquence) - le style et le sens d'un n-char-séquence, est définie par l'implémentation. Le F spécificateur de conversion produit INF, INFINITY ou NAN au lieu de inf, infinity ou nan, respectivement.

Rien de plus que cela, vous allez être seul pour, j'ai peur.