2012-01-28 143 views
6

我試圖用libquadmath對printf __float128,如:__float128需要什麼printf精度纔不會丟失信息?

quadmath_snprintf(s, sizeof(s), "%.30Qg", f); 

以下三個constaints:

  1. 輸出必須以下生產相匹配:

    number = [ minus ] int [ frac ] [ exp ] 
    
    decimal-point = %x2E  ; . 
    
    digit1-9 = %x31-39   ; 1-9 
    
    e = %x65/%x45   ; e E 
    
    exp = e [ minus/plus ] 1*DIGIT 
    
    frac = decimal-point 1*DIGIT 
    
    int = zero/(digit1-9 *DIGIT) 
    
    minus = %x2D    ; - 
    
    plus = %x2B    ; + 
    
    zero = %x30    ; 0 
    
  2. 給定任何輸入__float128「i」已經被打印到與上述生產「s」匹配的字符串,然後「s」被掃描回到__floa t128「j」 - 「i」必須與「j」按位相同 - 即不應丟失任何信息。至少有一些值是不可能的(NaN,Infinity),這些值的完整列表是什麼?

  3. 應該沒有其他字符串滿足上述兩個標準,即比候選人短。

是否有一個quadmath_snprintf格式字符串滿足上述(可能的話1,3和2)?如果是這樣,它是什麼?

__float128的哪些值無法通過上述生產滿足第2點的要求? (例如Nan,+/- Infinity等)如何檢測__float128是否保存這些值之一?

+0

有一組無法在__float128中精確表示的十進制數。任何有超過34位有效數字。您的格式說明符會爲任何絕對編號> = 1E5生成隨機數字。你的方法有很大的缺陷,可能是因爲你需要__float128來解決問題。 – 2012-01-28 14:02:49

+5

在__float128中無法準確表示的無限數十進制數的事實是不相關的,點2只要求十進制表示形式足夠精確,以便在回讀和舍入時與進入的內容相同。意識到格式說明符不正確,問題要求正確。我的「方法」很好,你不知道我想要解決什麼問題。 「 – 2012-01-28 15:27:45

回答

1

如果您使用x86,那麼GCC __float128類型是IEEE 754-2008 binary128格式的軟件實現。如果字符表示包含36個有效(十進制)數字,IEEE 754標準要求二進制 - >字符 - >二進制往返恢復原始值。因此格式字符串「%.36Qg」應該這樣做。

NaN往返不需要恢復原始的按位值。

至於您的需求#3,libquadmath不包含這種「最短表示」格式的代碼,例如,本着Steele &白皮書或David Gay的代碼精神。

0

我的直覺告訴我,二分數0.1111 ... 1(128 ones);也等於1-1/2 ** 128將在轉換爲十進制時產生最大數量的溢出。將該值轉換爲十進制(我現在沒有bignum包),計算位數,在其上添加2-3,並且應該是安全的。雖然我沒有足夠的數學證明。

如果I/O的精度很重要,我寧願輸出float作爲十六進制字符串。準確的浮點IO很難找到正確的,並且該庫可能在​​這方面有問題。

+0

」0.1111 ...1(128個)「不能表示爲'__float128',但是即使將128代入到你可能意義上的113中,我也不明白爲什麼這個數字應該是最壞的情況。最壞情況候選人的十進制表示將從前導1開始,而不是前導9。 – 2013-07-16 22:49:23