1. 程式人生 > >浮點運算和位元組對齊

浮點運算和位元組對齊

       又到了寫部落格的時間了,今後堅持天天寫一篇,把心得體會分享給大家。

       今天再講一個和位元組對齊、浮點運算相關的案例。大家先看下面的程式:本意是要將一個訊號從uw換算為dbm,公式已經簡化了,大家不要深究這個公式,而是要關注這個浮點運算。下面的程式碼可以在VC 6.0中編譯通過並執行沒有問題。這裡註明下,我每次都用VC6.0作為例子只是用來說程式的編譯沒有問題哈,這裡不是攻擊VC 6.0太普通哈,呵呵。

        但是在嵌入式系統比如PPCXXXCPU方案的系統中,該程式也可以編譯通過並載入成功,但是執行是就會出現系統復位。這是為什麼?

        經過長時間的定位、思考可能都不一定能找到答案。我在這裡也不賣關子了,直說了吧。

       我們知道浮點運算是很複雜的,從其數值在記憶體中的表示到運算都是有特殊的規定的,記憶體中的儲存是通過指數形式儲存的,有符號位、指數等,這個知識點這裡不展開,百度下有很多結果。但是在運算的時候,每個cpu方案的實現都不同,都有特殊的限制。大體上來說分為硬浮點或者軟浮點運算來實現最終的浮點運算。其中硬浮點效率高,計算速度快,軟浮點計算效率低,速度慢。一般來說軟浮點對程式沒有什麼限制,但是硬浮點則有限制,比如:對儲存浮點的記憶體起始地址則必須為4位元組整數倍等。

這裡的問題就是這個原因造成的。我們可以的看到,結構體RX_PWR是單位元組對齊的,成員 fDbm 的起始地址是3,不是4的整數倍,所以這段程式碼跑在硬浮點計算時有4位元組對齊需求的CPU上時,CPU會丟擲異常,引發系統復位。

那麼這裡怎麼避免這種問題?

解決方案就是對結構體進行四位元組對齊處理。別說這個大家不知道怎麼做哈 如果有需求大家吱一聲 我後面在說說這個對齊

總結一句話:在浮點運算的時候,大家要注意系統的CPU是否有特殊的要求,如果有則一定要遵守。

更高階的想法是:為了增強軟體的可移植性,我們怎麼才能兼顧所有型別的CPU?這裡先拋個磚。

太晚了,先寫到這裡,明天去體檢。

#pragma pack(1)
typedef struct tagSignal
{
 unsigned short usSignal;
 float   fDbm;
}RX_PWR;

RX_PWR stRxpwr = {0};
#pragma pack()

extern void uw2dbm(unsigned short usSignal,float *pfdbm);

extern void swap(char &a,char &b);

int main(int argc, char* argv[])
{
 unsigned short usTemp = 1000;

 stRxpwr.usSignal = usTemp;
 
 uw2dbm(usTemp,&stRxpwr.fDbm);

 printf("\r\n signal in uw :%d in dbm:%f \r\n",stRxpwr.usSignal,stRxpwr.fDbm);

}

void uw2dbm(unsigned short usSignal,float *pfdbm)
{
 *pfdbm = 10*log10(usSignal);
 return;
}

相關推薦

運算位元組

       又到了寫部落格的時間了,今後堅持天天寫一篇,把心得體會分享給大家。        今天再講一個和位元組對齊、浮點運算相關的案例。大家先看下面的程式:本意是要將一個訊號從uw換算為dbm,公式已經簡化了,大家不要深究這個公式,而是要關注這個浮點運算。下面的程式碼

32、64位編譯器各型別大小位元組

32位編譯器:32位系統下指標佔用4位元組       char:1個位元組       char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bi

pandas之算數運算資料--帶有重複值的軸索引

s1=Series([7.3,-2.5,3.4,1.5],index=['a','c','d','e']) s2=Series([-2.1,3.6,-1.5,4,3.1],index=['a','c','e','f','g']) s1 s2 s1+s s1+s

C 構造型別 陣列、列舉、聯合體、結構體(位段) 位元組 大小端儲存

