[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: macro FIXNUM_OVERFLOW_P in lisp.h is valid ?
From: |
Toru TSUNEYOSHI |
Subject: |
Re: macro FIXNUM_OVERFLOW_P in lisp.h is valid ? |
Date: |
Sat, 24 Oct 2009 15:07:44 +0900 |
> So in 64-bit platforms, casting `double' to `int' causes lack of
> precision already (because a double does not have 64 bits in the
> mantissa), doesn't it?
So I make a patch for keep the precision.
It tries to deal with the number in type `int' possibly, otherwise it
deals with the number in type `double'.
Would you like to check it ?
--- data.c.original 2009-06-21 13:38:14.000000000 +0900
+++ data.c 2009-10-24 14:31:43.356164300 +0900
@@ -22,6 +22,7 @@
#include <config.h>
#include <signal.h>
#include <stdio.h>
+#include <limits.h>
#include "lisp.h"
#include "puresize.h"
#include "character.h"
@@ -2392,17 +2393,42 @@
val = make_float (sign * atof (p));
else
{
- double v = 0;
+ unsigned char *old_p = p;
+ int v = 0;
+ int overflow = 0;
- while (1)
+ while (v >= 0)
{
int digit = digit_to_number (*p++, b);
if (digit < 0)
break;
+ if (v > INT_MAX / b)
+ {
+ overflow = 1;
+ break;
+ }
v = v * b + digit;
}
- val = make_fixnum_or_float (sign * v);
+ if (!overflow && v >= 0)
+ {
+ val = make_fixnum_or_float (sign * v);
+ }
+ else
+ {
+ double w = 0;
+ p = old_p;
+
+ while (1)
+ {
+ int digit = digit_to_number (*p++, b);
+ if (digit < 0)
+ break;
+ w = w * b + digit;
+ }
+
+ val = make_fixnum_or_float (sign * w);
+ }
}
return val;
Message not available
- Re: macro FIXNUM_OVERFLOW_P in lisp.h is valid ?,
Toru TSUNEYOSHI <=
Message not available
Re: macro FIXNUM_OVERFLOW_P in lisp.h is valid ?, Andreas Schwab, 2009/10/23
Re: macro FIXNUM_OVERFLOW_P in lisp.h is valid ?, Stefan Monnier, 2009/10/23