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=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!feeder.eternal-september.org!aioe.org!.POSTED.yTvCNOh9TRCAIcX40YItlQ.user.gioia.aioe.org!not-for-mail From: "Dmitry A. Kazakov" Newsgroups: comp.lang.ada Subject: Re: type definition for an integer with discrete range Date: Fri, 29 Mar 2019 22:57:52 +0100 Organization: Aioe.org NNTP Server Message-ID: References: <36c2ff61-8cca-4435-995f-dfc34fa44b69@googlegroups.com> <511923fb-dbb9-4e33-82a8-b4bbbf002a6d@googlegroups.com> NNTP-Posting-Host: yTvCNOh9TRCAIcX40YItlQ.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 X-Notice: Filtered by postfilter v. 0.9.2 Content-Language: en-US Xref: reader01.eternal-september.org comp.lang.ada:56007 Date: 2019-03-29T22:57:52+01:00 List-Id: On 2019-03-29 21:51, mario.blunk.gplus@gmail.com wrote: > The problem is that you can assign a variable of type Number 101.0 without getting a compile error. I wrote a test program at > https://github.com/Blunk-electronic/ada_training/blob/master/src/type_angle/type_angle.adb > where the issue can be tested by yourself. Thanks ! Values of a fixed types are intervals with real bounds. Each interval has a machine representation by an integer number. That means that for each fixed value there is a whole set (infinite) of real numbers equivalent to it. When you specify a range like type Number is delta Number_Small range -100.0 .. 100.0; that does not mean that upper bound of the last interval is 100.0. It only means that the last interval contains or is bounded by 100.0 (see ARM 3.5.9(13)). You could take any real value from the interval with the same effect. To illustrate the point try this program: ------------------------------------- with Ada.Text_IO; use Ada.Text_IO; procedure type_angle is Number_Small : constant := 5.0; type Number is delta Number_Small range -100.0 .. 100.0; angle : number; begin angle := -4.0; Put_Line (" -4.0 =" & Number'Image (angle)); angle := -3.0; Put_Line (" -3.0 =" & Number'Image (angle)); angle := -2.0; Put_Line (" -2.0 =" & Number'Image (angle)); angle := -1.0; Put_Line (" -1.0 =" & Number'Image (angle)); angle := 0.0; Put_Line (" 0.0 =" & Number'Image (angle)); angle := 1.0; Put_Line (" 1.0 =" & Number'Image (angle)); angle := 2.0; Put_Line (" 2.0 =" & Number'Image (angle)); angle := 3.0; Put_Line (" 3.0 =" & Number'Image (angle)); angle := 4.0; Put_Line (" 4.0 =" & Number'Image (angle)); angle := 100.0; Put_Line ("100.0 =" & Number'Image (angle)); angle := 101.0; Put_Line ("101.0 =" & Number'Image (angle)); angle := 102.0; Put_Line ("102.0 =" & Number'Image (angle)); angle := 103.0; Put_Line ("103.0 =" & Number'Image (angle)); angle := 103.9; Put_Line ("103.9 =" & Number'Image (angle)); end type_angle; ------------------------------------- On my machine it prints: -4.0 =-4.0 -3.0 = 0.0 -2.0 = 0.0 -1.0 = 0.0 0.0 = 0.0 1.0 = 0.0 2.0 = 0.0 3.0 = 0.0 4.0 = 4.0 100.0 = 100.0 101.0 = 100.0 102.0 = 100.0 103.0 = 100.0 103.9 = 100.0 I.e. the last value of the last interval is in fact 103.9999(9) > 100.0. It is upper bound is 104. I.e. the interval in my case is half-open: [100, 104[ Note also that ARM requires symmetric representation around 0 (ARM 3.5.9(12)) which makes it 2 x Small wide! It might look strange, but otherwise -(-X) /= X. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de