strtold解析比给定数字更低的数字

时间:2015-10-12 08:27:25

标签: c linux gcc

我会切入正确的追逐:我正在尝试使用strtold解析一个字符串以获得long double,但它给了我错误的值。具体来说,我正在解析数字97777777777777777777777777777777777777.0,但是strtold将其解析为97777777777777777779155292002375958528.000000。我检查了errnoHUGE_VALLend_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

1 个答案:

答案 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