comp.lang.ada
 help / color / mirror / Atom feed
From: "Vinzent Hoefler" <nntp-2010-09@t-domaingrabbing.de>
Subject: Re: Fixed point constants issue
Date: Mon, 13 Sep 2010 23:08:08 +0200
Date: 2010-09-13T23:08:08+02:00	[thread overview]
Message-ID: <op.vizozumhd20q5n@jellix.jlfencey.com> (raw)
In-Reply-To: fq489oqf49fo$.2yo8f4fno57$.dlg@40tude.net

On Mon, 13 Sep 2010 22:32:05 +0200, Dmitry A. Kazakov  
<mailbox@dmitry-kazakov.de> wrote:

> On Mon, 13 Sep 2010 20:25:43 +0200, Vinzent Hoefler wrote:
>
>> Yes, of course. Still, it's not quite intuitive why
>>
>>   TEN_FEET_1 : constant          := HEIGHT * FEET_PER_METER;
>>   TEN_FEET_2 : constant Altitude := HEIGHT * FEET_PER_METER;
>>
>> just because a type is given in the second case.
>
> Different types, different behavior.

Well well. So this subtle difference between using a named number and a
typed constant (where the actual type *may* be a fixed point type) has
lead to quite not so subtle constraint errors.

>> I would expect the compiler to evaluate the expression "HEIGHT *
>> FEET_PER_METER" _before_ converting it to the appropriate fixed point  
>> type.
>
> Why? "*" is defined on Altitude. You should rather wonder why the result  
> is different for TEN_FEET_4.

I did wonder. :) I did a lot of different things trying to understand the
issue to my satisfaction. We now know how to get around it, but knowing a
workaround and actually understanding it are two different things.

> Multiplication is inexact taking rounding this or that way you get
> different results.

Yes, honestly I just wasn't really expecting that the compiler would
actually choose the multiplication operator of the fixed point type in
something that looks like a static expression.

>> And, obviously it does this that when evaluating
>>
>>    TEN_FEET_4 : constant Altitude := Altitude (HEIGHT * FEET_PER_METER);
>
> Well, it does not, because here another type is involved.

Yes. So, the expression HEIGHT * FEET_PER_METER in the one case is
evaluated by using the result type's multiplication operator and if the
conversion is present, it is not, giving the more precise result.

That's still a bit crazy, IMHO.

> But what about:
>
>    X : constant Altitude := 0.3048; -- The result is 0
>
> Does it wonder you?

No. That behavior is crystal-clear and expected.

It's having to add all those conversions just to make sure the values come
out as expected that's disturbing me a bit. It is something I wouldn't
expect from Ada.

As you can probably imagine, there are a lot more packages with appropriate
constants involved than in this shortened test case. And a lot of those
constants are used for fixed point values with totally different ranges
and deltas. So the actual problems do not show immediately.


Vinzent.

-- 
There is no signature.



  reply	other threads:[~2010-09-13 21:08 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-13 17:27 Fixed point constants issue Vinzent Hoefler
2010-09-13 18:04 ` Dmitry A. Kazakov
2010-09-13 18:25   ` Vinzent Hoefler
2010-09-13 19:05     ` Niklas Holsti
2010-09-13 20:35       ` Vinzent Hoefler
2010-09-13 20:35       ` Jeffrey Carter
2010-09-13 21:06         ` Vinzent Hoefler
2010-09-14  5:39         ` Niklas Holsti
2010-09-24 14:43         ` Markus Schöpflin
2010-09-24 20:05           ` Vinzent Hoefler
2010-09-24 21:38           ` Jeffrey Carter
2010-09-24 22:42             ` Vinzent Hoefler
2010-09-25  0:16               ` Jeffrey Carter
2010-09-27 10:33                 ` Markus Schöpflin
2010-09-27 18:57                   ` Jeffrey Carter
2010-09-28  8:16                     ` Markus Schöpflin
2010-09-28 17:28                       ` Jeffrey Carter
2010-10-05  6:27                         ` Randy Brukardt
2010-10-05 18:40                           ` Jeffrey Carter
2010-09-27 17:58             ` Adam Beneschan
2010-09-13 20:32     ` Dmitry A. Kazakov
2010-09-13 21:08       ` Vinzent Hoefler [this message]
2010-09-14  6:54         ` J-P. Rosen
2010-09-14 18:28           ` Vinzent Hoefler
2010-09-14  7:47         ` Dmitry A. Kazakov
2010-09-14 17:42           ` Vinzent Hoefler
2010-09-15  8:35             ` Dmitry A. Kazakov
2010-09-15 17:24               ` Vinzent Hoefler
2010-09-15 20:11                 ` Dmitry A. Kazakov
2010-09-14 19:44   ` Keith Thompson
replies disabled

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