[Top][All Lists]
[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