亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

保持浮點值精度的Printf寬度說明符

保持浮點值精度的Printf寬度說明符

開心每一天1111 2019-06-11 13:10:23
保持浮點值精度的Printf寬度說明符有沒有printf寬度說明符,可應用于浮點說明符,該說明符將自動將輸出格式化為所需的有效數字這樣,當掃描返回字符串時,獲取原始浮點值?例如,假設我打印一個float精確到2小數位:float foobar = 0.9375;printf("%.2f", foobar);    // prints out 0.94當我掃描輸出時0.94,我沒有符合標準的保證,我會得到原來的0.9375浮點值返回(在本例中,我可能不會)。我想找個方法告訴你printf將浮點值自動打印到所需的有效數字以確保可以將其掃描回傳遞給printf.我可以使用一些宏float.h到求出最大寬度傳給printf,但是是否已經有一個說明符可以自動打印到所需的有效數字-或者至少達到最大寬度?
查看完整描述

3 回答

?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

十六進制解決方案:使用%a。

OP想要“具有最大精度的打印(或至少到最重要的十進制)”。

一個簡單的例子是打印七分之一,如下所示:

#include <float.h>int Digs = DECIMAL_DIG;double OneSeventh = 1.0/7.0;printf("%.*e\n", Digs, OneSeventh);// 1.428571428571428492127e-01

但讓我們深入挖掘.。

數學上,答案是“0.142857 142857 142857.”,但我們使用的是有限精度浮點數。讓我們假設IEEE 754雙精度二進制..所以OneSeventh = 1.0/7.0結果如下所示。還顯示了前面和下面的可表示double浮點數。

OneSeventh before = 0.1428571428571428 214571170656199683435261249542236328125OneSeventh        
= 0.1428571428571428 49212692681248881854116916656494140625OneSeventh after  = 0.1428571428571428 769682682968777953647077083587646484375

打印精確性的十進制表示double用途有限。

C中有兩個宏家族。<float.h>幫助我們。
第一組是顯著用十進制字串打印的數字,所以當掃描返回字符串時,我們得到原始浮點數。這里顯示的是C規范最小值價值和a樣本c11編譯器

FLT_DECIMAL_DIG   6,  9 (float)                           (C11)DBL_DECIMAL_DIG  10, 17 (double)                    
      (C11)LDBL_DECIMAL_DIG 10, 21 (long double)                     (C11)DECIMAL_DIG      
      10, 21 (widest supported floating type)  (C99)

第二組是顯著數字字符串可以掃描成浮點,然后打印FP,仍然保留相同的字符串表示形式。這里顯示的是C規范最小值價值和a樣本c11編譯器我相信在C99之前就有了。

FLT_DIG   6, 6 (float)DBL_DIG  10, 15 (double)LDBL_DIG 10, 18 (long double)

第一組宏似乎符合OP的目標顯著數字。但那并不總是可用的。

#ifdef DBL_DECIMAL_DIG  #define OP_DBL_Digs (DBL_DECIMAL_DIG)#else  
  #ifdef DECIMAL_DIG    #define OP_DBL_Digs (DECIMAL_DIG)
  #else  
    #define OP_DBL_Digs (DBL_DIG + 3)
  #endif#endif

“+3”是我先前回答的關鍵。如果知道往返轉換字符串-fp-string(SET#2宏可用C89),那么如何確定fp-string-fp(SET#1宏可用后C89)的數字?總的來說,Add 3就是結果。

現在有多少顯著要打印的數字是已知的,并通過<float.h>.

打印N顯著十進制數字可以使用各種格式。

帶著"%e"精密度字段是數字的數目。領頭數字和小數點。所以- 1是合乎情理的。注:此-1 is not in the initialINDIG=十進制_DIG;

printf("%.*e\n", OP_DBL_Digs - 1, OneSeventh);// 1.4285714285714285e-01

帶著"%f"精密度字段是數字的數目。小數點。像這樣的數字OneSeventh/1000000.0,一個人需要OP_DBL_Digs + 6去看所有的顯著數字。

printf("%.*f\n", OP_DBL_Digs    , OneSeventh);// 0.14285714285714285printf("%.*f\n", OP_DBL_Digs + 6, OneSeventh/1000000.0);
// 0.00000014285714285714285

注:許多人習慣于"%f"..它在小數點之后顯示6位數字;6是顯示默認值,而不是數字的精度。


查看完整回答
反對 回復 2019-06-11
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

不丟失地打印浮點數的簡短答案(因此可以將它們讀回完全相同的數字,但NaN和Infinity除外):

  • 如果您的類型是浮動的:使用

    printf("%.9g", number).

  • 如果您的類型是雙重的:使用

    printf("%.17g", number).

不使用%f,因為這僅指定小數之后的有效位數,并將截斷小數字。作為參考,魔幻數字9和17可以在float.h它定義了FLT_DECIMAL_DIGDBL_DECIMAL_DIG.


查看完整回答
反對 回復 2019-06-11
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

如果您只對位(resp十六進制模式)感興趣,則可以使用%a格式。這保證你:

如果存在基2中的精確表示,并且在其他情況下足夠大,足以區分類型Double的值,則默認精度就足以表示值的精確表示。

我必須補充一點,這是只有在C99之后才能使用的。


查看完整回答
反對 回復 2019-06-11
  • 3 回答
  • 0 關注
  • 821 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號