gpt4 book ai didi

在 c 中创建精确的 atof() 实现

转载 作者:行者123 更新时间:2023-11-30 18:34:21 32 4
gpt4 key购买 nike

我用 c 编写了 atof() 实现。我在此实现中面临舍入错误。因此,输入测试值 1236.965 会得到 1236.964966 的结果,但库 atof() 函数返回 1236.965000 。我的问题是,如何使用户定义的 atof() 实现更加“正确”?

可以在某处找到 atof() 的库定义吗?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

float str_to_float(char *);
void float_to_str(float,char *);

int main(){
int max_size;
float x;
char *arr;
printf("Enter max size of string : ");
scanf("%d",&max_size);
arr=malloc((max_size+1)*sizeof(char));
scanf("%s",arr);
x=str_to_float(arr);
printf("%f\n%f",x,atof(arr));
return 0;
}

float str_to_float(char *arr){
int i,j,flag;
float val;
char c;
i=0;
j=0;
val=0;
flag=0;
while ((c = *(arr+i))!='\0'){
// if ((c<'0')||(c>'9')) return 0;
if (c!='.'){
val =(val*10)+(c-'0');
if (flag == 1){
--j;
}
}
if (c=='.'){ if (flag == 1) return 0; flag=1;}
++i;
}
val = val*pow(10,j);
return val;
}

最佳答案

将所有花车更改为双倍。当我测试它时,它给出了与测试用例的库函数 atof 相同的结果。

atof 返回 double 值,而不是浮点值。请记住,它实际上是 double,而不是 C 中“正常”浮点类型 float。浮点文字(例如 3.14)是 double 类型,库函数例如 sinlog 和(可能具有欺骗性的名称)atof 使用 double 。

不过,它仍然不“精确”。作为 float ,最接近 1236.965 的是(精确地)1236.9649658203125,作为 double ,最接近 1236.964999999999918145476840436458587646484375,它将被 printf 四舍五入到 1236.965000。无论二进制 float 有多少位,都无法精确表示 1236.965,类似于 1/3 无法用有限数量的十进制数字精确表示:0.3333333333333333...

而且,正如评论中的讨论所示,这是一个难题,如果您希望代码始终给出最接近的值,则可能存在许多陷阱。

关于在 c 中创建精确的 atof() 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52391330/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com