comp.lang.ada
 help / color / mirror / Atom feed
From: Stephen Leake <stephen_leake@stephe-leake.org>
Subject: Re: Another question about fixed point types.
Date: Sun, 29 Aug 2010 10:02:41 -0400
Date: 2010-08-29T10:02:41-04:00	[thread overview]
Message-ID: <82mxs5ikji.fsf@stephe-leake.org> (raw)
In-Reply-To: 4c7991c8$0$2375$4d3efbfe@news.sover.net

"Peter C. Chapin" <chapinp@acm.org> writes:

>    type Julian_Day is delta 0.001 range 2_415_385.5 .. 2_489_665.0;
>
> Now consider this function that is intended to return the (approximate)
> interval between two Julian days in seconds:
>
>    function Interval_Between
>       (Left : Julian_Day; Right : Julian_Day) return Duration is
>       Result : Duration;
>    begin
>       if Left > Right then
>          Result := 86_400.0 * (Left - Right);
>       else
>          Result := 86_400.0 * (Right - Left);
>       end if;
>       return Result;
>    end Interval_Between;
>
> The difference 'Left - Right' is definitely not in the range of
> Julian_Day. It is likely to be a small value and could even be zero. 

Or negative.

> I understand that the computation of 'Left - Right' will be done in
> Julian_Day's base type but I'm unclear what that means to me.

This is no different than using Integer_16 to evaluate 30_000 * 30_000;
if an intermediate value is outside the base type range, you get
Constraint_Error at runtime.

> It is my understanding that the compiler is allowed to choose a base
> type that can only deal with the small-ish range of values between the
> limits of Julian_Day. That range does not include zero. However, the
> code above compiles and runs fine using GNAT GPL 2010. My test program
> includes a case where Left and Right are the same so the difference is
> zero. Is this code reliable or am I just seeing the effect of GNAT's
> particular, implementation-specific choices?

It is harder to guess what the compiler will choose as the base type
for fixed_point than for integer, but it's still just a guess; the base
type for Integer_16 could be 32 bits.

If you want to ensure that intermediate values are safe, you need to
widen the range of the type declaration, so the compiler is forced to
choose a safe base type. You could then use a subtype to provide a
restricted range:

    type Safe_Julian_Day is delta 0.001 range -2_489_665.0 .. 2_489_665.0;
    subtype Julian_Day is Safe_Julian_Day range 2_415_385.5 .. 2_489_665.0;

-- 
-- Stephe



      parent reply	other threads:[~2010-08-29 14:02 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-28 22:45 Another question about fixed point types Peter C. Chapin
2010-08-29  6:32 ` Yannick Duchêne (Hibou57)
2010-08-29 11:23   ` Peter C. Chapin
2010-08-29  9:02 ` Phil Thornley
2010-08-29 11:29   ` Peter C. Chapin
2010-08-29 12:31     ` Phil Thornley
2010-08-29 13:49       ` Jeffrey Carter
2010-08-29 14:20       ` Peter C. Chapin
2010-08-29 17:50         ` Phil Thornley
2010-08-29 22:03           ` Peter C. Chapin
2010-08-30  8:50           ` Mark Lorenzen
2010-08-29 10:24 ` Simon Wright
2010-08-29 14:02 ` Stephen Leake [this message]
replies disabled

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