%EDITFLT
Éditer en notation scientifique
Écrit un nombre en notation scientifique : un chiffre, un point, la suite de la mantisse, la lettre E et l'exposant signé.
Syntaxe
%EDITFLT(nombre)
nombre- Une zone ou une expression numérique : réel, décimal empaqueté, zoné ou entier. Elle est d'abord convertie en flottant.
- Résultat
- Une chaîne de 23 caractères pour un
float(8)(15 décimales de mantisse, signe, exposant sur trois chiffres) et 14 caractères pour unfloat(4).
À quoi ça sert
Pour afficher une grandeur scientifique (une distance, une concentration, un taux très petit), la notation exponentielle est la seule lisible. %EDITFLT donne un texte de forme fixe, avec toujours le signe de la mantisse et de l'exposant, ce qui le rend facile à relire ou à écrire dans un fichier.
Exemple 1 : Réels, décimaux et entiers
**free
// %EDITFLT : afficher un nombre en notation scientifique (mantisse et exposant).
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s distance float(8) inz(12345.678);
dcl-s faible float(8) inz(0.000123);
dcl-s negatif float(8) inz(-5);
dcl-s nul float(8) inz(0);
dcl-s montant packed(9:2) inz(1234567.89);
dcl-s compte int(10) inz(42);
dcl-s simple float(4) inz(12345.678);
snd-msg 'Reel 12345.678 : [' + %editflt(distance) + ']';
snd-msg 'Reel 0.000123 : [' + %editflt(faible) + ']';
snd-msg 'Reel -5 : [' + %editflt(negatif) + ']';
snd-msg 'Reel 0 : [' + %editflt(nul) + ']';
snd-msg 'Packed 1234567.89 : [' + %editflt(montant) + ']';
snd-msg 'Entier 42 : [' + %editflt(compte) + ']';
snd-msg 'Reel float(4) : [' + %editflt(simple) + ']';
snd-msg 'Avec %CHAR : [' + %char(distance) + ']';
snd-msg 'Avec %CHAR(%DECH) : [' + %char(%dech(distance : 9 : 3)) + ']';
snd-msg 'Longueur : ' + %char(%len(%editflt(distance)));
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Reel 12345.678 : [+1.234567800000000E+004]
Reel 0.000123 : [+1.230000000000000E-004]
Reel -5 : [-5.000000000000000E+000]
Reel 0 : [+0.000000000000000E+000]
Packed 1234567.89 : [+1.234567890000000E+006]
Entier 42 : [+4.200000000000000E+001]
Reel float(4) : [+1.2345678E+04]
Avec %CHAR : [+1.234567800000000E+004]
Avec %CHAR(%DECH) : [12345.678]
Longueur : 23
Un réel 12345,678 donne +1.234567800000000E+004 ; 0,000123 donne E-004 ; -5 donne -5.000000000000000E+000 et zéro +0.000000000000000E+000. Les décimaux et les entiers sont acceptés : 1234567,89 en packed donne la même forme.
Un float(4) a moins de chiffres significatifs : +1.2345678E+04 (14 caractères).
Les deux lignes suivantes comparent avec %CHAR : sur un réel, il donne exactement la même notation. Pour obtenir 12345.678, il faut passer par %DECH.
Le piège
Un réel affiché avec %CHAR est déjà en notation scientifique : %CHAR(distance) donne +1.234567800000000E+004, comme %EDITFLT. Beaucoup de développeurs le découvrent au moment de l'affichage. Pour un nombre lisible, faire %CHAR(%DECH(distance : 9 : 3)), ce qui donne 12345.678. La longueur du résultat dépend du type (23 ou 14 caractères) : ne le placer dans une zone trop courte qu'après l'avoir mesuré.