This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]