我会切入正确的追逐:我正在尝试使用strtold
解析一个字符串以获得long double
,但它给了我错误的值。具体来说,我正在解析数字97777777777777777777777777777777777777.0,但是strtold
将其解析为97777777777777777779155292002375958528.000000。我检查了errno
,HUGE_VALL
和end_ptr
,但errno
未报告错误,我的号码在HUGE_VALL
附近没有,{{1} } 是空的。我一直试图调试这个,但我的智慧结束了。我不认为这是end_ptr
中的错误,因为如果我从数字中取出7个,就会出现同样的问题。这段代码适用于少数,如97.如果有人可以帮助我,我会非常感激。
代码:
strtold
输出:
#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;
}
一些细节:
64位Red Hat Linux:(HUGE_VALL = inf
strtold status: Success
the number: 9777777777777777777835998445568.000000
endbuf:
说x86_64)
运行Red Hat Enterprise Linux Server 7.1(Maipo)
gcc(GCC)4.8.3 20140911(Red Hat 4.8.3-9)
我正在使用c99进行编译:{{1}}
我还尝试了一个更简单的编译语句,其中我取出了所有不需要的依赖项:uname -i
答案 0 :(得分:0)
除了检查数据类型的范围(HUGE_VALL
或可能是LDBL_MAX
)之外,还要验证其精度,即该值的小数位数是多少由类型可靠地表示。 (已添加)这些信息可能由LDBL_DIG
宏提供,可能在<float.h>
中定义。
请参阅问题Caladan's answer
的long double (GCC specific) and __float128假设这个也可能有用:Implementation of type "long double" with GCC and C++11