Dans la présentation classique des quaternions, où on prend comme base sur R, 1, i, j, k avec les relations qui vont bien (comme p.ex. dans Wikipedia).
Je me suis demandé si on ne pouvais pas prendre le problème dans l'autre sens. C'est à dire de proposer un langage dans lequel on déclare utiliser un nombre réel pour faire une opération, ce qui permet ensuite de transformer le code. Mais comme un ordinateur ne peut pas calculer avec des réels, il faut des restrictions, typiquement un range et une précision.
Je ne suis pas sûr de bien te comprendre, mais j'ai l'impression qu'en gros tu veux que le langage se retienne le plus longtemps possible de faire les calculs sur les nombres réels jusqu'à ce que "l'expression finale" soit connue, pour être adéquatement simplifiée avant que le calcul proprement dit n'ait lieu, en choisissant une précision adéquate?
Je pense qu'on est très loin de pouvoir faire ça de façon automatique et dans une généralité assez grande pour que le traitement soit implémenté par les langages généralistes. La difficulté tient dans le fait qu'il faut pouvoir faire des optimisations qui soient cohérentes dans un contexte que le compilateur ne connaît a priori pas, par exemple un système d'équations que le compilateur ne connaît pas parceque les systèmes d'équations ne sont pas un concept du langage.
Dans ce genre d'applications, on fait une analyse a priori des calculs qu'on a à mener, et on peut aussi, selon l'entrée, choisir telle ou telle méthode de calcul qui va minimiser l'erreur, au besoin en s'aidant d'un logiciel de calcul symbolique, puis après cette analyse on implémente le calcul en flottants. En gros ce que tu proposes de laisser au compilateur est aujourd'hui largement un processus manuel.
Je ne sais pas si cela existe déjà. Mais j'imagine bien un langage qui propose les fonctions typiques (tan, sin, integral, etc...) qui ne sont pas des fonctions en C écrite à la main avec une précision maximum sur base d'une série quelconque, qui s'enchainent. Mais leur vrai définition mathématique qui peuvent ensuite se réduire automatiquement à un polynôme, avec la précision finale demandée.
La principale difficulté est que c'est très difficile de savoir où "couper" la série pour obtenir la précision nécessaire, sans faire trop de calculs. En pratique il faut faire une analyse au cas par cas de chaque série à calculer et utiliser des heuristiques pour gagner du temps dans le calcul. Aussi la plupart des implémentations des fonctions mathématiques de la libc (hors implémentations spécialisée) ne calculent pas toutes les fonctions de façon exacte (le ou les deux derniers bits sont souvent faux, pour raccourcir le calcul.) La bibliothèque CRLIBM implémente des fonctions exactes en double précision, le lien est une documentation abondante qui permet de se faire une idée de la complexité du problème et des méthode utilisées.
Le programme dc utilise des flottants en précision arbitraire, cela peut te donner une seconde piste pour tes investigations:
Calcul d √2 avec une précision de 199
```
199 k
2 v p
1.4142135623730950488016887242096980785696718753769480731766797379907\
324784621070388503875343276415727350138462309122970249248360558507372\
126441214970999358314132226659275055927557999505011527820605714
2 ^ p
1.9999999999999999999999999999999999999999999999999999999999999999999\
999999999999999999999999999999999999999999999999999999999999999999999\
999999999999999999999999999999999999999999999999999999999999998
```
Par contre toutes les fonctions classiques d'une bibliothèque mathématique (exponentielle, logarithme, gamma, Bessel, etc.) ne sont pas implémentées. Les algorithmes de base pour implémenter des nombres flottants avec une précision arbitraire est décrite dans le livre de Knuth (The Art of Computer Programming Vol. 2).
Un intérêt du travail en précision arbitraire est au contraire d'utiliser une très faible précision, cela permet de facilement comparer la stabilité numérique des algorithmes utilisés.
[^] # Re: HS math : polynômes de complexe
Posté par Michaël (site web personnel) . En réponse à la dépêche Le Frido : un livre, libre, de mathématiques pour l’agrégation. Évalué à 3. Dernière modification le 05 octobre 2017 à 10:59.
Dans la présentation classique des quaternions, où on prend comme base sur R, 1, i, j, k avec les relations qui vont bien (comme p.ex. dans Wikipedia).
Je ne suis pas sûr de bien te comprendre, mais j'ai l'impression qu'en gros tu veux que le langage se retienne le plus longtemps possible de faire les calculs sur les nombres réels jusqu'à ce que "l'expression finale" soit connue, pour être adéquatement simplifiée avant que le calcul proprement dit n'ait lieu, en choisissant une précision adéquate?
Je pense qu'on est très loin de pouvoir faire ça de façon automatique et dans une généralité assez grande pour que le traitement soit implémenté par les langages généralistes. La difficulté tient dans le fait qu'il faut pouvoir faire des optimisations qui soient cohérentes dans un contexte que le compilateur ne connaît a priori pas, par exemple un système d'équations que le compilateur ne connaît pas parceque les systèmes d'équations ne sont pas un concept du langage.
Dans ce genre d'applications, on fait une analyse a priori des calculs qu'on a à mener, et on peut aussi, selon l'entrée, choisir telle ou telle méthode de calcul qui va minimiser l'erreur, au besoin en s'aidant d'un logiciel de calcul symbolique, puis après cette analyse on implémente le calcul en flottants. En gros ce que tu proposes de laisser au compilateur est aujourd'hui largement un processus manuel.
La principale difficulté est que c'est très difficile de savoir où "couper" la série pour obtenir la précision nécessaire, sans faire trop de calculs. En pratique il faut faire une analyse au cas par cas de chaque série à calculer et utiliser des heuristiques pour gagner du temps dans le calcul. Aussi la plupart des implémentations des fonctions mathématiques de la libc (hors implémentations spécialisée) ne calculent pas toutes les fonctions de façon exacte (le ou les deux derniers bits sont souvent faux, pour raccourcir le calcul.) La bibliothèque CRLIBM implémente des fonctions exactes en double précision, le lien est une documentation abondante qui permet de se faire une idée de la complexité du problème et des méthode utilisées.
Le programme
dcutilise des flottants en précision arbitraire, cela peut te donner une seconde piste pour tes investigations:Calcul d √2 avec une précision de 199
```
199 k
2 v p
1.4142135623730950488016887242096980785696718753769480731766797379907\
324784621070388503875343276415727350138462309122970249248360558507372\
126441214970999358314132226659275055927557999505011527820605714
2 ^ p
1.9999999999999999999999999999999999999999999999999999999999999999999\
999999999999999999999999999999999999999999999999999999999999999999999\
999999999999999999999999999999999999999999999999999999999999998
```
(cf. https://apod.nasa.gov/htmltest/gifcity/sqrt2.10mil pour le premier million des décimales de racine de 2.)
Par contre toutes les fonctions classiques d'une bibliothèque mathématique (exponentielle, logarithme, gamma, Bessel, etc.) ne sont pas implémentées. Les algorithmes de base pour implémenter des nombres flottants avec une précision arbitraire est décrite dans le livre de Knuth (The Art of Computer Programming Vol. 2).
Un intérêt du travail en précision arbitraire est au contraire d'utiliser une très faible précision, cela permet de facilement comparer la stabilité numérique des algorithmes utilisés.