UPDATE1
所以在将“+ 49.984367875E-230”转换为双倍并转换回字符串之后,如何将其打印为“4.998436788E-229”?
因为我必须将“+ 49.984367875E-230”换成双倍进行比较。
将字符串转换为double并将double转换为字符串时出现问题。例如:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char a[40]={"+49.984367875E-230"};
double d=atof(a);//d=4.9984367874999999e-229
char b[40],c[40];
sprintf(b,"%16.9E",d);
grisu2(c,"%16.9E",d);//implementation of grisu2 algorithm
printf("sprintf:%s\ngrisu2:%s\n",b,c);
return 0;
}
结果如下:
sprintf:4.998436787E-229
grisu2:4.998436788E-229
那么,为什么stdlib的atof
和sprintf
得到了错误的结果?
由于grisu2是正确的,所以我猜atof
是好的,但是sprintf
是错的?
因为我有grisu2,**所以我想要更快更准确atof
,我已经搜索了互联网和堆栈溢出,但** this fast_atof并不好。
我想要像grisu2这样的东西,是否有任何纸张或良好的实施?