如何在C中手动和精确地解析字符串中的浮点数?

时间:2016-06-16 13:04:04

标签: c algorithm gcc

我想在C中从头开始解析浮点数。

但是我发现有一个明显的错误,因为在计算机中存储float / double不够精确。

以下是我的解析代码,无论涉及负号的条件如何:

void parseFloat(double *coe, int *exp){

    char c = 0;
    double digit = 10;
    *coe = 0, *exp = 0;
    int state = 0;
    while((c = getchar_unlocked()) !='\n'){
        if(c == '.'){
            state = 1;
            continue;
        }
        if(c == 'e'){
            state = 2;
            continue;
        }
        if(state == 0){
            *coe = *coe * 10 + c - '0';
        }else if(state == 1){
            *coe += (c - '0') / digit;
            digit *= 10;
        }else if(state == 2){
            *exp = *exp * 10 + c - '0';
        }else{
            *coe = 0, *exp = 0;
            break;
        }
    }

    return;
}

由于解析过程中每个循环步骤所带来的微不足道的错误,它得到了完全无法容忍的错误结果:

        input        ->          output
5.699141892149156e76 -> 5.699141892149156341 76
9.205357638345294e18 -> 9.2053576383452959675 18

那么有更好的解析浮点数的方法吗?

scanf("%f", &fpn)这样的内置库是如何实现的?

非常感谢!

0 个答案:

没有答案