* How to use "infinite" ? @ 2006-01-05 10:42 Reinert Korsnes 2006-01-05 12:16 ` Dmitry A. Kazakov 0 siblings, 1 reply; 5+ messages in thread From: Reinert Korsnes @ 2006-01-05 10:42 UTC (permalink / raw) Hi, is it a natural way to use "infinite" in Ada95 ? What I mean is that I would like a "number" X (= "infinite") such that: (i + X = X) = true for any normal (say) Integer i. reinert ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to use "infinite" ? 2006-01-05 10:42 How to use "infinite" ? Reinert Korsnes @ 2006-01-05 12:16 ` Dmitry A. Kazakov 2006-01-05 23:33 ` Gautier Write-only 0 siblings, 1 reply; 5+ messages in thread From: Dmitry A. Kazakov @ 2006-01-05 12:16 UTC (permalink / raw) On Thu, 05 Jan 2006 11:42:22 +0100, Reinert Korsnes wrote: > is it a natural way to use "infinite" in Ada95 ? Which way, you didn't specify any! > What I mean is that I would like a "number" X (= "infinite") > such that: > > (i + X = X) = true > > for any normal (say) Integer i. You should define an abstract data type to represent the set of integer numbers + ideals you want (such as "negative infinity", "positive infinity") . For example a universal package could be generic: generic type Finite_Integer is range <>; package Integers_With_Infinity_Ideals is type Infinite_Integer is private; -- -- Unary operations -- function "+" (Left : Infinite_Integer) return Infinite_Integer; function "-" (Left : Infinite_Integer) return Infinite_Integer; -- -- Dyadic operations -- function "+" (Left : Finite_Integer; Right : Infinite_Integer) return Infinite_Integer; function "+" (Left : Infinite_Integer; Right : Finite_Integer return Infinite_Integer; function "+" (Left, Right : Infinite_Integer) return Infinite_Integer; . . . -- -- Relational operations -- function "=" (Left : Finite_Integer; Right : Infinite_Integer) return Boolean; function "=" (Left : Infinite_Integer; Right : Finite_Integer return Boolean; function "=" (Left, Right : Infinite_Integer) return Boolean; . . . private -- -- Some appropriate implementation -- . . . end Integers_With_Infinity_Ideals; BTW, for relational operations you could use tri-state logic: (infinity = infinity) = uncertain instead of Boolean logic. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to use "infinite" ? 2006-01-05 12:16 ` Dmitry A. Kazakov @ 2006-01-05 23:33 ` Gautier Write-only 2006-01-06 10:25 ` Reinert Korsnes 0 siblings, 1 reply; 5+ messages in thread From: Gautier Write-only @ 2006-01-05 23:33 UTC (permalink / raw) Dmitry A. Kazakov: > You should define an abstract data type to represent the set of integer > numbers + ideals you want (such as "negative infinity", "positive > infinity") . For example a universal package could be generic: > > generic > type Finite_Integer is range <>; > package Integers_With_Infinity_Ideals is > type Infinite_Integer is private; > -- > -- Unary operations > -- > function "+" (Left : Infinite_Integer) return Infinite_Integer; > function "-" (Left : Infinite_Integer) return Infinite_Integer; > -- > -- Dyadic operations > -- > function "+" (Left : Finite_Integer; Right : Infinite_Integer) > return Infinite_Integer; [...] Great idea, you just drafted a (or the first ?) computer package for nonstandard analysis! I strongly suggest to use the (hem...) standard wording of nonstandard analysis for the types (unlimited, infinitesimal, etc.). ______________________________________________________________ Gautier -- http://www.mysunrise.ch/users/gdm/index.htm Ada programming -- http://www.mysunrise.ch/users/gdm/gsoft.htm NB: For a direct answer, e-mail address on the Web site! ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to use "infinite" ? 2006-01-05 23:33 ` Gautier Write-only @ 2006-01-06 10:25 ` Reinert Korsnes 2006-01-06 14:38 ` Dmitry A. Kazakov 0 siblings, 1 reply; 5+ messages in thread From: Reinert Korsnes @ 2006-01-06 10:25 UTC (permalink / raw) Gautier Write-only wrote: > Dmitry A. Kazakov: > >> You should define an abstract data type to represent the set of integer >> numbers + ideals you want (such as "negative infinity", "positive >> infinity") . For example a universal package could be generic: >> >> generic >> type Finite_Integer is range <>; >> package Integers_With_Infinity_Ideals is >> type Infinite_Integer is private; >> -- >> -- Unary operations >> -- >> function "+" (Left : Infinite_Integer) return Infinite_Integer; >> function "-" (Left : Infinite_Integer) return Infinite_Integer; >> -- >> -- Dyadic operations >> -- >> function "+" (Left : Finite_Integer; Right : Infinite_Integer) >> return Infinite_Integer; > [...] > > Great idea, you just drafted a (or the first ?) computer package for > nonstandard analysis! > > I strongly suggest to use the (hem...) standard wording of nonstandard > analysis for the types (unlimited, infinitesimal, etc.). :-) well, for my limited "hack-programming" I would like to replace the following with something simpler: if a /= Integer'Last and b /= Integer'Last then if a > a + b then a := a + b; end if; end if; I tried to represent "infinite" with Integer'Last - directly from the mathematical specification/problem formulation given. Maybe it is not a good idea. Note, by the way, that the construct above may be rather ugly if a and b are complex expressions.... reinert > ______________________________________________________________ > Gautier -- http://www.mysunrise.ch/users/gdm/index.htm > Ada programming -- http://www.mysunrise.ch/users/gdm/gsoft.htm > > NB: For a direct answer, e-mail address on the Web site! ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to use "infinite" ? 2006-01-06 10:25 ` Reinert Korsnes @ 2006-01-06 14:38 ` Dmitry A. Kazakov 0 siblings, 0 replies; 5+ messages in thread From: Dmitry A. Kazakov @ 2006-01-06 14:38 UTC (permalink / raw) On Fri, 06 Jan 2006 11:25:02 +0100, Reinert Korsnes wrote: > Gautier Write-only wrote: > >> Dmitry A. Kazakov: >> >>> You should define an abstract data type to represent the set of integer >>> numbers + ideals you want (such as "negative infinity", "positive >>> infinity") . For example a universal package could be generic: >>> >>> generic >>> type Finite_Integer is range <>; >>> package Integers_With_Infinity_Ideals is >>> type Infinite_Integer is private; >>> -- >>> -- Unary operations >>> -- >>> function "+" (Left : Infinite_Integer) return Infinite_Integer; >>> function "-" (Left : Infinite_Integer) return Infinite_Integer; >>> -- >>> -- Dyadic operations >>> -- >>> function "+" (Left : Finite_Integer; Right : Infinite_Integer) >>> return Infinite_Integer; >> [...] >> >> Great idea, you just drafted a (or the first ?) computer package for >> nonstandard analysis! >> >> I strongly suggest to use the (hem...) standard wording of nonstandard >> analysis for the types (unlimited, infinitesimal, etc.). > > :-) > > well, for my limited "hack-programming" I would > like to replace the following with something simpler: > > if a /= Integer'Last and b /= Integer'Last then > if a > a + b then > a := a + b; > end if; > end if; > > I tried to represent "infinite" with Integer'Last - > directly from the mathematical specification/problem formulation > given. Maybe it is not a good idea. > > Note, by the way, that the construct above > may be rather ugly if a and b are complex expressions.... You have to decide what you want. Code simplicity is achieved by abstraction. ADT hides nasty implementation details. As for memory vs. performance trade-off, well, if you want a dense representation, then you have to pay for that. Further you have to decide how often infinity could appear. If it is a rare beast, then you could indeed use integer arithmetic, catch Constraint_Error on overflows to perform analysis on infinity. If you have a suspicion that exception handling could take too much time, you could use modular numbers instead. Something like: Positive_Infinity : constant Infinite_Integer; Negative_Infinity : constant Infinite_Integer; Undefined : constant Infinite_Integer; -- If you want to sum infinities of different signs, you will need -- this ideal as well private Bits : constant := 32; type Ring is mod 2**Bits; -- Reserve two upper numbers for ideals PI : constant Ring := 2**(Bits - 1) - 1; UI : constant Ring := 2**(Bits - 1); NI : constant Ring := 2**(Bits - 1) + 1; type Infinite_Integer is new Ring; Positive_Infinity : constant Infinite_Integer := Infinite_Integer (PI); Undefined : constant Infinite_Integer := Infinite_Integer (UI); Negative_Infinity : constant Infinite_Integer := Infinite_Integer (NI); -- -- + Implementation, looks lengthy, but it is one + and 3 comparisons -- function "+" (Left, Right : Infinite_Integer) return Infinite_Integer is L : constant Ring := Ring (Left); R : constant Ring := Ring (Right); Result : constant Ring := L + R; begin if L < PI then if R < PI then -- Left and Right are positive if Result < PI then return Infinite_Integer (Result); else return Positive_Infinity; -- Positive overflow end if; elsif R > NI then -- Left is positive, Right is negative return Infinite_Integer (Result); -- Can't overflow else return Right; -- Infinity swallows Left end if; elsif L > NI then if R < PI then -- Left and Right are negative return Infinite_Integer (Result); elsif R > NI then -- Left is negative, Right is positive if Result > NI then return Infinite_Integer (Result); else return Negative_Infinity; -- Negative overflow end if; else return Right; -- Infinity swallows Left end if; else if R < PI or else R > NI then return Left; -- Infinity swallows Right else if L = PI then if R = PI then return Positive_Infinity; end if; elsif L = NI then if R = NI then return Negative_Infinity; end if; end if; return Undefined; -- Cannot figure out the result, maybe Constraint_Error -- exception were more appropriate here end if; end if; end "+"; -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2006-01-06 14:38 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2006-01-05 10:42 How to use "infinite" ? Reinert Korsnes 2006-01-05 12:16 ` Dmitry A. Kazakov 2006-01-05 23:33 ` Gautier Write-only 2006-01-06 10:25 ` Reinert Korsnes 2006-01-06 14:38 ` Dmitry A. Kazakov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox