gcl-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gcl-devel] GCL 2.6.7 parses 12.3456d0 and 123.456d-1 as different numbe


From: Camm Maguire
Subject: [Gcl-devel] GCL 2.6.7 parses 12.3456d0 and 123.456d-1 as different numbers
Date: Tue, 03 Jul 2007 11:33:11 -0400
User-agent: SEMI/1.14.3 (Ushinoya) FLIM/1.14.3 (Unebigory ōmae) APEL/10.3 Emacs/21.2 (i386-debian-linux-gnu) MULE/5.0 (SAKAKI)

Greetings!  OK this is fixed on branch 2.6.8pre.  Please note the
comment below -- I still don't see how to re-parse denormalized
numbers accurately -- if you do, any comments would be most helpful. 

Take care,

=============================================================================
Hello,


I claim 12.3456, 12.3456d0, 123.456d-1, 1234.56d-2, and 12345.6d-3
all designate the same IEEE 754 double precision float.


GCL 2.6.7 ANSI (Linux) disagrees:


(mapcar #'integer-decode-float '(12.3456 12.3456d0 123.456d-1

1234.56d-2 12345.6d-3))


(6949954944958149 6949954944958149 6949954944958150 6949954944958149
6949954944958150)


I didn't check any other floating point inputs (neither S nor E nor L,
nor any other specific combinations of digits).


I tried to report this via http://savannah.gnu.org/bugs/?group=gcl
but the "Bugs" javascript menu is rendered incorrectly in my browser
(Mozilla 1.4.1) such that I can't click "Submit" on the menu. FWIW.


regards
Robert Dodier
=============================================================================


Index: o/read.d
===================================================================
RCS file: /cvsroot/gcl/gcl/o/read.d,v
retrieving revision 1.14.4.1.2.2.2.4.6.1.6.1.4.4
diff -u -r1.14.4.1.2.2.2.4.6.1.6.1.4.4 read.d
--- o/read.d    25 Aug 2006 16:32:53 -0000      1.14.4.1.2.2.2.4.6.1.6.1.4.4
+++ o/read.d    3 Jul 2007 15:29:55 -0000
@@ -694,6 +694,25 @@
         (i) == 'b' || (i) == 'B')
 
 double pow();
+
+static double
+new_fraction(char *s,int end,int exp_pos) {
+
+  char ch,ch1;
+  double fraction;
+
+  ch=s[end];
+  s[end]=0;
+  if (exp_pos>=0) {ch1=s[exp_pos];s[exp_pos]='E';}
+  sscanf(s,"%lf",&fraction);
+  s[end]=ch;
+  if (exp_pos>=0) s[exp_pos]=ch1;
+
+  return fraction;
+
+}
+
+
 /*
        Parse_number(s, end, ep, radix) parses C string s
        up to (but not including) s[end]
@@ -712,7 +731,7 @@
   object integer_part;
   double fraction, fraction_unit, f;
   char exponent_marker;
-  int exponent;
+  int exponent,exp_pos=-1;
   int i, j, k;
   int d;
   vs_mark;
@@ -858,6 +877,7 @@
   if (radix!=10)
     FEerror("Parse_number radix error", 0);
   exponent_marker = s[i];
+  exp_pos=i;
   i++;
   if (i >= end)
     goto NO_NUMBER;
@@ -899,11 +919,11 @@
     goto MAKE_FLOAT;
     
   case 's':  case 'S':
-    x = make_shortfloat((shortfloat)fraction);
+    x = make_shortfloat((shortfloat)new_fraction(s,end,exp_pos));/*FIXME code 
above cannot re-read denormalized numbers accurately*/
     break;
     
   case 'f':  case 'F':  case 'd':  case 'D':  case 'l':  case 'L':
-    x = make_longfloat((longfloat)fraction);
+    x = make_longfloat((longfloat)new_fraction(s,end,exp_pos));
     break;
     
   case 'b':  case 'B':
=============================================================================

-- 
Camm Maguire                                            address@hidden
==========================================================================
"The earth is but one country, and mankind its citizens."  --  Baha'u'llah




reply via email to

[Prev in Thread] Current Thread [Next in Thread]