簡體   English   中英

在C中解析CSV文件時丟失雙精度

[英]double precision lost when parsing csv file in C

我正在嘗試讀取具有以下格式的c文件:

6.43706064058,4.15417249035
3.43706064058,1.15417249035
...

我能夠解析出兩個雙打,但是當我打印出解析后的內容時,我注意到我最多只能得到6個小數位。 這是我的代碼:

long double d1;
long double d2;
fscanf(file, "%Lf,%Lf", &d1, &d2);
printf("x:%Lf, y:%Lf", d1, d2);

輸出:

x:6.437061, y:4.154172
...

我在哪里失去精度? 是否可以正確讀取它,但是我的printf語句未顯示所有精度?

是否可以正確讀取它,但是我的printf語句未顯示所有精度?

這就是正在發生的事情。 printf(3)手冊頁

...小數點后的位數等於精度規格。 如果缺少精度,則將其視為6 ...

告訴printf通過更改格式字符串來顯示更高的精度:

 printf("x:%.11Lf, y:%.11Lf", d1, d2);

默認的%f格式僅在小數點后第6位打印,這使您的精度比實際的浮點值低得多(除非指數較大),並且可能根本沒有精度(如果指數略微大於負數)。 除非您知道所有值都限制為零(例如都大於1),否則您確實需要使用%g格式(可以根據需要切換為指數表示法)或%e格式(始終使用指數表示法)以保持精度的方式打印浮點值。

您還需要使用足夠多的小數位。 對於IEEE雙精度,17位小數就足夠了,因此%.17g是首選格式。 對於long double ,它取決於特定實現上使用的類型。 幸運的是,C提供了一個宏DECIMAL_DIG ,它為您提供了所需的確切位置的數量。 因此,您將使用:

printf("%.*Lg", DECIMAL_DIG, x);

或類似。 請注意,這將打印比您輸入文件中原始位置更多的位置。 如果您知道您的輸入始終具有特定數量的位置,則可以使用硬編碼而不是使用DECIMAL_DIG獲得更統一的輸出。

之所以沒有達到您想要的精度,是因為數字中的間距水平不夠。 在第一個數字6.43706064058中,您有13個數字(包括小數),因此您需要輸入

    printf("x:%13Lf, y:%Lf", d1, d2);

x允許13個空格:

對於第二個數字4.15417249035,您也有13個,因此,您將

    printf("x:%13Lf, y:13%Lf", d1, d2);

然后將打印:

    x:6.43706064058, y:4.15417249035

在執行printf函數時,必須為數字中的所有空格留出空間。 希望能有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM