[英]ansi-c fscanf problem
嗨,我讀文件如下
fscanf(fp,"%f %f %f\n",&*(p1+i), &*(p2+i), &*(p3+i));
我文件的行由三個浮點數組成...
我的問題是,在文件中,我有一些浮點,例如,點后最多兩位數。 但是當我要求c使用不同格式來打印這些值時,例如%lf,%。2lf,%。4lf ...它開始使用數字播放...我唯一關心的是這個,如果我說1343.23在文件中,然后c將使用此值與計算中的值完全相同,否則它將使用點后的數字進行播放。 如果可以播放,那么如何使其完全使用浮點數呢? 例如在最后一種情況下,即使我要求它使用%.10lf打印該值,我也希望它僅打印1343.2300000000。 非常感謝!
“問題”是浮點數根據定義是近似的。 您應該閱讀每位計算機科學家應該了解的有關浮點算法的更多信息。
另外,您可以將&*(x)
簡化為x
,因此應在fscanf
調用中寫出p1+i
, p2+i
, p3+i
。
當您讀入字符串1343.23時,將其視為十進制數,它將轉換為計算機的內部二進制表示形式。 使用格式說明符輸出會從二進制轉換為十進制。 在輸出時,如果要求在小數點后輸入不同位數,則可能不會獲得完全相同的值。 在有限長度的二進制浮點數中,特定的浮點十進制數可能無法精確表示,因此應該四舍五入。
要獲得更好的解釋,請參閱著名的文章《每個科學家對浮點算法的了解》 。
點后的位數與fscanf沒有任何區別。 您應該擺脫&*並在字符串的末尾添加新行:
fscanf(fp, "%f %f %f\n", p1 + i, p2 + i, p3 + i);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.