Conversions dans SANE
SANE fournit des conversions entre le type étendu et chacun des autres types SANE (Single, Double et Comp). Une implémentation SANE particulière fournit également des conversions entre les types étendus et les types numériques pris en charge dans son environnement plus large particulier, comme illustré dans l'image suivante. Par exemple, une implémentation Pascal inclut des conversions entre le type étendu et le type entier Pascal.
Les implémentations SANE fournissent également soit des conversions entre des chaînes de caractères décimales et des types SANE, soit des conversions entre un type d'enregistrement décimal et des types SANE, soit les deux. Les conversions entre les enregistrements décimaux et les chaînes de caractères décimales peuvent également être incluses.
Conversions entre Extended et Single ou Double
Une conversion en étendue est toujours exacte. Une conversion de Extended vers Single ou Double déplace une valeur vers un type d'entreposage avec moins d'intervalle et de précision, et définit les indicateurs d'exception de dépassement de capacité, de dépassement inférieur et inexact selon le cas.
Remarque Pascal : avec les extensions SANE d'Apple, Pascal effectue la conversion entre le format étendu et les formats simples ou doubles dans les cas suivants :
- Lors de l'évaluation d'expression
- Sur les affectations vers ou depuis Real ou Double
- Sur paramètre passant par valeur
- Par des fonctions de conversion explicites
Conversions d'Extended à Single ou Double
- Function Num2Real(x:Extended):Real;
- Function Num2Double(x:Extended):Double;
Ces fonctions de conversion sont utiles lorsque vous souhaitez contraindre un résultat au format Single ou Double sans utiliser d'instruction d'affectation séparée. Par exemple, vous pouvez utiliser une fonction de conversion pour tester une variable à forme unique par rapport à une expression, comme illustré dans l'exemple suivant.
Exemple : X est-il négligeable ?
Supposons que vous ayez besoin de savoir si une valeur de simple précision x est négligeable par rapport à une autre valeur simple précision y. Vous pouvez effectuer un calcul pour le déterminer, par exemple :
- If((y + x) = y)Then Xneglig:=true;
Étant donné que les implémentations SANE évaluent (y + x) au format Extended et effectuent la comparaison au format Extended, le test ne fonctionnera pas comme vous pourriez l'attendre. La déclaration ci-dessus donne à Xneglig la valeur vraie uniquement pour les valeurs beaucoup plus petites de x étant n négligeables par rapport à la précision étendue. Pour déterminer si x est négligeable simplement par rapport à la simple précision, vous pouvez arrondir (y + x) co simple, comme ceci :
- If(Num2Real(y + x) = y) then Xneglig:=true;
Conversions en Comp et autres formats intégraux
- Function Num2Integer(x:Extended):Integer;
- Function Num2Longint(x:Extended):LongInt;
- Function Num2Comp(x:Extended):Comp;
Les routines SANE convertissent les nombres en formats entiers en arrondissant d'abord à une valeur entière (en respectant le sens d'arrondi actuel) puis, si possible, en transmettant cette valeur au format de destination. Si l'opérande source d'une conversion d'Extended en Comp est un NaN, un Infinity ou en dehors de l'intervalle pour le format Comp, alors le résultat est le NaN de Comp. Si la source est un Infinity ou est en dehors de l'intervalle, l'exception invalide est signalée.
Pour la conversion en un type entier spécifique au système (n'ayant pas de représentation appropriée pour le résultat exceptionnel), si l'opérande source est un NaN, un infini ou est en dehors de l'intervalle pour ce type, alors invalide est signalé.
- Remarque : Les valeurs de résultat des conversions de NaN, d'infinis et de valeurs hors plage en types d'entiers en complément à deux peuvent être différentes dans les implémentations SANE pour différents microprocesseurs. Veuillez vous référer à la section sur les conversions dans la partie de ce livre pour le microprocesseur de votre machine.
Notez que l'arrondi IEEE en formats intégraux diffère des fonctions d'arrondi les plus courantes sur les cas intermédiaires. Avec le sens d'arrondi par défaut (au plus proche), les conversions en Comp ou en un type d'entier spécifique au système arrondiront 0,5 à 0, 1,5 à 2, 2,5 à 2 et 3,5 à 4, arrondi à pair sur les cas intermédiaires.
- Remarque Pascal : Les programmes peuvent utiliser des affectations pour convertir des variables à virgule flottante au format Comp, mais pas en nombre entier. Pour cela, vous devez utiliser les fonctions explicites Round, Trunc, Num2Integer et Num2Longint. Notez que Round n'est pas sensible au réglage de la direction d'arrondi, mais effectue toujours un arrondi de type Pascal au plus proche (arrondi à partir de zéro dans les cas intermédiaires).
- Remarque sur le langage : en général, lorsque les langages définissent le comportement d'arrondi pour la conversion au format entier ou à la valeur intégrale, les langages SANE s'y conforment.
Conversions entre binaire et décimal
La norme IEEE pour l'arithmétique binaire à virgule flottante spécifie l'ensemble de valeurs numériques représentables dans chaque format à virgule flottante. Il est important de reconnaître que les formats d'entreposage binaires ne peuvent représenter exactement la partie fractionnaire des nombres décimaux que dans quelques cas; dans tous les autres cas, la représentation sera approximative.