女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

定點數和浮點數的概念 浮點數二進制序列與指數表達式之間的轉化

CHANBAEK ? 來源:工程實驗室 ? 作者:工程實驗室 ? 2023-08-22 16:06 ? 次閱讀

1、定點數和浮點數的概念

定點數,小數點位置固定不變,參與運算的數據其小數點固定的位于所有數字中間的某個位置,比如貨幣的表達,規定了使用2位整數位+2位小數表示的模式,具體數據如99.00、10.55、68.66等。定點數的缺點:由于小數點位置固定不變,定點數所表示的數的范圍非常有限,不能同時表達特別大或特別小的數,所以才出現了浮點數,以此來擴充數的范圍,同時浮點數也廣泛應用于精度要求高的場合。簡單的理解浮點數:首先浮點數小數點位置不固定,小數點是浮動的,其次浮點數提供了一種高效的數據表達方法,這種表示方法既可以表達很小的數據比如:3.14159、0.06789,也可以表達很大的數據比如:8.99910^20、510^25。

數據在計算機中的存儲分為整型(char(8bit)、short(16bit)、int(32bit)、long(32bit)、long long(64bit))和浮點型(float(32bit)、double(64bit)),計算機中不可能存儲“無窮大”的數,也不能存放循環小數。(注:循環小數按照浮點數的規則存儲),例如C程序中計算和輸出1/3:

printf("%f",1/3.0);

得到的結果是:0.333333,只能得到6位小數,而不是理論計算的無窮位的小數。

查看我們在C語言課本上學習過的知識點:

圖片

圖1-1、C語言中的浮點數數據類型

2、浮點數的結構

通過圖1-1,我們知道單精度浮點數(float)的取值范圍為:-3.4E38 - -3.4E38,雙精度浮點數(double)的取值范圍是:-1.7E308 - 1.7E308,精度再高一些表示為:-1.79E308 - 1.79E308。C語言中定義相應的浮點數float和double變量以后,在編譯器的幫助下即可參與相應的運算,那么浮點數的內部結構又是如何呢?下文將詳細講解。

float   a = 4.5;
double  b = 3.5e2,c;
c =  a*b;

在IEEE754標準中規定了浮點數的表達方式,浮點數的存儲方式是以2為底數的表達方式。浮點數的表達中將數據表達的二進制序列分為符號位,指數位和小數位三個區域。浮點數的指數表達式如下:

x =-1^s *1.m* 2^e;
表達32bit的浮點數時e = E-127;表達64bit的浮點數時e = E-1023,這里的1271023稱為偏移量。
公式中:
s表示符號位:正數為0,負數為1e表示指數位:存儲指數加上偏移量,偏移量是為了表達負數而設計的;
m表示小數部分:存儲小數部分的準確值或者接近的值;
注:類比科學計數法,以10為底數的表示方法中前面的系數都是小于10 的系數比如:8.bb*10^(x);以2為底數的表示方法,前面的系數都是小于2的系數,比如:1.bb*2^(x),前面還要符號位(-1)^s

浮點數的二進制序列表達式中特定寬度的區域劃分如下:

圖片

圖2-1、不同精度浮點數特定寬度區域劃分

3、浮點數二進制序列與指數表達式之間的轉化

比如10進制表示的小數0.085(我們常說的小數在計算機存儲系統中就是浮點數),其指數表達式為1.36*2^-4,其小數部分0.36使用了23位來表示。

圖片

圖3-1、10進制小數與指數表達式的關系

Matlab中,將浮點數轉化為16進制序列

>> a=single(0.085)
a =
  single
    0.0850
 >> num2hex(a)
ans =
3dae147b

將十六進制序列 3dae147b(H)轉化為二進制序列

001111011010111000010100011110(32bit:1位符號位+8位指數位+23位小數位)

符號位:0,表示正數;

指數部分:01111011,12^0+12^1+02^2+12^3+12^4+12^5+1*2^6 = 123;

