1. 程式人生 > >IEEE浮點數表示

IEEE浮點數表示

IEEE浮點標準:V=(-1)^s*M*2^E

1.符號(sign)s決定這個數是負數(s=1)還是正數,0(s=0)。
2.尾數(significand) M是一個二進位制小數.
3.階碼(exponent)E對浮點數加權。
單精度,雙精度的表示如下:
exp為階碼,frac為尾數

給定了位表示,根據exp的值,被編碼的值可以分為三種情況:

規格化的表示一般的數,非規格化的表示靠近0的數或0,階碼都為1的,當尾數為0時表示無窮大(即溢位),階碼都為1的,當尾數不為0時表示不存在的數,例如-1開根號之類的。
規格化的數階碼欄位被解釋為以偏置(biased)形式表示的有符號整數。其實就是一個無符號數e,在進行運算時將E=e-Bias,Bias為偏移量(2^(k-1)-1)。小數字段frac表示為0<frac<1

,小數點前的1預設存在不寫,尾數M=1+frac。
非規格化的數,階碼全為0,階碼值為E=1-Bias,這是為了讓數從非規格化的數到規格化的數(開始也為1-Bias)時能平滑轉換。
無窮大,階碼全1,小數全0。s=0時,表示正無窮,s=1時,表示負無窮。也可表示溢位,兩個數很大相乘時,或除以0時。
NaN,階碼全1,小數非0時。一些運算結果不是實數或無窮就返回NaN,也可表示未初始化的資料。

例子

很有趣的現象,將正浮點數的位級表達解釋為無符號整數,它們是按升序排列的,負浮點數則為降序。

舍入
舍入包括四種:向上舍入,向下舍入,向0舍入,向偶數舍入。
1.向上舍入是指每次舍入都進位,如1.4->2,1.5->2,-1.4 -> -1;
2.向下舍入是指每次舍入都向下舍入,如1.4->1,1.5->1,-1.5->-2;
3.向0舍入是指正負數都向0方向舍入,如1.4->1,1.5->1,-1.5->-1;
4.向偶數舍入指向上或者向下舍入,儘量使結果的最低有效數字為偶數,也就是向最靠近的數舍入,如1.5->2,1.4->1,2.5->2,-1.5->-2。

向偶數舍入有一點比較難理解:
**數字最低位有效位為偶數時就不用考慮低位進位了嗎?
其實不然,如1.2453000精確到百分位,用向偶數舍入得到1.25。也就是說當某個數不是可能精確值的中間值時,優先考慮低位進位情況,在這個例子中1.24、1.25為可能的精確值,1.2453000顯然不是這兩個數的中間值,所以優先考慮後面的進位情況。當這個數為中間值時,優先考慮最低位有效位是否為偶數,是則捨去後面的,如1.245000->1.24,不是則考慮低位進位,如1.235000->1.24。

向偶數舍入也被用於浮點數中,二進位制的0為偶數,1為奇數。道理和上面一致。非中間值,考慮低位進位,如10.00110->10.01(保留2位小數),中間值,考慮最低位有效位,如10.10100->10.10(保留2位小數)

浮點運算

浮點加法
IEEE規定,1/-0將產生負無窮大,1/+0將產生正無窮大。
實數的加法也形成了阿貝爾群,但我們必須考慮舍入對這些屬性的影響。x + y= y+x,這個運算是可交換的,但不可結合的。如,(3.14+1e10)求值為0.0——因為舍入,值3.14丟失了。而3.14+(1e10-1e10)為3.14。
作為阿貝爾群,大多數浮點數都是有逆元的,但無窮和NaN是除外的,正無窮+負無窮=NaN,NaN+x=NaN。
此外,浮點加法滿足單調性屬性:如果a>=b,那麼對於任意a,b以及x,除了NaN(個人感覺無窮也應該除外),都有x+a>=x+b。無符號或補碼加法不具有該屬性。

浮點乘法
浮點乘法遵循通常乘法的所具有的許多特性。浮點乘法是封閉的(即使可能產生無窮大和NaN),它也是可交換的,並且它的乘法單位元為1.0。不具備可結合性,如在單精度浮點下,(1e20*1e20)le-20為正無窮大,而1e20(1e20*1e-20)為1e20。此外,浮點乘法在加法上不具備分配性,如在單精度浮點數下,1e20*(1e20-1e20)為0.0,而1e20*1e20-1e20*1e20為NaN。
此外,對於任何a,b和c,並且a,b,c都不等於NaN,浮點乘法滿足下列單調性:
只要a不等於NaN,就有a*a>=0。
無符號或補碼的乘法沒有這些單調性。

相關推薦

float與 double型數據存儲---IEEE點數表示

0.12 理解 float 標準 顯示 運算 details .com c/c++ 目前C/C++編譯器標準都遵照IEEE制定的浮點數表示法來進行float,double運算。 這種結構是一種科學計數法,用符號、指數和尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2

IEEE點數表示

IEEE浮點標準:V=(-1)^s*M*2^E 1.符號(sign)s決定這個數是負數(s=1)還是正數,0(s=0)。 2.尾數(significand) M是一個二進位制小數. 3.階碼(exponent)E對浮點數加權。 單精度,雙精度的表示如下

深入理解計算機系統 2.4.2 IEEE表示詳細講解

定義 IEEE浮點標準用以下公式表示\(V = (-1)^s * M * 2^E\) 符號(sign):s決定這書是負數(s = 1)還是正數(s = 0),而對於數值0的符號位解釋作為特殊情況處理 。 尾數(significand):M是一個二進位制小數,它的範圍是\

