Analyser long double de la chaîne

J'ai besoin d'analyser les littéraux à virgule flottante dans le code C à l'aide d'OCaml.

Le type float d'OCaml est 64 bits. J'ai la chaîne du littéral, sa valeur numérique arrondie à 64 bits et son genre (float, double ou long double).

Le problème concerne les littéraux avec une valeur numérique supérieure à 64 bits:

  1. longs doubles littéraux
  2. float des littéraux avec le suffixe 'f' pour lesquels des erreurs de double arrondi se produiraient s'ils ne l'avaient pas.

Le module de précision arbitraire d'OCaml peut analyser des nombres rationnels à partir de chaînes comme "123/123", mais pas "123.123", "123e123", "0x1.23p-1" comme ils pourraient apparaître en C.

Contexte: J'analyse en valeur les programmes C avec CIL .

Les littéraux doubles de toutes tailles et les littéraux flottants avec une valeur numérique qui convient au 64 bits sont toujours correctement représentés. En arrondissant de double précision à simple précision, je peux également reproduire double erreurs d'arrondi .

2
Qu'est-ce qu'un "nombre à virgule flottante C" dans votre esprit/contexte?
ajouté l'auteur Kerrek SB, source
Voir éditer. J'ai besoin d'obtenir la valeur numérique des littéraux à virgule flottante dans le code C. L'analyse syntaxique est indépendante de la durée réelle des registres.
ajouté l'auteur ralf, source
Mise à jour de la question. Même pour obtenir des flottants à simple précision, il est nécessaire d’analyser les littéraux avec des valeurs supérieures à 64 bits.
ajouté l'auteur ralf, source
Le coin de Nitpicker: en réalité, sur quelques plates-formes seulement, long double a 128 bits; sur x86, il s'agit généralement de 80 bits (précision interne de la FPU x87), et pour VC ++, il s'agit simplement d'un double ( plus d'infos ).
ajouté l'auteur Matteo Italia, source
Je ne suis pas tout à fait sûr de ce que vous entendez par l'analyse des nombres. Voulez-vous dire que vous voulez juste vérifier que les constantes numériques sont bien formées? Ou voulez-vous les traduire en une valeur numérique? Ensuite, vous avez un problème de représentation ainsi qu'un problème d'analyse.
ajouté l'auteur Jeffrey Scofield, source
Je trouve un peu étrange que quelqu'un qui s'intéresse particulièrement au double arrondi dise quelque chose du type: "Le type float d'OCaml est 64 bits, la fonction float_of_string fonctionne donc bien pour les types float et double de C." La fonction float_to_string ne ne fonctionne pas pour les flottants à simple précision, bien sûr: blog.frama-c.com/index.php?post/2010/11/20/ & hellip;
ajouté l'auteur Pascal Cuoq, source
Vous voudrez peut-être aussi savoir que strtod() et strtof() (le premier utilisé par OCaml, le second que vous puissiez interfacer pour vous-même) ont des bogues de longue date sous Linux qui montrer sur ces chiffres qui présenteraient les erreurs de double arrondi. Je résous le même problème récemment, mais je n’ai pas fait long double , je ne suis donc pas sûr que ma solution vous intéresserait. De plus, il est en Frama-C, avec sa couche d’interface commune au-dessus de Big_int/Zarith.
ajouté l'auteur Pascal Cuoq, source

2 Réponses

I wrote my answer in the form of a blog post

Pour résumer certains des points ici: vous pouvez interfacer strtold() et strtof() à partir de OCaml. Dans le premier cas, vous devriez considérer comment vous allez stocker le résultat qu'il produit, car il n'y a de point que si long double est plus grand que double sur votre hôte. architecture. Reste le problème que ces fonctions sont boguées dans l’une des bibliothèques C les plus utilisées. Très légèrement buggy, mais buggy pour exactement les exemples qui vont être intéressants si vous faites cela pour étudier le double arrondi.

Une autre façon consiste à écrire votre propre fonction, à partir de autre poste sur le blog auquel vous faites référence.

Enfin, la phrase "Même si les flottants à simple précision sont corrects me demande d'analyser les littéraux avec des valeurs supérieures à 64 bits" que vous utilisez dans les commentaires est toujours une façon étrange de l'exprimer. Le ou les formats intermédiaires dans lesquels vous pouvez analyser la représentation d'un float à simple précision avant de l'arrondir à en simple précision doivent être sans perte, sinon il y aura un arrondi double. Le double arrondi peut être plus ou moins difficile à présenter en fonction de la précision du format intermédiaire avec pertes, mais l'utilisation de formats à virgule flottante binaire de 80 bits ou de 128 bits ne va pas résoudre le problème, mais le rendre plus subtile. Dans l’algorithme simple que je recommande, le format intermédiaire est une fraction de deux entiers multi-précision.

2
ajouté

Je ne vois pas la question dans cette question :)

En supposant que vous ayez besoin d’un analyseur ocaml pour "C float literals" - la réponse est - écrivez-en un vous-même, ce n’est pas très difficile et vous aurez un contrôle strict sur les détails d’implémentation et sur ce que "C float littéral" signifie réellement.

0
ajouté
Vous avez raison, il n'y a plus vraiment de question. J'espérais qu'il y aurait un moyen plus facile que d'écrire moi-même un analyseur.
ajouté l'auteur ralf, source
Je suppose que non, car votre tâche est plutôt spécifique.
ajouté l'auteur ygrek, source