小數部分:010111000010100011110,通過表3-1來拆分每個比特位所表達的數值。

第n位2的冪次:2^(-n)10進制表示求和
11/2-2^(-1)0*2^(-1)=00
21/4-2^-21*0.250.25
41/161*0.06250.3125
51/321*0.031250.34375
61/641*0.0156250.359375
111/20481*0.00048828125......
131/8192............
171/131072............
181/262144............
191/524288............
201/1048576............
221/4194304............
231/8388608......0.36000001430512

表3-1、小數部分二進制序列拆分

綜上:單精度浮點數0.085,使用指數表示的結果為:

(-1)^01.362^-4=1.36*2^-4,其中指數部分 e=123-127= -4,小數部分的0.36是23位二進制序列所表達的數值之和。

3.1、數據轉化舉例:

問題1: 十進制表達的小數0.1254,(1)、求64bit雙精度浮點數的標準16進制序列,(2)、用指數形式表示。

>>  a=double(0.1254)
a =
    0.1254
 >>  num2hex(a)
ans =
    '3fc00c435bd31c33'

雙精度浮點數16進制序列為:64’h3fc00c435bd31c33

將16進制數展開后,可得二進制數格式為

0011 1111 1100 0000 0000 1100 0100 0011 0101 1011 1101 0011 0001 1100 0011 0011

符號位: bit[63] ------1位-----0---正數

指數部分: bit[62]-[52]------11位--011 1111 1100

指數部分求解十進制結果:

> > 1*2^9+1*2^8+1*2^7+1*2^6+1*2^5+1*2^4+1*2^3+1*2^2
ans =
        1020
1020-1023=-3,浮點數的指數部分數值-減去偏移量,得到實際指數表達式中的指數為-3。

小數部分:bit[51]-[0] - 共52bit:

0000 0000 1100 0100 0011 0101 1011 1101 0011 0001 1100 0011 0011

求53bit二進制序列所表示的小數:

1*2^(-9)+1*2^(-10)+1*2^(-14)+1*2^(-19)+1*2^(-20)+1*2^(-22)+1*2^(-24)+1*2^(-25)+1*2^(-27)+1*2^(-28)+1*2^(-29)+1*2^(-30)+1*2^(-32)+1*2^(-35)+1*2^(-36)+1*2^(-40)+1*2^(-41)+1*2^(-42)+1*2^(-47)+1*2^(-48)+1*2^(-51)+1*2^(-52)
> > 1*2^(-9)+1*2^(-10)+1*2^(-14)+1*2^(-19)+1*2^(-20)+1*2^(-22)+1*2^(-24)+1*2^(-25)+1*2^(-27)+1*2^(-28)+1*2^(-29)+1*2^(-30)+1*2^(-32)+1*2^(-35)+1*2^(-36)+1*2^(-40)+1*2^(-41)+1*2^(-42)+1*2^(-47)+1*2^(-48)+1*2^(-51)+1*2^(-52)
ans =
    0.0030

得到浮點數的指數表達式:1.0030*2^(-3)。

驗證計算結果如下:

>> 1.0030*2^(-3)
ans =
    0.1254

Matlab中浮點數轉為十進制數:

>> a='3fc00c435bd31c33'
a =
'3fc00c435bd31c33'
 >> hex2num(a)
ans =
    0.1254

問題2十進制表達的整數-5,(1)、求32bit單精度浮點數的標準16進制序列,(2)、用指數形式表示。

>> a=single(-5)
a =
  single
    -5
 >> num2hex(a)
ans =
c0a00000

-5的浮點數表示為:

1100 0000 1010 0000000000000000000000

符號位:bit[31] --1位--1--負數

指數位:bit[30]-[23]--8位--10000001

>> 1*2^7+1*2^0
ans =
   129
指數數值-減去偏移量,得到指數為:129-127=2

小數位:bit[22]-[0]-23位:

0100000000000000000000000,

