Calculs d'intervalles flottants (projet no. 3)

C possède deux types flottants: float et double. On suppose dans ce projet que tous les calculs sont faits en double (ce qui est souvent le cas), et que le type C double correspond exactement au type OCaml float.

Les flottants sont supposés obéir au format défini par la norme IEEE754. Ceci a un certain nombre de conséquences. D'abord, les flottants se découpent en deux catégories: les nombres flottants, et les NaN (``not a number''). Ces derniers représentent les résultats de calculs échoués comme 0.0/0.0 ou log (-1.0). Parmi les nombres flottants, on retrouve des nombres usuels comme 1.0, -2.34 ou 3.1415926535, mais aussi plus infini et moins infini. Attention, contrairement au cours [moins infini, 3.0] par exemple est l'intervalle qui contient tous les flottants £ 3.0, incluant moins infini!

Les infinis sont définis comme les constantes Arith.float_plus_infini et Arith.float_moins_infini. Vous pouvez tester si un float OCaml x est un Nan en appelant Arith.float_is_nan x.

On va représenter les flottants v par des couples (itv, nan), où itv est un intervalle (cf. intervalle.ml) de variation possible des valeurs de v lorsqu'elles parcourent les nombres flottants (y compris plus et moins infini!), et où nan est un booléen qui est vrai si et seulement si v peut valoir un NaN.

La difficulté principale de ce projet est de calculer correctement l'addition, la multiplication et la division. On notera les cas où des opérations arithmétiques retournent des NaN sont: l'addition de plus infini et de moins infini; la multiplication d'un infini par 0.0; la division de 0.0 par 0.0; la division d'un infini par un infini. Ceci constituera probablement l'essentiel de votre effort dans ce projet.

La fonction itv_float_convert_int est censée convertir un intervalle d'entiers en intervalle de flottants correspondant. Il s'agit de la fonction abstraite correspondant au cast (double)i, où i est un entier. On supposera que tous les entiers de tous les types entiers sont représentables exactement comme des double.

Quand aux fonctions de comparaison £, <, ==, noter que le résultat de n'importe quelle comparaison avec un NaN retourne toujours faux. (En particulier, et aussi surprenant que cela paraisse, x==x est faux lorsque x est un NaN.) On rappelle que faux est l'entier 0, vrai l'entier 1 en C.


This document was translated from LATEX by HEVEA.