From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,8d7393f07c06c5e9 X-Google-NewGroupId: yes X-Google-Attributes: gida07f3367d7,domainid0,public,usenet X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!news2.google.com!npeer02.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!post02.iad.highwinds-media.com!news.flashnewsgroups.com-b7.4zTQh5tI3A!not-for-mail From: Stephen Leake Newsgroups: comp.lang.ada Subject: Re: Another question about fixed point types. References: <4c7991c8$0$2375$4d3efbfe@news.sover.net> Date: Sun, 29 Aug 2010 10:02:41 -0400 Message-ID: <82mxs5ikji.fsf@stephe-leake.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (windows-nt) Cancel-Lock: sha1:XPlVazxZOSOJ1+u5OY9Isb+tvSk= MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Complaints-To: abuse@flashnewsgroups.com Organization: FlashNewsgroups.com X-Trace: d19634c7a689fe029e66113901 Xref: g2news1.google.com comp.lang.ada:13807 Date: 2010-08-29T10:02:41-04:00 List-Id: "Peter C. Chapin" 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