>> 0*2^-1+1*2^-2
ans =
    0.2500

所以-5的指數表達式為:(-1)1.252^2。

驗證計算結果如下:

>> -1*1.25*2^2
ans =
    -5

4、小數轉化為定點數

FPGA 設計開發的過程中,如果需要使用小數參與相關運算,這個時候就需要將小數轉化為定點數,因為FPGA內部只能處理定點數,不能處理小數,小數轉定點數的過程需要考慮符號位-整數位寬-小數位位寬。

假設將小數2.918量化為16bit的定點數,包含1bit符號位,3bit整數位,12bit小數位。16位數據能夠表示的最大正數為32767(2^15-1),能夠表示的最小負數為-32768。

圖片

圖4-1、C語言中部分數據類型對應的取值范圍

3bit整數位能夠表示的最大整數是7(3'b111),12位小數位能夠表示的數據的最小精度為:1/(2^12)=0.00024414,也就是說12位小數位只能表示0.00024414的整數倍,12位小數位能夠表達的最大小數為:

>> (2^12-1)*0.00024414
ans =
    0.9998

可以發現表示小數的位數越多,可以表示的小數范圍越大,表示的也越精準。(小數定點量化過程中使用位寬的大小和數據精度的關系),表示小數部分0.918,需要的十進制數值為:

>> 0.918/0.00024414
ans =
   3.7601e+03

也可以使用Matlab中的函數完成小數部分的量化。

>>  dec2bin(round(0.918*2^12),12)
ans =
111010110000
 >> bin2dec('111010110000')
ans =
        3760

所以小數2.918量化為16bit的定點數結果為:16'b0100111010110000

問題 :將浮點數-3.125量化為8bit的定點數,包含1bit符號位,4bit整數位,3bit小數位。

方法1 :針對負數-3.125,首先考慮其絕對值3.125,其符號位和整數部分5bit數據為:5'b00011,小數部分為0.125量化的結果為:

>> dec2bin(round(0.125*2^3),3)
ans =
001

所以,絕對值3.125量化8bit的結果為:8'b00011001

因為是負數,需要求其補碼,求補碼:按位取反再加1,

得到:8'b11100111,

方法2 :8bit能夠表示的最大的數據是2^8,量化后的二進制數據中包含3位小數位,計算過程中需要修正,使用公式如下:

> > dec2bin(round(2^8-abs(-3.125)*2^3),8)
ans =
11100111

得到量化后的結果為:8'b11100111。

5、ISE中使用float-point 核

將32bit的整數1234567890轉化為雙精度的浮點數。

調用floating-point-IP核并配置參數;

圖片

輸入的定點數據選擇自定義模式;設置為32bit整數位 - 0bit小數位,表明輸入數據只要整數位沒有小數位。圖片

設置轉化后的浮點數為double 型;

圖片

后面的設置- 保持默認 -- 點擊 Generate圖片

verilog代碼實現如下:

module signed_2_floating(
input      wire                     sclk,
input      wire                     rst_n,
input     signed  [31:0]            data_in,
input      wire                     valid_in,
output     wire  [63:0]             floating_data,
output     wire                     valid_out


  );
reg  signed [63:0]                  floating_data_temp;
reg                                 valid_out_tmp;
// IP 核信號      
reg               data_in_tvalid;
wire              data_in_tready;
wire              result_dout_tvalid;


reg               result_dout_tready;
wire  [63:0]      result_dout_tdata;  
assign     floating_data      =      floating_data_temp;
assign      valid_out         =      valid_out_tmp ;
// data_in_tready 由IP核拉高---valid_in信號有效時--觸發data_in_tvalid-開始啟動計算 
always@(posedge sclk or negedge rst_n)                 
begin
  if(~rst_n)  begin
     data_in_tvalid    <=   1'b0;
  end
  else if(data_in_tready  &&  valid_in )  begin     
     data_in_tvalid   <=    1'b1;            
  end    
  else
  begin
     data_in_tvalid    <=   1'b0;
  end
end
// result_dout_tvalid - 信號由IP核輸出--當檢測到result_dout_tvalid 有效以后,用戶端的ready信號再拉高
always@(posedge sclk or negedge rst_n)
begin
  if(~rst_n)
  begin
    result_dout_tready   <=  1'b0;
  end
  else if(result_dout_tvalid)           
  begin
    result_dout_tready   <=  1'b1;         
  end
  else
  begin
    result_dout_tready   <=  1'b0;           
  end
end
 // result_dout_tready 信號 和 result_dout_tvalid 信號都有效,開始讀取數據。
always@(posedge sclk or negedge rst_n)
begin
  if(~rst_n)
  begin
    floating_data_temp    <=   64'd0;
    valid_out_tmp         <=   1'b0;    
  end
  else if(result_dout_tready && result_dout_tvalid)      
  begin
    floating_data_temp    <=    result_dout_tdata;
    valid_out_tmp         <=    1'b1;    
  end
  else
  begin
    floating_data_temp    <=    floating_data_temp;
    valid_out_tmp         <=     1'b0;        
  end
end


fixed_2_floating       floating_instance_name (
  .aclk(sclk),                                                // input aclk
  .s_axis_a_tvalid(data_in_tvalid),                           // input s_axis_a_tvalid
  .s_axis_a_tready( data_in_tready ),                         // output s_axis_a_tready
  .s_axis_a_tdata(data_in ),                                  // input [31 : 0] s_axis_a_tdata
  .m_axis_result_tvalid(result_dout_tvalid),                  // output m_axis_result_tvalid
  .m_axis_result_tready(result_dout_tready),                  // input m_axis_result_tready
  .m_axis_result_tdata(result_dout_tdata)                     // output [63 : 0] m_axis_result_tdata
);
endmodule

仿真結果展示:

圖片

驗證結果:

>> a=double(1234567890)
a =
   1.2346e+09
 >> num2hex(a)
ans =
41d26580b4800000

在Matlab中,將定點數轉化為浮點數的結果和ISE中調用IP核計算的結果一致。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 二進制
    +關注

    關注

    2

    文章

    803

    瀏覽量

    42122
  • C語言
    +關注

    關注

    180

    文章

    7629

    瀏覽量

    140159
  • 十進制
    +關注

    關注

    0

    文章

    67

    瀏覽量

    13461
  • 浮點數
    +關注

    關注

    0

    文章

    61

    瀏覽量

    16071
  • 數據類型
    +關注

    關注

    0

    文章

    237

    瀏覽量

    13808
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    浮點數定點數

    本帖最后由 gk320830 于 2015-3-5 23:17 編輯 數制,浮點數定點數的文檔,上數電時老師給的。有興趣的同學可以來看看
    發表于 03-27 21:31

    【安富萊——DSP教程】第7章 DSP定點數浮點數(重要)

    第7章DSP定點數浮點數(重要) 本期教程主要跟大家講解一下定點數浮點數的基礎知識,了解這些基礎知識對于后面學習ARM官方的DSP庫大有裨益。特別是初學的一定要理解這些基礎知識。
    發表于 06-03 11:47

    第7章 DSP定點數浮點數

    表達是基于二進制的。從上面的表達式,我們可以知道,二進制數同樣可以有小數點,也同樣具有類似于十進制表達
    發表于 09-22 13:02

    定點數浮點數的區別是什么

    的傅里葉變換后的數據,那么,選擇正確的處理方式時,首先要解決的是定點數浮點數的問題。如果使用過單片機的同學,一定會知道定點運算和浮點運算兩個概念
    發表于 02-21 07:22

    功能:雙字節十六進制定點數轉換成格式化浮點數

    功能:雙字節十六進制定點數轉換成格式化浮點數 入口條件:雙字節定點數的絕對值在[R0]中,數符在位1FH中,整數部分的位數在A中。
    發表于 01-19 22:45 ?3377次閱讀

    浮點數的表示方法

    浮點數的表示方法  浮點數,是指小數點在數據中的位置可以左右移動的數據。它通常被表示成:    N = M* RE  這里的M(Mantissa)被稱為浮點數
    發表于 10-13 17:13 ?1.7w次閱讀
    <b class='flag-5'>浮點數</b>的表示方法

    在FPGA里浮點數定點數表示法原理展示

    浮點數定點數表示法是我們在計算機中常用的表示方法 所以必須要弄懂原理,特別是在FPGA里面,由于FPGA不能像在MCU一樣直接用乘除法。 首先說一下簡單的定點數定點數是克服整
    發表于 11-18 02:15 ?9014次閱讀
    在FPGA里<b class='flag-5'>浮點數</b>與<b class='flag-5'>定點數表</b>示法原理展示

    單片機浮點數運算的源碼設計

    單片機執行程序的過程,實際上就是執行我們所編制程序的過程。即逐條指令的過程。本文詳細介紹了浮點數在單片機中的表示方式和匯編子程序,浮點數定點數加減法要困難,但是克服了定點數表示范圍小
    的頭像 發表于 03-07 15:19 ?1.1w次閱讀
    單片機<b class='flag-5'>浮點數</b>運算的源碼設計

    Xilinx怎么定點數浮點數

    轉化為的浮點數可以是單精度也可以是雙精度。
    發表于 07-05 08:09 ?3990次閱讀
    Xilinx怎么<b class='flag-5'>定點數</b>轉<b class='flag-5'>浮點數</b>

    浮點數在內存中的存儲

    浮點數在內存中的存儲和整數不同,因為整數都可以轉換為一一對應的二進制數據。而浮點數的存儲是由符號位 (sign) + 指數位 (exponent) + 小數位 (fraction) 組
    的頭像 發表于 09-20 10:52 ?4288次閱讀
    <b class='flag-5'>浮點數</b>在內存中的存儲

    定點數浮點數在STM32單片機中使用傅里葉(FFT)變換的理解

    的傅里葉變換后的數據,那么,選擇正確的處理方式時,首先要解決的是定點數浮點數的問題。如果使用過單片機的同學,一定會知道定點運算和浮點運算兩個概念
    發表于 12-24 19:22 ?16次下載
    <b class='flag-5'>定點數</b>和<b class='flag-5'>浮點數</b>在STM32單片機中使用傅里葉(FFT)變換的理解

    PLC中浮點數二進制表示

    我們日常使用的各類數據,都是以二進制的方式存儲的。以浮點數為例,在PLC中其表示方式使用了IEEE 754標準。許多編程語言中浮點數的實現也遵循該標準。
    的頭像 發表于 03-23 13:50 ?6252次閱讀
    PLC中<b class='flag-5'>浮點數</b>的<b class='flag-5'>二進制</b>表示

    單精度和雙精度浮點數的區別

    。 單精度浮點數,也稱為單精度浮點數格式,用于在計算機中表示32位二進制格式的浮點數。一個單精度浮點數由三個部分組成:符號位、
    的頭像 發表于 12-15 10:25 ?6017次閱讀

    modbus浮點數怎么讀取

    常重要的。 首先,要理解Modbus浮點數的表示方式。在Modbus協議中,浮點數采用了IEEE 754標準進行編碼和解碼。IEEE 754標準定義了浮點數二進制表示方法,包括符號位
    的頭像 發表于 12-28 14:38 ?7665次閱讀

    一文帶你秒懂IEEE 754浮點數

    一、簡介1、常見的浮點數表示方式是IEEE754標準,它規定了浮點數的存儲格式和運算規則,這個標準定義了兩種浮點數表示:單精度和雙精度。2、任何一個浮點數
    的頭像 發表于 03-18 08:09 ?1w次閱讀
    一文帶你秒懂IEEE 754<b class='flag-5'>浮點數</b>