主頁 > 軟體工程 > 浮點文字中有效十進制數字的最小數量是多少,以盡可能正確地表示該值?

浮點文字中有效十進制數字的最小數量是多少,以盡可能正確地表示該值?

2022-04-26 10:18:05 軟體工程

例如,使用 IEEE-754 32 位二進制浮點數,讓我們表示1 / 3. 它不能精確地完成,但0x3eaaaaab會產生最接近的值1 / 3您可能希望以十進制寫入值,并讓編譯器將十進制文字轉換為二進制浮點數。

0.333333f    -> 0x3eaaaa9f (0.333332986)
0.3333333f   -> 0x3eaaaaaa (0.333333313)
0.33333333f  -> 0x3eaaaaab (0.333333343)
0.333333333f -> 0x3eaaaaab (0.333333343)

您可以看到 8 個(有效)十進制數字足以表示盡可能正確的值(最接近實際值)。

我用 π 和 e(自然對數的底)進行了測驗,兩者都需要 8 個十進制數字才能最正確。

3.14159f    -> 0x40490fd0 (3.14159012)
3.141593f   -> 0x40490fdc (3.14159298)
3.1415927f  -> 0x40490fdb (3.14159274)
3.14159265f -> 0x40490fdb (3.14159274)

2.71828f    -> 0x402df84d (2.71828008)
2.718282f   -> 0x402df855 (2.71828198)
2.7182818f  -> 0x402df854 (2.71828175)
2.71828183f -> 0x402df854 (2.71828175)

但是,√2似乎需要 9 位數字。

1.41421f     -> 0x3fb504d5 (1.41420996)
1.414214f    -> 0x3fb504f7 (1.41421402)
1.4142136f   -> 0x3fb504f4 (1.41421366)
1.41421356f  -> 0x3fb504f3 (1.41421354)
1.414213562f -> 0x3fb504f3 (1.41421354)

https://godbolt.org/z/W5vEcs695

查看這些結果,具有 9 位有效數字的十進制浮點文字足以產生最正確的 32 位二進制浮點值可能是正確的,并且在實踐中,如果空間為存盤額外的數字并不重要。

但我對它背后的數學很感興趣。在這種情況下,如何確定 9 位數字就足夠了?甚至是double任意精度,是否有一個簡單的公式可以得出所需的位數?


當前的答案和評論中的鏈接確認9數字對于大多數情況來說就足夠了,但我發現了一個反例,其中9數字是不夠的。事實上,十進制格式的無限精度需要始終正確轉換(四舍五入到最接近的值)為某些二進制浮點格式(討論 IEEE-754 binary32 浮點數)。

8388609.4999有效十進制數字表示的是8388609.50該數字轉換為float的值為8388610另一方面,用10或更多位表示的數字將始終保留原始值,并且轉換為float的數字具有 value 8388609

您可以看到8388609.499需要比9數字更準確地轉換為float. 有無數這樣的數字,非常接近二進制浮點格式中兩個可表示值的半點。

uj5u.com熱心網友回復:

我認為您正在尋找*_DECIMAL_DIG常量。C 標準提供了關于如何計算它們的小解釋和公式(N2176 C17 草案):

5.2.4.2.2 浮動型別的特點<float.h>

  1. 以下串列中給出的值應替換為具有實作定義的值的常量運算式,這些值的大小(絕對值)大于或等于所示值,符號相同:

    ...

    • 小數位數n,這樣任何具有p基數b位的浮點數都可以四舍五入為具有n 個十進制數字的浮點數,然后再回傳而不會更改值,

      p log10 b        if b is a power of 10
      ?1   p log10 b?  otherwise
      
      
      FLT_DECIMAL_DIG  6
      DBL_DECIMAL_DIG  10
      LDBL_DECIMAL_DIG 10
      

使用 IEEE-754 32 位浮點數b = FLT_RADIX = 2p = FLT_MANT_DIG = 24,結果為FLT_DECIMAL_DIG = ?1 24 log10 2? = 9( ?x?=ceil(x)) 是天花板函式:向上取整)

uj5u.com熱心網友回復:

那么雙精度甚至任意精度呢,有沒有一個簡單的公式可以推匯出所需的位數?>

從 C17 § 5.2.4.2.2 11FLT_DECIMAL_DIG, DBL_DECIMAL_DIG, LDBL_DECIMAL_DIG

小數位數n,這樣任何具有p基數b位的浮點數都可以四舍五入為具有n 個十進制數字的浮點數,然后再回傳而不會更改值,

p max log 10 b:如果b是 10 的冪
1 p max log 10 b:否則


但我對它背后的數學很感興趣。在這種情況下,如何確定 9 位數字就足夠了?

每個二進制浮點范圍,如 [1.0 ... 2.0)、[128.0 ... 256.0)、[0.125 ... 0.5) 包含 2 p - 1 個均勻分布的值。例如float, p = 24。

