我想在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)
这样的内置库是如何实现的?
非常感谢!