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