十進制文本的每個范圍都n包含 10 n - 1 個值均勻分布。

例子: common float:
p是 24 和 2 24組合時,n必須至少有8 來形成 16,777,216 個組合才能清楚地將十進制文本往返float傳輸到float. 由于上述兩個十進制范圍的端點可能很好地存在于該組 2 24中,因此較大的十進制值間隔得更遠。這需要 1 十進制數字。

例子:

考慮 2 個相鄰的float

10.000009_5367431640625
10.000010_49041748046875

兩者都轉換為 8 位有效數字十進制文本"10.000010"8個還不夠。

9 總是足夠的,因為我們不需要超過 167,772,160 來區分 16,777,216 個float 值。


OP 還詢問8388609.499. (我們只考慮float簡單。)

該值幾乎介于 2 個float值之間。

8388609.0f  // Nearest lower float value
8388609.499 // OP's constant as code
8388610.0f  // Nearest upper float value

OP 報告:“您可以看到 8388609.499 需要超過 9 位才能最準確地轉換為浮點數。”

讓我們回顧一下標題“浮點文字*1中有效小數位數的最小數量是多少,以盡可能正確地表示該值?”

這個新的問題部分強調所討論的是源代碼的值,8388609.499而不是它在發出的代碼中變成的浮點常量:8388608.0f.

如果我們認為該浮點常數的值,那么定義浮點常數 需要最多 9 位有效十進制數字8388608.0f8388608.49,作為源代碼就足夠了。

但是要根據某個數字作為代碼獲得最接近的浮點常數,確實可能需要很多位數。

考慮典型的最小的floatFLT_TRUE_MIN具有精確的十進制值:

0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125

0.0 和 0.0 之間的一半是 0.000..(約 39 個零)..0007006..(約 100 個數字)..15625。

如果最后一位數字是 6 或 4,則最接近的數字分別floatFLT_TRUE_MIN0.0f所以現在我們有一個案例,其中“需要”109 個有效數字來在 2 個可能的 之間進行選擇float

為了避免我們越過精神錯亂的懸崖,IEEE-758 已經解決了這個問題。

翻譯(編譯器)必須檢查以符合該規范(不一定是 C 規范)的有效十進制數字的數量要有限得多,即使額外的數字可以轉換為另一個 FP 值。

IIRC,它已經生效FLT_DECIMAL_DIG 3因此,對于一個常見的float,可以檢查低至 9 3 個有效十進制數字。

(稍后我會查一些章節和詩句)


*1 C 沒有定義:浮點文字,但確實定義了浮點常量,因此使用了該術語。

uj5u.com熱心網友回復:

浮點文字中有效十進制數字的最小數量是多少,以盡可能正確地表示該值?

C 標準不保證浮點文字中的任意數量的十進制數字將產生以浮點格式實際可表示的最接近的值。在討論浮點文字時,C 2018 6.4.4.2 3 說:

…對于十進制浮點常量,…結果要么是最接近的可表示值,要么是緊鄰最接近的可表示值的較大或較小的可表示值,以實作定義的方式選擇...

為了質量,C 實作應該正確地將浮點文字四舍五入到最接近的可表示值,并與偶數低位的選擇聯系起來。在這種情況下,FLT_DECIMAL_DIGDBL_DECIMAL_DIGLDBL_DECIMAL_DIG中定義的值<float.h>提供的位數始終足以唯一標識可表示的值。

在這種情況下,如何確定 9 位數字就足夠了?

您需要在編譯器檔案中宣告這種效果,例如它為浮點文字提供正確舍入并且它使用 IEEE-754 binary32(又名“單精度”)for float(或僅需要九個的其他格式)的宣告唯一標識所有可表示值的有效數字)。

雙精度甚至任意精度怎么樣,是否有一個簡單的公式可以得出所需的位數?

C 標準表明,如果b是十的冪,則上述常數計算為p log 10 b ,否則計算為 ceil(1 p log 10 b ),其中p是浮點格式的位數,b是格式中使用的基礎。這些總是足夠的,但后者并不總是必要的。后者提供指數范圍無界時所需的位數;從某種意義上說,它的“1 ”涵蓋了b的冪如何與 10 的冪相互作用的所有可能的余量。但是任何浮點格式都有一個有限的指數范圍,并且對于某些指數范圍的選擇,ceil( p log 10 b ) 代替 ceil(1 p log 10 b ) 就足夠了。這沒有簡單的公式。它不會出現在標準 IEEE-754 格式中,在實踐中可以忽略。

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/464185.html

標籤:C 浮点 精确 数值方法 ieee-754

上一篇:將陣列回傳到C中的函式的問題

下一篇:如何在c中的圖中標記已訪問過的頂點

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more