日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IEEE 754标准--维基百科

發布時間:2023/12/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IEEE 754标准--维基百科 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

IEEE二進制浮點數算術標準(IEEE 754) 是20世紀80年代以來最廣泛使用的浮點數運算標準,為許多CPU與浮點運算器所采用。這個標準定義了表示浮點數的格式(包括負零-0)與反常值(denormal number),一些特殊數值((無窮(Inf)與非數值(NaN)),以及這些數值的“浮點數運算符”;它也指明了四種數值舍入規則和五種例外狀況(包括例外發生的時機與處理方式)。

IEEE 754規定了四種表示浮點數值的方式:單精確度(32位)、雙精確度(64位)、延伸單精確度(43比特以上,很少使用)與延伸雙精確度(79比特以上,通常以80位實現)。只有32位模式有強制要求,其他都是選擇性的。大部分編程語言都提供了IEEE浮點數格式與算術,但有些將其列為非必需的。例如,IEEE 754問世之前就有的C語言,現在包括了IEEE算術,但不算作強制要求(C語言的float通常是指IEEE單精確度,而double是指雙精確度)。

該標準的全稱為IEEE二進制浮點數算術標準(ANSI/IEEE Std 754-1985),又稱IEC 60559:1989,微處理器系統的二進制浮點數算術(本來的編號是IEC 559:1989)[1]。后來還有“與基數無關的浮點數”的“IEEE 854-1987標準”,有規定基數為2跟10的狀況。現在最新標準是“ISO/IEC/IEEE FDIS 60559:2010”。

在六、七十年代,各家計算機公司的各個型號的計算機,有著千差萬別的浮點數表示,卻沒有一個業界通用的標準。這給數據交換、計算機協同工作造成了極大不便。IEEE的浮點數專業小組于七十年代末期開始醞釀浮點數的標準。在1980年,英特爾公司就推出了單片的8087浮點數協處理器,其浮點數表示法及定義的運算具有足夠的合理性、先進性,被IEEE采用作為浮點數的標準,于1985年發布。而在此前,這一標準的內容已在八十年代初期被各計算機公司廣泛采用,成了事實上的業界工業標準。加州大學伯克利分校的數值計算與計算機科學教授威廉·卡韓被譽為“浮點數之父”。

浮點數剖析

一個浮點數 (Value) 的表示其實可以這樣表示:

也就是浮點數的實際值,等于符號位(sign bit)乘以指數偏移值(exponent bias)再乘以分數值(fraction)。

以下內文是IEEE 754對浮點數格式的描述。

本文表示比特的約定

把W個比特(bit)的數據,從內存地址低端到高端,以0到W?1編碼。通常將內存地址低端的比特寫在最右邊,稱作最低有效位(Least Significant Bit, LSB),代表最小的比特,改變時對整體數值影響最小的比特。聲明這一點的必要性在于X86體系架構是小端序的數據存儲。

對于十進制整數N,必要時表示為N10以與二進制的數的表示N2相區分。

對于一個數,其二進制科學計數法表示下的指數的值,下文稱之為指數的實際值;而根據IEEE 754標準對指數部分的編碼的值,稱之為浮點數表示法指數域的編碼值

整體呈現

IEEE 754浮點數的三個域
二進制浮點數是以符號數值表示法的格式存儲——最高有效位被指定為符號位(sign bit);“指數部分”,即次高有效的e個比特,存儲指數部分;最后剩下的f個低有效位的比特,存儲“有效數”(significand)的小數部分(在非規約形式下整數部分默認為0,其他情況下一律默認為1)。

指數偏移值

采用指數的實際值加上固定的偏移值的辦法表示浮點數的指數,好處是可以用長度為$e}e個比特的無符號整數來表示所有的指數取值,這使得兩個浮點數的指數大小的比較更為容易,實際上可以按照字典序比較兩個浮點表示的大小。

這種移碼表示的指數部分,中文稱作階碼。

規約形式的浮點數

如果浮點數中指數部分的編碼值在 0<exponent?2e?20<exponent\leqslant 2^{e}-20<exponent?2e?2之間,且在科學表示法的表示方式下,分數 (fraction) 部分最高有效位(即整數字)是 1,那么這個浮點數將被稱為規約形式的浮點數。“規約”是指用唯一確定的浮點形式去表示一個值。

由于這種表示下的尾數有一位隱含的二進制有效數字,為了與二進制科學計數法的尾數(mantissa)相區別,IEEE754稱之為有效數(significant)。

舉例來說,雙精度 (64-bit) 的規約形式浮點數在指數偏移值的值域為000000000010000000000100000000001(11-bit) 到111111111101111111111011111111110 ,在分數部分則是000.....000000.....000000.....000111.....111111.....111111.....111 (52-bit)

非規約形式的浮點數

