又沒有其他地方可以貼,所以只好貼在這邊了……
這些衍生物我先歸類在『工程師的美麗與哀愁』之下,如果數量夠多的話,我會新開一個分類。
自訂函數 float_to_int(double dFloatPoint,long l0Int_1float[2])
-與其說是將浮點數轉換成整數,倒不如說是將浮點數轉換成『長整數陣列』。
-概念
因為目前手邊不管是OLED的RIT128x96x4StringDraw()還是UARTprintf(),只接受『字串』以及整數
所以必須做一些很複雜的轉換。
RIT128x96x4StringDraw()這個函數只接受『字串』,所以必須將整數轉換成字串。
這個功能用utils/ustdlib.h中的usprintf()就可以完成。但是usprintf()並不接受浮點數。
相同的,UARTprintf()也只接受整數。
為了這個原因,必須自訂一個函數來做轉換。將浮點數拆解成為兩個整數。
-輸入參數
參數 | 解說 | 型態 |
dFloatPoint | 輸入需要拆解的浮點數 | Double |
l0Int_1float[2] | 存放拆解之後的長整數陣列 l0Int_1float[0]=整數部份 l0Int_1float[1]=小數部份 | long |
-方法
整數部份:
就……直接做型態轉換,將dFloatPoint轉成long之後,存放到l0Int_1float[0]之中。
小數部份:
使用fmod()函數(在math.h之中),讓dFloatPoint對1做餘數,使其剩下小數的
部份。如果小數之後有數值的話,就進入判斷式中。如果沒有的話,就讓 l0Int_1float[1]=0
進入判斷式之後,把數值做餘數存放在dTmp中,乘上1000後,在做一次型態轉換後存入l0Int_1float[1]之中,把剩餘位數去掉。
-討論:
-其實也不一定要乘上10000,看需要多少的精確度而定。10000的話,可以精確到小數後四位
-這個函數有個缺點,建議最好先把l0Int_1float做初始化,不然會發生不可預期的問題。
-用到很多內建的函式庫,不知道這樣做會不會造成問題。但是,目前就以在OLED上的顯示來看 似乎還可以用。
-以下是程式碼:
#include
void float_to_int(double dFloatPoint,long l0Int_1float[2]){
double dTmp;
l0Int_1float[0]=(long)dFloatPoint;
if(fmod(dFloatPoint,1.0) > 0){
dTmp=fmod(dFloatPoint,1.0);
dTmp = dTmp *10000;
l0Int_1float[1] = (long)dTmp;
}else{
l0Int_1float[1] = 0;
}
}
帥氣吧!註解寫的比程式碼還多^^
這就是我的風格!
有些老外寫的程式碼,註解佔了整個程式碼的一大半,但是礙於都是英文,有看真的沒有懂==
而且那些軟體工程師都只用他們的術語來說,也沒有好好解釋整個概念,就是很單純的告訴妳,你該輸入些什麼,輸出會是什麼等等。
看了就很疲累。
題外話。
這幾天,感覺好像爬了一座高山之後,突然就出現了一堵高牆,好不容易找到爬過那堵高牆的方法的時候,突然就掉了一顆大石頭擋住我的去路。
就這樣,週而復始,好不容易有了這麼一點點的成就T_T
對了,這段原始碼是採用創用CC的授權模式,要用的話記得把我的名字貼上去。
還有,要做修改的話,請給我一份副本,而且麻煩請用同樣的授權方式公開,謝謝。
float_to_int(double dFloatPoint,long l0Int_1float[2])由Ethan製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 Unported 授權條款釋出。
沒有留言:
張貼留言