Aller au contenu

%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 un float(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é.