I'll cut right to the chase: I am trying to parse a string with strtold
to get a long double
, but it is giving me the wrong value. Specifically, I am parsing the number 97777777777777777777777777777777777777.0, but strtold
parses it as 97777777777777777779155292002375958528.000000. I check errno
, HUGE_VALL
, and end_ptr
, but errno
does not report an error, my number is no where near HUGE_VALL
, and end_ptr
is empty. I've been trying to debug this for a while, but I'm at my wits end. I don't think this is a bug in strtold
because the same problem happens if I take out some 7's from the number. This code works for small numbers, like 97. I would greatly appreciate it if someone could help me here.
The code:
#include <stdio.h> // printf
#include <stdlib.h> // strtold
#include <errno.h> // errno
#include <string.h> // strerror
#include <math.h> // HUGE_VALL
int main(int argc, char** argv)
{
char* theNum = "97777777777777777777777777777777777777.0";
printf("HUGE_VALL = %Lf\n", HUGE_VALL); // just to make sure I'm not insane
char* endbuf;
errno = 0;
long double n = strtold(theNum, &endbuf);
if (n == HUGE_VALL && errno != 0)
{ printf("strtold err: %s\n", strerror(errno)); }
else
{ printf("strtold status: %s\n", strerror(errno)); }
printf("the number: %Lf\n", n);
printf("endbuf: %s\n", endbuf);
return 0;
}
Output:
HUGE_VALL = inf
strtold status: Success
the number: 9777777777777777777835998445568.000000
endbuf:
Some details:
64-bit Red Hat Linux: (uname -i
says x86_64)
Running Red Hat Enterprise Linux Server release 7.1 (Maipo)
gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
I'm compiling using c99: c99 primefactors_test.c ../../src/primefactors.c -o primefactors_test -I../../include/ -O3 -lm
I also tried a simpler compile statement where I take out all of the unneeded dependencies: c99 primefactors_test.c -o primefactors_test -lm