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=-0.3 required=5.0 tests=BAYES_00, REPLYTO_WITHOUT_TO_CC autolearn=no autolearn_force=no version=3.4.4 Path: border2.nntp.dca1.giganews.com!nntp.giganews.com!news.glorb.com!aioe.org!.POSTED!not-for-mail From: "Nasser M. Abbasi" Newsgroups: comp.lang.ada Subject: Re: getting same output as gfortran, long_float Date: Thu, 30 Apr 2015 20:40:05 -0500 Organization: Aioe.org NNTP Server Message-ID: References: Reply-To: nma@12000.org NNTP-Posting-Host: CV72NQ0GT7rQd8cP1ZYi/A.user.speranza.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 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 X-Notice: Filtered by postfilter v. 0.8.2 Xref: number.nntp.giganews.com comp.lang.ada:192982 Date: 2015-04-30T20:40:05-05:00 List-Id: On 4/30/2015 8:16 PM, Jeffrey R. Carter wrote: > You could always do > > with Ada.Text_IO; > with PragmARC.Rational_Numbers; > with PragmARC.Unbounded_Integers; > > procedure Foo_Rational is > use PragmARC; > > use type Rational_Numbers.Rational; > use type Unbounded_Integers.Unbounded_Integer; > > One_I : constant Unbounded_Integers.Unbounded_Integer := +1; > Twelve : constant Rational_Numbers.Rational := Unbounded_Integers."+" (12) / > One_I; > P0001 : constant Rational_Numbers.Rational := One_I / (+10_000); -- 0.0001 > P1 : constant Rational_Numbers.Rational := One_I / (+10); -- 0.1 > > One : Rational_Numbers.Rational renames Rational_Numbers.One; > > Result : constant Rational_Numbers.Rational := Twelve * P0001 / (One * (One - > P1) ** 4); > begin -- Foo_Rational > Ada.Text_IO.Put_Line (Item => Rational_Numbers.Image (Result) ); > end Foo_Rational; > > $ gnatmake -gnatano -gnatwa -O2 -fstack-check -I../RAC foo_rational.adb > gcc-4.6 -c -gnatano -gnatwa -O2 -fstack-check -I../RAC foo_rational.adb > gnatbind -I../RAC -x foo_rational.ali > gnatlink foo_rational.ali -O2 -fstack-check > jrcarter@jcarter-singo-laptop:~/Code$ ./foo_rational > 0.0018289894833104709647919524462734339277549154092363968907178783 >72199359853680841335162322816643804298125285779606767261088248742569 >7302240512117055326931870141746684956561499771376314586191129401005 >94421582075903063557384545038866026520347508001828989483310470964791 >95244627343392775491540923639689071787837219935985368084133516232281 >664380429812528577960676726108824874256973022405121170553269318701 > The referenced PragmARC pkgs are available in the beta version of the PragmAda > Reusable Components available from > > https://pragmada.x10hosting.com/pragmarc.htm > Thanks, this is very useful. I noticed small difference in output: side-by-side: Ada: 0.00182898948331047096479195244627343392775491540.. Mathematica*: 0.00182898948331047096479195244627343392775491540.. gfortran: 0.00182898948331047112025871115292829927 at digit 18, gfortran result is different. But your Ada rational package gives same result as Mathematica. This tells me your result is the accurate one ! Mathematica code: 12*1/(10000)/(1*(1 - 1/10)^4) -- do it all in symbolic first ---> 4/2187 N[%, 100] ; -- ask for 100 digits numerical humm....I do not know why these are different. I would have expected gfortran to be accurate for at least 34 digits, not just 18. May be I am doing something wrong in gfortran. Here is the gfortran again for reference: ------------------- PROGRAM foo IMPLICIT NONE REAL(KIND = 16) :: x !-- kind=16 tells it is double quad x = 12.0D0 * 0.0001D0/(1.0D0 * (1.0D0 - 0.1D0)**4 ) PRINT *, x END PROGRAM ------------------ gfortran -Wall foo2.f90