From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Fixed point constants issue
Date: Tue, 14 Sep 2010 09:47:03 +0200
Date: 2010-09-14T09:47:03+02:00 [thread overview]
Message-ID: <1ak1k4eh1p96t$.essf9fu1cx4z$.dlg@40tude.net> (raw)
In-Reply-To: op.vizozumhd20q5n@jellix.jlfencey.com
On Mon, 13 Sep 2010 23:08:08 +0200, Vinzent Hoefler wrote:
> 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.
Yes, because multiplication you have in mind is not the one effectively
implemented for fixed point types. Fixed-point operations are exact, but
inaccurate in terms of real numbers. You seem to expect them inexact, but
accurate.
>> 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.
If there were a way to disallow predefined multiplication, but there is no
one, AFAIK.
And you have this same problem with all other operations. Consider 0.4+0.4
is it 0 or 0.65536?
> 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.
No, fixed point multiplication was intentionally defined that way.
> 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.
Well, I don't disagree, but the part of the problem is a non-intended use.
It is difficult to say how the compiler could detect that.
In your use case, the only solution I see were literals made intervals
rather than universal numbers. That would statically detect that HEIGHT *
FEET_PER_METER has the width greater than Small and warn about implicit
conversion to Altitude possibly raising Precision_Loss_Error.
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
next prev parent reply other threads:[~2010-09-14 7:47 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
2010-09-14 6:54 ` J-P. Rosen
2010-09-14 18:28 ` Vinzent Hoefler
2010-09-14 7:47 ` Dmitry A. Kazakov [this message]
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