Type modulo et opérateur d’exponentiation : petit piège

Auteur Message
Où nous allons découvrir comment une spécificité de l’opérateur d’exponentiation, “**”, peut réserver une mauvaise surprise lorsqu’un type modulo s’invite sournoisement dans l’expression. Les règles de l’algèbre ne semblent plus avoir cours, découvrons comment et pourquoi…

Soit l’application Ada suivante :

Source Ada : 

with Ada.Text_IO;
use Ada.Text_IO;

procedure Trap is

type Modular_Type is mod 256;
subtype Index_Type is Natural range 1 .. 3;

M : Modular_Type := 255;
I : Index_Type := 3;

begin
-- 10 ^ 3 = 1000.
-- What will prints the below statement?

if M < 10 ** I then
Put_Line ("`M` is less than `10 ** I`.");
else
Put_Line ("`M` is greater‑than or equal‑to `10 ** I`.");
end if;

end Trap;


Pouvez‑vous, et avant même de vous jetez sur votre compilateur et d’exécuter l’application, prédire son résultat ?

Jouez le jeux, devinez, puis compilez l’application avant de la tester.

La réponse dans le spoiler ci‑dessous (cliquez le pour l’afficher)

Spoiler : cliquez sur le cadre pour l'afficher


Reprenez le programme précédent, en remplaçant “10 ** I” par “256 ** I”. Que constatez‑vous ?

Spoiler : cliquez sur le cadre pour l'afficher


Reprenez le programme initial, en remplaçant “10 ** I” par “Natural'Pos (10 ** I)”. Que constatez‑vous ?

Spoiler : cliquez sur le cadre pour l'afficher