comp.lang.ada
 help / color / mirror / Atom feed
* Duration'Image, Duration'Value and Duration'Last
@ 2009-02-19 15:33 dhenry
  2009-02-19 15:44 ` Adam Beneschan
  0 siblings, 1 reply; 3+ messages in thread
From: dhenry @ 2009-02-19 15:33 UTC (permalink / raw)


Hello,

I'm experimenting something strange when manipulating Duration'Image,
Duration'Value and Duration'Last with GNAT :

The result of Duration'Value(Duration'Image(Duration'Last)) is
different from the result of S : String := Duration'Image
(Duration'Last) and then Duration'Value(S).

Here is a test program that shows the issue:

-----------------------------------------------------
with Ada.Text_IO; use Ada.Text_IO;

procedure Test is
   S : String   := Duration'Image (Duration'Last);
   D : Duration := Duration'Value (S);
begin
   Put_Line (Duration'Image (D));
   Put_Line (Duration'Image (Duration'Last));
end Test;
-----------------------------------------------------

This test program gives me:
-9223372036.854775810
 9223372036.854775810

Note that -9223372036.854775810 seems to be Duration'First...

Is it expected? Can someone tell me what happens here? why this
difference?

Yours,
David.



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Duration'Image, Duration'Value and Duration'Last
  2009-02-19 15:33 Duration'Image, Duration'Value and Duration'Last dhenry
@ 2009-02-19 15:44 ` Adam Beneschan
  2009-02-19 17:00   ` anon
  0 siblings, 1 reply; 3+ messages in thread
From: Adam Beneschan @ 2009-02-19 15:44 UTC (permalink / raw)


On Feb 19, 7:33 am, dhenry <tfc.d...@gmail.com> wrote:
> Hello,
>
> I'm experimenting something strange when manipulating Duration'Image,
> Duration'Value and Duration'Last with GNAT :
>
> The result of Duration'Value(Duration'Image(Duration'Last)) is
> different from the result of S : String := Duration'Image
> (Duration'Last) and then Duration'Value(S).
>
> Here is a test program that shows the issue:
>
> -----------------------------------------------------
> with Ada.Text_IO; use Ada.Text_IO;
>
> procedure Test is
>    S : String   := Duration'Image (Duration'Last);
>    D : Duration := Duration'Value (S);
> begin
>    Put_Line (Duration'Image (D));
>    Put_Line (Duration'Image (Duration'Last));
> end Test;
> -----------------------------------------------------
>
> This test program gives me:
> -9223372036.854775810
>  9223372036.854775810
>
> Note that -9223372036.854775810 seems to be Duration'First...
>
> Is it expected? Can someone tell me what happens here? why this
> difference?

This is pretty obviously a GNAT bug.  From experimentation, it appears
that the problem is in the Duration'Value; Duration'Value
("9223372036.854775810") yields a negative value.  Fixed-point types
are usually represented as integers with an implied binary point
somewhere in there.  The integer whose leftmost bit is 1 and all other
bits 0 is always tricky to deal with, because you can't negate it, so
special care must be taken.  If Duration'First is represented as
exactly this integer, it's understandable why this sort of error may
have come up.

                                 -- Adam





^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Duration'Image, Duration'Value and Duration'Last
  2009-02-19 15:44 ` Adam Beneschan
@ 2009-02-19 17:00   ` anon
  0 siblings, 0 replies; 3+ messages in thread
From: anon @ 2009-02-19 17:00 UTC (permalink / raw)


Its actually a compiler bug.  Even using a user created type that contains the 
Duration range, will cause the same type of error.

   type myDuration is delta 0.000000001
    range -((2 ** 63 - 1) * 0.000000001) ..
           +((2 ** 63 - 1) * 0.000000001);
   for myDuration'Small use 0.000000001;

But if you manual use the "System.Val_Real" package which is the work 
horse for Duration'Value attrubute it does work correctly. 

In <3d28adba-fdc7-43e1-b25e-e986276d7897@k36g2000pri.googlegroups.com>, Adam Beneschan <adam@irvine.com> writes:
>On Feb 19, 7:33 am, dhenry <tfc.d...@gmail.com> wrote:
>> Hello,
>>
>> I'm experimenting something strange when manipulating Duration'Image,
>> Duration'Value and Duration'Last with GNAT :
>>
>> The result of Duration'Value(Duration'Image(Duration'Last)) is
>> different from the result of S : String := Duration'Image
>> (Duration'Last) and then Duration'Value(S).
>>
>> Here is a test program that shows the issue:
>>
>> -----------------------------------------------------
>> with Ada.Text_IO; use Ada.Text_IO;
>>
>> procedure Test is
>>    S : String   := Duration'Image (Duration'Last);
>>    D : Duration := Duration'Value (S);
>> begin
>>    Put_Line (Duration'Image (D));
>>    Put_Line (Duration'Image (Duration'Last));
>> end Test;
>> -----------------------------------------------------
>>
>> This test program gives me:
>> -9223372036.854775810
>>  9223372036.854775810
>>
>> Note that -9223372036.854775810 seems to be Duration'First...
>>
>> Is it expected? Can someone tell me what happens here? why this
>> difference?
>
>This is pretty obviously a GNAT bug.  From experimentation, it appears
>that the problem is in the Duration'Value; Duration'Value
>("9223372036.854775810") yields a negative value.  Fixed-point types
>are usually represented as integers with an implied binary point
>somewhere in there.  The integer whose leftmost bit is 1 and all other
>bits 0 is always tricky to deal with, because you can't negate it, so
>special care must be taken.  If Duration'First is represented as
>exactly this integer, it's understandable why this sort of error may
>have come up.
>
>                                 -- Adam
>
>




^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2009-02-19 17:00 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-19 15:33 Duration'Image, Duration'Value and Duration'Last dhenry
2009-02-19 15:44 ` Adam Beneschan
2009-02-19 17:00   ` anon

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