Une chose que je voudrais voir serait une reconnaissance du fait que double
de float
devrait être considérée comme une conversion élargissement, alors que float
pour double
se rétrécit (*). Cela peut sembler contre-intuitif, mais réfléchissez à la signification réelle des types:
- 0,1 f signifie "13 421 773,5 / 134 217 728, plus ou moins 1/268 435 456 environ".
- 0,1 signifie réellement 3 602 879 701 896 397/36 028 797 018 963 968, plus ou moins 1/72 057 594 037 927 936 environ "
Si l'on a un double
qui détient la meilleure représentation de la quantité "un dixième" et le convertit en float
, le résultat sera "13 421 773,5 / 134 217 728, plus ou moins 1/268 435 456 environ", qui est une description correcte de la valeur.
En revanche, si l'on a un float
qui détient la meilleure représentation de la quantité "un dixième" et le convertit en double
, le résultat sera "13 421 773,5 / 134 217 728, plus ou moins 1/72 057 594 097 927 936 environ" - un niveau de précision implicite ce qui est faux d'un facteur de plus de 53 millions.
Bien que la norme IEEE-744 exige que les calculs à virgule flottante soient effectués comme si chaque nombre à virgule flottante représente la quantité numérique exacte précisément au centre de sa plage, cela ne devrait pas être interprété comme impliquant que les valeurs à virgule flottante représentent réellement ces valeurs exactes. quantités numériques. Au contraire, l'exigence selon laquelle les valeurs doivent être supposées être au centre de leurs plages découle de trois faits: (1) les calculs doivent être effectués comme si les opérandes avaient des valeurs précises particulières; (2) des hypothèses cohérentes et documentées sont plus utiles que des hypothèses incohérentes ou non documentées; (3) si l'on veut faire une hypothèse cohérente, aucune autre hypothèse cohérente n'est susceptible d'être meilleure que de supposer qu'une quantité représente le centre de sa fourchette.
Soit dit en passant, je me souviens il y a environ 25 ans, quelqu'un est venu avec un paquet numérique pour C qui utilisait des "types de plage", chacun consistant en une paire de flottants de 128 bits; tous les calculs seraient effectués de manière à calculer la valeur minimale et maximale possible pour chaque résultat. Si l'on effectuait un grand calcul itératif long et arrivait à une valeur de [12.53401391134 12.53902812673], on pouvait être sûr que même si de nombreux chiffres de précision étaient perdus en raison d'erreurs d'arrondi, le résultat pouvait toujours être raisonnablement exprimé comme 12,54 (et ce n'était pas le cas '' t vraiment 12,9 ou 53,2). Je suis surpris de n'avoir vu aucun support pour de tels types dans les langages traditionnels, d'autant plus qu'ils semblent convenir aux unités mathématiques qui peuvent fonctionner sur plusieurs valeurs en parallèle.
(*) Dans la pratique, il est souvent utile d'utiliser des valeurs à double précision pour effectuer des calculs intermédiaires lorsque vous travaillez avec des nombres à simple précision, donc avoir à utiliser un transtypage pour toutes ces opérations peut être ennuyeux. Les langues pourraient aider en ayant un type "double flou", qui effectuerait des calculs en double, et pourrait être librement casté vers et depuis un simple; cela serait particulièrement utile si les fonctions qui prennent des paramètres de type double
et de retour double
pouvaient être marquées de manière à générer automatiquement une surcharge qui accepte et renvoie à la place un "double flou".