The last two are the main points of the example.
-- demonstrate rounding errors with TEXT_IO; procedure roundoff is package float_io is new TEXT_IO.FLOAT_IO( FLOAT ); TEXT_IO, float_io; zero : constant := 0.0; one : constant float := 1.0; ten_thousand : constant := 10000; one_ten_thousandth : constant FLOAT := one / FLOAT(ten_thousand); the_result : FLOAT := zero; begin -- roundoff -- the_result is initially equal to zero for counter in INTEGER range 1 .. ten_thousand loop the_result := the_result + one_ten_thousandth; end loop; -- mathematically, the_result is now equal to -- 1/10_000 * 10_000 = 1.0 if (the_result = one) then PUT_LINE("Isn't this what you expected!"); else PUT_LINE("Isn't this a surprise!"); PUT("One is "); PUT(one, EXP => 0); NEW_LINE; PUT("The result is "); PUT(the_result, EXP=>0); NEW_LINE; end if; end roundoff;
Isn't this a surprise! One is 1.00000000000000 The result is 0.99999999999991