IEEE表示

IEEE浮點表示 觀察IEEE浮點表示 工作中遇到過整型轉浮點型(union那種轉換),碰到就看下書,過後就遺忘了。等過段時間又出現此現象,又重新拿起書本,這次記錄了過程。然而一直等到今天才寫出來,以防以後還用到,如果能幫助到你就更好了。

機器中的點數表示

       在初學C語言時,一直體會不到所謂的浮點數容易造成誤差,最近看到一篇關於浮點數的文章,加上現在的學習,對浮點數的內部儲存方式有了更加深入的理解,於是也漸漸理解了浮點數的誤差。         相比int等整型,float等浮點型別的表示和儲存較為複雜,但它又是一

計組—點數表示和運算

浮點數的表示 科學計數法 任意一個十進位制數N可以寫成: 同樣,在計算機中一個任意進位制數N可以寫成 在計算機的世界裡R預設是2,表示二進位制,因此R在計算機中不用單獨儲存,而M和e需要單獨儲存 尾數(M):用定點小數表示,給出有效數字的位數,決定了浮點

-1.1的點數表示(IEEE754標準)

‐1.1 = ‐1.00011 [0011]...B = ‐1.00011001100110011001100B(注:尾數取 23 位) 符號位 S = 1,階碼 exp= 0 + 127 = 0111 1111,尾數:00011001100110011001100 則其

java 點數表示詳解及解決方法(例項函式)

定點數表達法的缺點在於其形式過於僵硬,固定的小數點位置決定了固定位數的整數部分和小數部分,不利於同時表達特別大的數或者特別小的數。 計算機系統採納了所謂的浮點數表達方式。這種表達方式利用科學計數法來表達實數,即用一個尾數(Mantissa也叫有效數字 ),一個基數(Base

IEEE754標準點數表示與舍入

原文地址:[https://blog.fanscore.cn/p/26/](https://blog.fanscore.cn/p/26/) > 友情提示:本文排版不太好,但內容簡單,請耐心觀看,總會搞懂的。 # 1. 定點數 對於一個無符號二進位制小數,例如`101.111`,如果我們要用2個位元組

IEEE 754 點數表示精度探討

選擇 固定 images 方向 post 可用 分用 lan text IEEE 754 浮點數的表示精度探討 前言 從網上看到不少程序猿對浮點數精度問題有非常多疑問,在論壇上發貼詢問。非常多熱心人給予了解答,但我發現一些解答中有些許小的錯誤和認識不

計算機中點數表示IEEE 754標準

IEEE Standard for Floating-Point Arithmetic(IEEE 754,Institute of Electrical and Electronics Engineers)是1985年建立的浮點數計算的技術標準。解決了原來浮點數實現不一致的問題,許多硬體

點數在計算機中的二進位制表示IEEE 754 標準)

十進位制,二進位制轉換相關知識參考: 原碼,反碼,補碼,移碼相關知識參考: 想知道浮點數在計算機中的二進位制表示,先讓我們瞭解一下浮點數是怎麼用十進位制表示的。 浮點數的十進位制表示一般使用的是科學計數法。 科學記數法是一種記數的方法。把一個數表示成a與1

點數的二進位制表示(IEEE 754標準)

浮點數是我們在程式裡常用的資料型別,它在記憶體中到底是怎麼樣的形式存在,是我瞭解之前是覺得好神奇,以此記錄,作為學習筆記。現代計算機中,一般都以IEEE 754標準儲存浮點數,這個標準的在記憶體中儲存的形式為:對於不同長度的浮點數,階碼與小數位分配的數量不一樣,如下:對於32

IEEE 754——計算機中點數表示方法

楔子 #include <iostream> int main(int, char**) { std::cout.precision(20); float a = 123.45678901234567890;

點數的二進制表示

命令 如果 initial 計算機 做的 大於 round 得到 pre 轉載自:http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html   前幾天,我在讀一本C語言教

cout<<fixed表示按一般方式輸出點數

AI pan bsp style int double spa end turn int main() { double num=0.00001; cout<<num<<endl; cout<<fixe

JVM之點數(float)表示

img 但是 nbsp alt 符號 否則 形式 十進制 浮點數 1. 浮點數的組成:符號位、指數位、尾數位。  1.1 符號位: 占1位,表示正負數; 1.2 指數位: 占8位; 1.3 尾數位: 占23位。 2. 浮點數的表示: 2.1

點數是如何表示

如何編碼浮點數?我們知道計算機表示的任何資訊都是一串bit,具體內容決定於如何解釋。IEEE浮點標準用 V = (-1)^s * M * 2^E 的形式來表示一個數。s表示符號(1表示負,0表示正); M表示尾數,二進位制小數,取值範圍為1~2或者0~1,不包括上限值;E表示階碼

為什麼能精確表示點數有效位數是7位

首先明確,7位有效位是整數部分和小數部分位數的和。例如: float a=61.420001f。列印輸出a=61.420002(62.420001機器無法表示,會自動向最近的能表示的數舍入成61.420001)   (整數部分2位+小數部分6位=8位>7位,所以

點數在記憶體中的表示

根據國際標準IEEE 754,任意一個二進位制浮點數V可以表示成下面的形式: (1)(-1)^s表示符號位,當s=0,V為正數;當s=1,V為負數。 (2)2^E表示指數位。 (3)M表示有效數字,大於等於1,小於2。 IEEE 754規定,對於32位的浮點數,最高的1位是符號位s,