comp.lang.ada
 help / color / mirror / Atom feed
* Should be getting a constraint error in this code
@ 2004-07-24  2:32 Keith Boruff
  2004-07-24  3:33 ` Robert I. Eachus
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Keith Boruff @ 2004-07-24  2:32 UTC (permalink / raw)


Hey all,

Forgive me for posting such a trivial problem here but I couldn't seem 
to find an answer in any of the FAQs I know of nor DejaNews.

Though I'm not a novice programmer, I am a novice Ada programmer.

In my studies this evening, I wrote the following trivial program to 
force a constraint error:

with Ada.Text_Io; use Ada.Text_Io;

procedure Constraint_Tests is

   type Exam_Mark is range 0 .. 100;

   English   : Exam_Mark := 72;
   Math      : Exam_Mark := 68;
   Computing : Exam_Mark := 76;
   Average   : Exam_Mark;

begin

  Put("Average exam mark is ");

  -- I expect a constraint exception in this statement
  -- because English + Math + Computing > 100
  -- NOTE: On my machine, Exam_Mark'Base'Last = 127
  Average := (English + Math + Computing) / 3;
  Put_line(Exam_Mark'Image(Average));

end Constraint_Tests;


Ok, the problem I'm having is that I'm expecting a constraint exception 
to occur because (English + Math + Computing) = 216 and the largest 
value of its base is 127 (on my machine).

However, I'm not getting this at all. I get no constraint errors 
whatsoever and what's worse, Average = 243. First of all, why didn't I 
get a constraint error here (since Average is of type Exam_Mark)? 
Secondly, where in the heck did 243 come from?

Now, if I omit the statement in the code and instead write:
Average := English + Math + Computing;

I get a constraint error as expected. When I use the '/' operator 
though, all bets are off.

Is there something I'm not seeing here? Is there something about the / 
operator I should know about?

Or... could this possibly be a bug in the compiler itself (using GNAT)?

I'm embarrassed to be posting such a trivial program but it really 
bothers me that the behavior is not what I expect.

If anyone has any suggestions, I'd appreciate some info on the matter... 
even if it's to tell me to RTFM (... as long as you provide a link).

Thanks,
Keith Boruff













^ permalink raw reply	[flat|nested] 7+ messages in thread
* Re: Should be getting a constraint error in this code
@ 2004-07-26  6:42 Christoph Karl Walter Grein
  0 siblings, 0 replies; 7+ messages in thread
From: Christoph Karl Walter Grein @ 2004-07-26  6:42 UTC (permalink / raw)
  To: comp.lang.ada

Additionally to everything you've been told before consider RM 4.5(10). This paragraph allows a compiler to return the mathematically correct result for intermediate values even if it is out of range; only the final result must of course be in range.

Thus the sum 216 may be held in a register (which can have a larger base range).

I get the correct result 72 for your program unchanged compiled with and without -gnato; and also with and without pragma Unsuppress.
________________________________________________________________
Verschicken Sie romantische, coole und witzige Bilder per SMS!
Jetzt neu bei WEB.DE FreeMail: http://freemail.web.de/?mc=021193




^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2004-07-26  6:42 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-07-24  2:32 Should be getting a constraint error in this code Keith Boruff
2004-07-24  3:33 ` Robert I. Eachus
2004-07-24  3:35 ` John B. Matthews
2004-07-24 15:08 ` Björn Persson
2004-07-25 13:54   ` Martin Krischik
2004-07-25 15:14     ` Nick Roberts
  -- strict thread matches above, loose matches on Subject: below --
2004-07-26  6:42 Christoph Karl Walter Grein

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox