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-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,c83229a21d53b2b3,start X-Google-Attributes: gid103376,public From: Al Christians Subject: Long Float Error from Gnat Date: 1998/10/29 Message-ID: <3638F49C.E90A401E@easystreet.com> X-Deja-AN: 406473978 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii X-Trace: news14.ispnews.com 909701700 206.103.56.244 (Thu, 29 Oct 1998 17:55:00 EDT) Organization: Trillium Resources Corporation MIME-Version: 1.0 NNTP-Posting-Date: Thu, 29 Oct 1998 17:55:00 EDT Newsgroups: comp.lang.ada Date: 1998-10-29T00:00:00+00:00 List-Id: I've hit an odd numerical error in a program that I've compiled with GNAT 3.10p1 on NT 4 sp3. I almost can't believe it, so I wonder if anyone else can tell me what's going on. My number one suspect is that it's a floating point problem in my Pentium Pro. Here's the code: ------------------------------------------------------------------- with Ada.Text_Io; with Ada.Long_Float_Text_Io; with Ada.Integer_Text_IO; procedure Num_Test is procedure Read_Num( S: String ) is Num: Long_Float; Last_Char_Pos: Positive; begin Ada.Long_Float_Text_Io.Get( S, Num, Last_Char_Pos ); Ada.Text_Io.Put( "Success: " & S & " = " ); Ada.Long_Float_Text_Io.Put( Num ); Ada.Text_Io.Put( " Last Char Pos: " & " = " ); Ada.Integer_Text_Io.Put( Last_Char_Pos ); Ada.Text_Io.New_Line; exception when others => Ada.Text_Io.Put( "Error: " & S ); Ada.Text_Io.New_Line; end; begin Read_Num( "1.0" ); Read_Num( "1.23456789" ); Read_Num( "1.2345678901234" ); Read_Num( "1.234567890E+1" ); Read_Num( "-1.234567890E+1" ); Read_Num( "1.234567890E+39" ); Read_Num( "-1.234567890E-39" ); Read_Num( "-1.000000000E-32" ); Read_Num( "1.000000000E-32" ); Read_Num( "-5.000000000E-32" ); Read_Num( "5.000000000E-32" ); Read_Num( "-5.0000000000E-32" ); Read_Num( "5.0000000000E-32" ); Read_Num( "-5.00000000E-32" ); Read_Num( "5.00000000E-32" ); Read_Num( "-50.00000000E-33" ); Read_Num( "50.00000000E-33" ); Read_Num( "-1.200000000E-32" ); Read_Num( "1.200000000E-32" ); Read_Num( "-1.270000000E-32" ); Read_Num( "1.270000000E-32" ); Read_Num( "-1.271110000E-32" ); Read_Num( "1.271110000E-32" ); Read_Num( "-1.271113762E-32" ); Read_Num( "1.271113762E-32" ); Read_Num( "1.271113763E-32" ); Read_Num( "-1.271113763E-32" ); Read_Num( "-1.271113764E-32" ); Read_Num( "1.271113764E-32" ); Read_Num( "1.271113763E-33" ); Read_Num( "-1.271113763E-33" ); Read_Num( "1.2711137638E-33" ); Read_Num( "-1.2711137638E-33" ); Read_Num( "1.271113763E-30" ); Read_Num( "-1.271113763E-30" ); Read_Num( "1.2E-32" ); Read_Num( "-1.2E-32" ); end Num_Test; -------------------------------End of Code ------------------------- Here's the output -------------------------------------------------------------------- Success: 1.0 = 1.00000000000000E+00 Last Char Pos: = 3 Success: 1.23456789 = 1.23456789000000E+00 Last Char Pos: = 10 Success: 1.2345678901234 = 1.23456789012340E+00 Last Char Pos: = 15 Success: 1.234567890E+1 = 1.23456789000000E+01 Last Char Pos: = 14 Success: -1.234567890E+1 = -1.23456789000000E+01 Last Char Pos: = 15 Success: 1.234567890E+39 = 1.23456789000000E+39 Last Char Pos: = 15 Success: -1.234567890E-39 = -1.23456789000000E-39 Last Char Pos: = 16 Success: -1.000000000E-32 = NaN****************** Last Char Pos: = 16 Success: 1.000000000E-32 = NaN****************** Last Char Pos: = 15 Success: -5.000000000E-32 = NaN****************** Last Char Pos: = 16 Success: 5.000000000E-32 = NaN****************** Last Char Pos: = 15 Success: -5.0000000000E-32 = -5.00000000000000E-32 Last Char Pos: = 17 Success: 5.0000000000E-32 = 5.00000000000000E-32 Last Char Pos: = 16 Success: -5.00000000E-32 = -5.00000000000000E-32 Last Char Pos: = 15 Success: 5.00000000E-32 = 5.00000000000000E-32 Last Char Pos: = 14 Success: -50.00000000E-33 = NaN****************** Last Char Pos: = 16 Success: 50.00000000E-33 = NaN****************** Last Char Pos: = 15 Success: -1.200000000E-32 = NaN****************** Last Char Pos: = 16 Success: 1.200000000E-32 = NaN****************** Last Char Pos: = 15 Success: -1.270000000E-32 = NaN****************** Last Char Pos: = 16 Success: 1.270000000E-32 = NaN****************** Last Char Pos: = 15 Success: -1.271110000E-32 = NaN****************** Last Char Pos: = 16 Success: 1.271110000E-32 = NaN****************** Last Char Pos: = 15 Success: -1.271113762E-32 = NaN****************** Last Char Pos: = 16 Success: 1.271113762E-32 = NaN****************** Last Char Pos: = 15 Success: 1.271113763E-32 = NaN****************** Last Char Pos: = 15 Success: -1.271113763E-32 = NaN****************** Last Char Pos: = 16 Success: -1.271113764E-32 = NaN****************** Last Char Pos: = 16 Success: 1.271113764E-32 = NaN****************** Last Char Pos: = 15 Success: 1.271113763E-33 = 1.27111376300000E-33 Last Char Pos: = 15 Success: -1.271113763E-33 = -1.27111376300000E-33 Last Char Pos: = 16 Success: 1.2711137638E-33 = 1.27111376380000E-33 Last Char Pos: = 16 Success: -1.2711137638E-33 = -1.27111376380000E-33 Last Char Pos: = 17 Success: 1.271113763E-30 = 1.27111376300000E-30 Last Char Pos: = 15 Success: -1.271113763E-30 = -1.27111376300000E-30 Last Char Pos: = 16 Success: 1.2E-32 = 1.20000000000000E-32 Last Char Pos: = 7 Success: -1.2E-32 = -1.20000000000000E-32 Last Char Pos: = 8 ------------------------------End of Output --------------------------- Question relates to the surprising incidence of NaN's in the output. These all look like properly formatted strings. It looks as if any number with exponent E-32 and exactly 10 digits -> NaN. How could this be? TIA for any help. Al