如果浮點數的指數部分的編碼值是0,分數部分非零,那么這個浮點數將被稱為非規約形式的浮點數。一般是某個數字相當接近零時才會使用非規約型式來表示。 IEEE 754標準規定:非規約形式的浮點數的指數偏移值比規約形式的浮點數的指數偏移值小1。例如,最小的規約形式的單精度浮點數的指數部分編碼值為1,指數的實際值為-126;而非規約的單精度浮點數的指數域編碼值為0,對應的指數實際值也是-126而不是-127。實際上非規約形式的浮點數仍然是有效可以使用的,只是它們的絕對值已經小于所有的規約浮點數的絕對值;即所有的非規約浮點數比規約浮點數更接近0。規約浮點數的尾數大于等于1且小于2,而非規約浮點數的尾數小于1且大于0。

特殊值

這里有三個特殊值需要指出:

以上規則,總結如下:

32位單精度

單精度二進制小數,使用32個比特存儲。

S為符號位,Exp為指數字,Fraction為有效數字。 指數部分即使用所謂的偏正值形式表示,偏正值為實際的指數大小與一個固定值(32位的情況是127)的和。采用這種方式表示的目的是簡化比較。因為,指數的值可能為正也可能為負,如果采用補碼表示的話,全體符號位S和Exp自身的符號位將導致不能簡單的進行大小比較。正因為如此,指數部分通常采用一個無符號的正數值存儲。單精度的指數部分是?126~+127加上偏移值127,指數值的大小從1~254(0和255是特殊值)。浮點小數計算時,指數值減去偏正值將是實際的指數大小。

單精度浮點數各種極值情況:

64位雙精度

雙精度二進制小數,使用64個比特存儲。

S為符號位,Exp為指數字,Fraction為有效數字。指數部分即使用所謂的偏正值形式表示,偏正值為實際的指數大小與一個固定值(64位的情況是1023)的和。采用這種方式表示的目的是簡化比較。因為,指數的值可能為正也可能為負,如果采用補碼表示的話,全體符號位S和Exp自身的符號位將導致不能簡單的進行大小比較。正因為如此,指數部分通常采用一個無符號的正數值存儲。雙精度的指數部分是?1022~+1023加上1023,指數值的大小從1~2046(0(2進位全為0)和2047(2進位全為1)是特殊值)。浮點小數計算時,指數值減去偏正值將是實際的指數大小。

浮點數的比較

浮點數基本上可以按照符號位、指數域、尾數域的順序作字典比較。顯然,所有正數大于負數;正負號相同時,指數的二進制表示法更大的其浮點數值更大。

浮點數的舍入

任何有效數上的運算結果,通常都存放在較長的寄存器中,當結果被放回浮點格式時,必須將多出來的比特丟棄。 有多種方法可以用來運行舍入作業,實際上IEEE標準列出4種不同的方法:

舍入到最接近:舍入到最接近,在一樣接近的情況下偶數優先(Ties To Even,這是默認的舍入方式):會將結果舍入為最接近且可以表示的值,但是當存在兩個數一樣接近的時候,則取其中的偶數(在二進制中是以0結尾的)。
朝+∞方向舍入: 會將結果朝正無限大的方向舍入。
朝-∞方向舍入: 會將結果朝負無限大的方向舍入。
朝0方向舍入: 會將結果朝0的方向舍入。

浮點數的運算與函數
標準運算

下述函數必須提供:

建議的函數與謂詞

精度

在二進制,第一個有效數字必定是“1”,因此這個“1”并不會存儲。

討論一

單精和雙精浮點數的有效數字分別是有存儲的23和52個位,加上最左手邊沒有存儲的第1個位,即是24和53個位。

log?224=7.22\log 2^{24}=7.22log224=7.22
log?253=15.95\log 2^{53}=15.95log253=15.95
由以上的計算,單精和雙精浮點數可以保證7位和15位十進制有效數字。

討論二

C++語言標準定義的浮點數的十進制精度(decimal precision):十進制數字的位數,可被(浮點數)表示而值不發生變化[3]。C語言標準定義的浮點數的十進制精度為:十進制數字的位數q,使得任何具有q位十進制數字的浮點數可近似表示為b進制的p位數字并且能近似回十進制表示而不改變這q位十進制數字[4]

但由于相對近似誤差不均勻,有的7位十進制浮點數不能保證近似轉化為32比特浮點再近似轉化回7位十進制浮點后保持值不變:例如8.589973e9將變成8.589974e9。這種近似誤差不會超過1比特的表示能力,因此(24-1)*std::log10(2)等于6.92,下取整為6,成為std::numeric_limits::digits10以及FLT_DIG的值。std::numeric_limits::max_digits10的值為9,含義是必須9位十進制數字才能區分float的所有值;也即float的最大表示區分度。

類似的,std::numeric_limits<double>::digits10或DBL_DIG是15, std::numeric_limits<double>::max_digits10是17

例子

以下的C++程序,概略地展示了單精和雙精浮點數的精度。

#include <iostream>int main () {std::cout.precision(20);float a=123.45678901234567890;double b=123.45678901234567890;std::cout << a << std::endl;std::cout << b << std::endl;return 0; }// Xcode 5.1 // Output: // 123.456787109375 // 123.45678901234568059 // Program ended with exit code: 0

全文由維基百科翻譯-- 維基百科,自由的百科全書

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的IEEE 754标准--维基百科的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。