Comments on Le format %a des flottants, et autres crottes de ragondins

Hélène (2016-12-18T11:28:55Z)

Ruxor (2015-10-29T18:27:52Z)

@Vicnent: Je vois ce que tu veux dire : il serait en effet peut-être plus correct d'utiliser un autre terme (un « standard » ?) pour quelque chose qui n'est pas juridiquement contraignant. En fait, il doit exister très peu de normes (juridiquement contraignantes, donc) en informatique, parce que c'est une activité qui n'est pas réglementée.

Mais je pense que c'est une distinction à la con : le fait est que les documents que publie l'ISO sont tous écrits dans le même style impératif mais n'ont pas de portée juridique par eux-mêmes — ils en acquièrent parce que le législateur ou régulateur de tel ou tel pays décide de leur en donner un[#]. Ça me semble être une terminologie inutilement byzantine que de qualifier ces documents de standards jusqu'au jour où les pouvoirs publics prennent une telle décision, et norme ensuite — alors que le document n'a pas changé, et qu'on ne peut pas savoir au moment où il est écrit quel sera son statut juridique décidé par des entités externes. En plus de ça, il peut y avoir des cas douteux : qu'est-ce que ça veut dire, que quelque chose soit obligatoire ? si ce n'est pas légalement/réglementairement obligatoire mais que ça l'est pour obtenir quelque chose (un nom, une étiquette, l'adhésion à une organisation, une condition prévue dans un contrat, etc.). Par exemple, si tu t'engages contractuellement à me fournir un compilateur C conforme au standard ISO 9899:2011, alors ce standard devient une norme pour toi tandis que le standard n'a pas changé. Bref, cette distinction standard/norme me semble inutile pour désigner les documents (elle peut avoir un sens si on parle de l'activité elle-même, qui peut être régie par des normes, etc.).

[#] Le fait que le législateur ou le régulateur incorporent les standards de l'ISO dans leur droit est, d'ailleurs, quelque chose de hautement polémique, et que certains considèrent comme anticonstitutionnel (dans tel ou tel pays), parce que les standards ISO ne sont pas librement disponibles (je trouve ça complètement scandaleux, d'ailleurs : les pouvoirs publics des pays adhérant à l'ISO devraient payer ce qu'il faut pour qu'ils le soient), or la Loi se doit de l'être, donc [concluent ces gens] soit ces standards ne peuvent pas devenir loi même par inclusion, soit à partir du moment où ils le deviennent ils perdent automatiquement leur copyright dans la juridiction concernée. Il y a plusieurs batailles juridiques en cours aux États-Unis sur ce terrain, il me semble.

Vicnent (2015-10-29T16:56:55Z)

Ce que je cherche à dire est que ce qui s'appelle "norme" n'est en fait (et je cite) : il s'agit d'abord de "consensus généraux" à des fins "d'application volontaire". (Et c'est ISO qui le dit - cf lien)
Et donc en rien des obligations, puisqu'une norme signifie que c'est une règle à suivre alors qu'ici, chez ISO, on a la notion de volontariat simplement.

JML (2015-10-29T11:31:33Z)

OK je comprends bien l'utilité pratique du %a maintenant, merci.
Pour le patch de coreutils, ce que je ne comprends pas c'est « entre temps je devais, à chaque mise à jour des coreutils pour un problème de sécurité quelconque, refaire mon patch et le distribuer sur chacune des N machines où je l'utilisais ». (ça n'a pas l'air d'être une histoire de merge rendu non-trivial par des commits des développeurs du paquet)

Ruxor (2015-10-29T10:40:01Z)

@jonas: you're right, I forgot the 0x prefix a couple of times (fixed): I do not mean that 1.8p1 alone should be accepted as a synonym for 3., but that 0x1.8p1 should.

@JML: J'ai écrit un patch aux coreutils pour avoir une chance que ces utilitaires soient universellement installés : si j'avais écrit mes propres utilitaires, ils ne se seraient pas retrouvés sur quasiment tous les systèmes, même les plus minimaux (alors que sha1sum l'est et, de fait, mon sha256sum a fini par l'être).

Pour ce qui est du format %a, bien sûr l'exemple de sqrt(2.) n'est pas terrible (encore que, on n'a pas le droit d'écrire "const double sqrt2 = sqrt(2.)" dans un programme C, et si on écrit sqrt(2.) dans les expressions finales il faut avoir confiance dans le fait que le compilo va bien l'optimiser en une constante). Par contre, vouloir écrire un fichier texte pas nécessairement destiné à être relu par un humain, c'est assez courant : les formats binaires, c'est plus compact, mais c'est vraiment casse-gueule à faire, déjà il y a le problème de l'endianness qui fait qu'on ne peut pas simplement écrire fwrite(&x,sizeof(x),1,stdout) sauf si on est sûr de ne jamais relire sur une machine différente, et globalement un format binaire ça oblige à se rappeler plein de choses (un format texte on peut souvent retrouver son format juste en l'inspectant visuellement).

Mais aussi, un format texte, ça peut être l'entrée à un autre programme (ou un autre langage dans lequel lire des données binaires serait pénible). Par exemple, mon programme qui calculait les harmoniques sphériques de la forme de la Terre, il sauvegarde les données dans un fichier texte pour que je puisse les réutiliser après : j'ai relu ce fichier, notamment, avec un script Perl, et avec GNUplot. Et je me suis beaucoup énervé que ma version de Perl ne comprenne pas le format %a (ça a été corrigé juste après, mais maintenant il faudra des années pour que ça passe dans Debian stable) et que GNUplot non plus.

D'autre part, la lecture par un humain du format %a, elle n'est pas impossible non plus : s'il s'agit de données pour lesquelles on a beaucoup de nombres de la forme 1/2^n qui vont apparaître, ça peut avoir un intérêt.

@DH: En fait c'est 0x1.2a4p+02 (j'avais oublié le 0x, cf. le commentaire de jonas : j'ai corrigé ça), mais j'ai déjà vérifié, Python est nul comme plein d'autres.

DH (2015-10-29T09:58:30Z)

Je ne sais pas si Python prétend suivre la syntaxe de printf/scanf du C (tout bêtement parce que je ne connais pas assez le C pour en juger). Mais en tout cas, le format "%a" n'y existe pas, et une entrée comme "1.2a4p+02" n'est pas comprise par l'interpréteur…

JML (2015-10-28T23:08:23Z)

Choses que je n'ai pas comprises :
- Pourquoi repropager un patch local de coreutils au lieu d'avoir bêtement un xxx/bin avec tes fonctions persos?
- Manifestement tu aurais l'utilité d'un %a mais tu ne décris pas d'application dans toute sa concrétude alors j'ai du mal à bien comprendre ton besoin.
* S'il s'agit d'avoir une constante comme racine de 2 on écrit habituellement sqrt(2.0) qui est lisible
* S'il s'agit de sérialiser on utilise habituellement une bibliothèque toute faite ou une valeur binaire, et si on veut aussi pouvoir lire le fichier (pour vérification ?) on fait une fonction de conversion en ascii etc. Je crois comprendre que tu veux avoir un format à la fois plus ou moins lisible par un humain et désérialisable ? Probablement pour une application d'analyse numérique qui m'échappe ?
* S'il s'agit d'avoir vraiment une constante explicite (longue à calculer par exemple) je crois savoir que l'habitude est de l'entrer comme entier long long que l'on caste en double avec l'explication de se qui se passe en commentaire ; bien sale mais comme la situation est rare et qu'il est douteux que ça fasse moins de bugs d'utiliser la notation moderne standardisée vu qu'il faut bien vérifier les valeurs hexas par rapport à la valeur de référence sortie d'ailleurs…
Disclaimer : je ne prétends pas qu'il y ait un problème dans ce que tu expliques, qui comme souvent m'ouvre un paysage dont j'ignorais l'existence, je me fais simplement l'avocat du diable pour mettre en lumière mon déficit de compréhension.

jonas (2015-10-28T21:45:50Z)

I approve of the specific message that floating point number parsers should accept hexadecimal floats as input. But do you seriously mean to suggest that they should accept that format without the leading 0x prefix? Because that sounds like a bad idea to me.

Ruxor (2015-10-27T21:35:11Z)

Je ne suis pas sûr de comprendre ce que tu cherches à savoir, mais il y a bien une norme du C, d'ailleurs elle est essentiellement illisible si on n'est pas avocat. La norme C99 (i.e., ISO/IEC 9899:1999) se trouve facilement en cherchant "ff8dc9d8f109111a91a70cc29fb16168" sur Google ; quant à celle du C11 (i.e., ISO/IEC 9899:2011), je ne l'ai pas, mais il y a un draft sur <URL: http://www.compsci.hunter.cuny.edu/~sweiss/resources/c11standard.pdf > qui coïncide probablement de très près avec la norme finale (je soupçonne qu'il manque juste le tampon de l'ISO dessus).

Vicnent (2015-10-27T21:17:55Z)

en passant (je ne cherche ni excuse ni explication à la situation que tu dénonces), je me suis posé la question de la différence entre ISO et ANSI (la vérité est par ailleurs que je n'ai aucun avis sur la façon dont les constructeurs de compilateur ou d'interpréteur s'appuient sur les "normes".

Par ailleurs, depuis C99, il y a C11 qui est apparu.

Cependant, il semble, à la lecture du lien 1 que s'il il existe bien une norme, le lien 2 (iso.org) semble indiquer que cela n'en est en rien et qu'il s'agit d'abord de "consensus généraux" à des fins "d'application volontaire".

1 : C99 et suivante <URL: https://fr.wikipedia.org/wiki/C_(langage)#Normalisation >
2 : ISO.org <URL: http://www.iso.org/iso/fr/about/iso_members/iso_member_body.htm?member_id=2188 >


You can post a comment using the following fields:
Name or nick (mandatory):
Web site URL (optional):
Email address (optional, will not appear):
Identifier phrase (optional, see below):
Attempt to remember the values above?
The comment itself (mandatory):

Optional message for moderator (hidden to others):

Spam protection: please enter below the following signs in reverse order: 938268


Recent comments