c - 以 18 位以上的精度将 CSV 读入 C 中的网格

标签 c precision

我有一个名为“Q.csv”的文件,它是一个包含以下内容的文本文件:

-4.999118817962964961e-07 1.500000000000000197e-08 9.151794806638024753e-08 9.151794806638024753e-08

我想将其作为 2x2 矩阵读入 C 程序。目前我的程序看起来像这样。

 #include <stdio.h>
 #include <stdlib.h>
 int main(){
    FILE* inf;
    inf = fopen("Q.csv","r");
    int nrows = 2;
    int ncols = 2;
    double grid[nrows][ncols];
    double t;
    size_t x, y;
        for (x=0; x<ncols; ++x){
                for(y=0; y< nrows; ++y){
                        fscanf(inf,"%lg ",&t);
                        grid[x][y]=t;
                        printf("%lg\n",grid[x][y]);
                }
        }
        fclose(inf);
}

这个程序有效。但它并没有输出最初在 Q.csv 中的所有精度 - 例如,它输出第一个数字为 -4.99912e-07。例如,如果我拿走 %lg 并将其更改为 %.18g,它会输出错误的内容。如果我放 %.18lg 也一样。事实上,这两者都会导致神秘数字 4.94065645841246544e-324 重复(这是从哪里来的?!)

我怎样做才能将文件中的所有精度转换为 C?

最佳答案

将使用 fscanf(inf,"%lg ",&t); 尽可能地读取输入。

要打印出小数点后 18 位数字,请使用

 printf("%.*le\n",18, grid[x][y]);

如果 double 具有足够的精度,请检查值 DBL_DIG 必须至少为 10。我怀疑 double 仅适用于 15-共 17 位。


要获得所有 精度,请参阅Printf width specifier to maintain precision of floating-point value

关于c - 以 18 位以上的精度将 CSV 读入 C 中的网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34142674/

相关文章:

c - 在 C 中使用运算符 < 从文件重定向

php - MySQL 中的 float 不正确

c - c中的pow数字错误

c++ - 带 IEEE 754 float 的有效数字

Python 大随机整数和 Mersenne Twister 的精度

c - 如何在 C 中添加产品数字而不是产品本身?

c - 如何使用 ANSI 转义序列设置棕色?

C: Linux 内置链表在内核数据结构中的使用

c - 如何将指向物理内存的指针从内核空间传递到用户空间并将其映射到虚拟空间

python - 如何在 python 中将数字转换为 12 位精度?