This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
Re: Fwd: Floating point exception in strtod()
On 4/7/2018 8:05 PM, Brian Inglis wrote:
(gdb) p aadj
$1 = 2529648000
(gdb) p L
$2 = -1765319296
[...]
Seems to be happening at strtod.c line 1189 conversion to Long in:
https://sourceware.org/git/?p=newlib-cygwin.git;a=blame;f=newlib/libc/stdlib/strtod.c;h=402510cdf24ee332a9fc09c6f73df06b1975a6e2;hb=4c73ad6b20378e4b74355fcdb2005f2aac489c9f#l1189
1187 if (y == z) {
1188 /* Can we stop now? */
1189 L = (Long)aadj; !!!
1190 aadj -= L;
Note that aadj == 2529648000 == 0x96C75D80, which is too big to be
represented by a Long (which is typedef'd to __int32_t in
newlib/libc/stdlib/mprec.h). I think this explains the SIGFPE.
Presumably the authors of the code knew that aadj could be this big,
because there's a test for aadj <= 0x7fffffff in line 1123. So would
the solution be to catch SIGFPE here and ignore it?
[I haven't tried to understand what aadj is being used for, so this
suggestion might be complete nonsense.]
Ken