string转double,答案正确,但不是很准确
convert string to double , the answer is correct ,but not very accurate
我想用atof把我的字符串转换成double,答案是正确的,但不是很准确
注意:由于某些其他原因,不允许使用 fscanf
我的代码是:
#include <stdio.h>
#include <stdlib.h>
#define MAXCN 50
int main(void)
{ FILE* lstm_txt = NULL;
char lstm_weight[MAXCN] = {0};
int lstm = 0;
int i = 0;
float lstm_val;
if ((lstm_txt = fopen("test1.txt", "r"))== NULL){
fprintf(stderr,"error:file open failed 'test1.txt'.\n");
return 1;
}
while ((i + 1 < MAXCN) && ((lstm = fgetc(lstm_txt)) != ' ' ) && (lstm != EOF)){
lstm_weight[i++] = lstm;
}
//lstm_weight[i] = 0;
printf("\n lstm_weight: %s\n\n", lstm_weight);
lstm_val = atof(lstm_weight);
printf("\n convert \"lstm_weight\" to lstm_val is : %f\n\n", lstm_val);
return 0;
}
我的文件:lstm_txt是:
4.217959344387054443e-01 -2.566376626491546631e-01 2.173236161470413208e-01 4.217959344387054443e-01
代码没有错误,结果是:
lstm_weight: 4.217959344387054443e-01
convert "lstm_weight" to lstm_val is : 0.421796
但我想要 Istm_val 是 0.4217959344387054443 ,我该怎么做?
A double
通常具有大约 15 位小数精度。如果将值存储在双精度值中,您将不会获得更高的准确性。你得到的越来越少,因为你没有告诉 printf
有多少位精度用于输出,所以你得到了默认值。
使用 %0.15f
而不是 %f
。
convert "lstm_weight" to lstm_val is : 0.421795934438705
使用 %0.20f
,我得到:
convert "lstm_weight" to lstm_val is : 0.42179593443870544434
这是你用 double
做的最好的事情了。
正在打印 %.17f
您可以达到 0.42179593443870544
的精度
printf("\n convert \"lstm_weight\" to lstm_val is : %.17f\n\n", lstm_val);
你可以试试 sprintf()
这是一个例子:
#include <stdio.h>
int main() {
char str[50];
double n = 0.3984092590879;
sprintf(str, "%lf", n);
printf(str);
return 0;
}
打印出来:
0.3984092590879
我想用atof把我的字符串转换成double,答案是正确的,但不是很准确
注意:由于某些其他原因,不允许使用 fscanf
我的代码是:
#include <stdio.h>
#include <stdlib.h>
#define MAXCN 50
int main(void)
{ FILE* lstm_txt = NULL;
char lstm_weight[MAXCN] = {0};
int lstm = 0;
int i = 0;
float lstm_val;
if ((lstm_txt = fopen("test1.txt", "r"))== NULL){
fprintf(stderr,"error:file open failed 'test1.txt'.\n");
return 1;
}
while ((i + 1 < MAXCN) && ((lstm = fgetc(lstm_txt)) != ' ' ) && (lstm != EOF)){
lstm_weight[i++] = lstm;
}
//lstm_weight[i] = 0;
printf("\n lstm_weight: %s\n\n", lstm_weight);
lstm_val = atof(lstm_weight);
printf("\n convert \"lstm_weight\" to lstm_val is : %f\n\n", lstm_val);
return 0;
}
我的文件:lstm_txt是:
4.217959344387054443e-01 -2.566376626491546631e-01 2.173236161470413208e-01 4.217959344387054443e-01
代码没有错误,结果是:
lstm_weight: 4.217959344387054443e-01
convert "lstm_weight" to lstm_val is : 0.421796
但我想要 Istm_val 是 0.4217959344387054443 ,我该怎么做?
A double
通常具有大约 15 位小数精度。如果将值存储在双精度值中,您将不会获得更高的准确性。你得到的越来越少,因为你没有告诉 printf
有多少位精度用于输出,所以你得到了默认值。
使用 %0.15f
而不是 %f
。
convert "lstm_weight" to lstm_val is : 0.421795934438705
使用 %0.20f
,我得到:
convert "lstm_weight" to lstm_val is : 0.42179593443870544434
这是你用 double
做的最好的事情了。
正在打印 %.17f
您可以达到 0.42179593443870544
printf("\n convert \"lstm_weight\" to lstm_val is : %.17f\n\n", lstm_val);
你可以试试 sprintf()
这是一个例子:
#include <stdio.h>
int main() {
char str[50];
double n = 0.3984092590879;
sprintf(str, "%lf", n);
printf(str);
return 0;
}
打印出来:
0.3984092590879