列舉 .列舉:被命名的標籤常量(對事物的列出) ---型別的構造------- enum key{    UP,                             //成員<標籤常量:預設第一個為0 後一個總是前一個的值加一>    DOWN,    L

js運算精度問題IEEE754

原文連結 當我們使用一段時間的JS之後會遇到下面這個問題 0.1 + 0.2 === 0.3 // false 我們可以在控制檯裡面看到0.1+0.2輸出的並不是0.3而是0.30000000000000004。那麼為什麼出現這樣的問題呢。 其實

結構體聯合體的位元組問題

為了提速之類的,在結構體和聯合體的記憶體塊中,是按照一定的規則安排的 聯合體: 聯合體的記憶體不會為了所有成員安排,而是隻取最大的成員的所需記憶體大小,每次只能使用其中一個成員。但是有一個問題: typedef union { char a; int[5] b;

C語言中的位元組程式的影響以及位段的定義

C語言中的位元組對齊和對程式的影響 位元組對齊的概念 位元組對齊對程式的影響 #pragma指令設定 位元組對齊 編譯器對位元組對齊的原則 位元組對齊的程式設計設定 位段定義 位元組對齊的概念:

linuxwindows gcc g++ vc編譯器位元組

首先可以肯定的說,肯定和編譯器有關,vc編譯器和gcc,g++編譯器肯定不一樣,不說明是什麼編譯器什麼系統下問你結構體長度就是在耍流氓。 (1)vc編譯器下結構體成員首地址地址必須被該結構體成員長度整除,打個比方,double a的首地址如果為0x06, 那是不行的,再填2

C++ 位元組的總結(原因作用)

  現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何地址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體地址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。 位元組對齊的原因和作用   各個硬體平臺對儲

c++ 比較運算

要點:       float:32位       double 64 位       long double 96 或者128位 標準認為:       float  至少為6位有效數字。       double 至少為10位有效數字。       long doubl

c語言中運算的infnan錯誤

============================================ 作者:yuanlulu http://blog.csdn.net/yuanlulu 版權沒有,但是轉載請保留此段宣告 ===============================

C#中struct的位元組、轉換操作複製為二進位制資料(byte[])

在做C#與其它程式通訊的系統時,往往會使用struc操作結構化的資料(如資料包等)。 本文簡要提出一些使用思路,歡迎各位大牛賜教。 一、STRUCT結構設計 當資料的結構確定時,總結為下面兩種情況: 1、資料長度確定(包括字串): 此時可以直接利用struct

關於位元組程式優化有關 值得一看

一.什麼是位元組對齊,為什麼要對齊    現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何地址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體地址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的一個

Windows下structunion位元組設定以及大小的確定(一 簡介結構體大小的確定)

在windows下設定位元組對齊大小的方式,目前我瞭解有三種: 1. 在編譯程式時候的編譯選項  /Zp[n],如 cl /Zp4 表示對齊大小是4位元組; 2. 預處理命令   #pragma pack( [ show ] | [ push | pop ] [, ide

圖解計算機中的數值範圍運算

## 寫在前面 在【程式設計師進階系列】專題的《[圖解計算機中資料的表示形式](https://mp.weixin.qq.com/s?__biz=Mzg4MjU0OTM1OA==&mid=2247490388&idx=1&sn=1805a62814452c598c567e65de27

label按鈕文字

idt cnblogs ase img check 賬號 top http wrap label按鈕和文字對齊 做表單的時候,經常遇到:復選框和文字對不齊的情況 ========================== 下面方法可以對齊 <!--label [[

input文字垂直居中按鈕問題,兼容IE8

add 原因 問題 沒有 自己 註意 -h ie8 微軟 1、盒子模型問題:請CSS重置 2、按鈕不對齊:請浮動或者vertical-align:middle;然後計算寬高,使其對齊 ; 3、IE8文本不居中:line-height屬性 註意:IE8不支持font寫

TextMesh Pro Emoji Align With Text(表情文字)

圖文 unity source taf smo 間隙 之前 設置 ons 前言MMO遊戲中需要富文件組件,大體功能包括圖文混排,表情,超鏈接,文字動畫等富文本功能,且DC數占用少。本文選擇Unity免費提供的TextMesh Pro 解決方案。 軟件環境 Unity3D 5

使用iview如何使左上的添加按鈕右上的搜索框邊框

bubuko 柵格 info grid gpo 對齊 image img clas 使用iview如何使左上的添加按鈕和右上的搜索框和邊框對齊呢? 效果如下: 使用iview自帶的Grid 柵格進行布局,但是由於按鈕和搜索框的大小不正好是一個柵格的寬度,所以不是很好

匯編,運算符,fldpi,fmul等指令說明.

位數 進位 定義 分別是 而在 跳轉 pat 集中 訪問內存 協處理器指令系統 協處理器共有68條不同的指令,匯編程序在遇到協處理器指令助記符時,都會將其轉換成機器語言的ESC指令,ESC指令代表了協處理器的操作碼。 協處理器指令在執行過程中,需要訪問內存單元時,CPU