• slider image 442
  • slider image 477
  • slider image 479
  • slider image 480
  • slider image 481
  • slider image 482
:::


Browsing this Thread:   1 Anonymous Users






Re: 關於浮點數存儲的問題
#3
管理員
管理員


查看用戶資訊
是阿! 這又是更進階的寫法了, 感謝!

發表於: 2021/11/26 17:39
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 關於浮點數存儲的問題
#2
資深會員
資深會員


查看用戶資訊
如果用union,應該可以簡潔一點…,雖然會有little/big endian 的問題,但同在XC8/16/32下用的話,應該問題不大
大概像這樣:


union def_float_union

    
uint8_t b[4];
    
float f;
};                            
//4
typedef union def_float_union floatType;

floatType value;



sscanfPI"%f", &value.);  // 將字串轉成浮點數 f_PI
EEPROM_Writeaddressvalue.b); // 將 i_PI存入 EEPROM
// ==============
EEPROM_Readaddressvalue.b); // 將 i_PI 自 EEPROM 讀出
sprintfPI"%f"value.); // 將浮點數 f_PI轉成字串

發表於: 2021/11/26 10:28
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


關於浮點數存儲的問題
#1
管理員
管理員


查看用戶資訊
假設有一個浮點數字串 "3.14159", 想要存到 EEPROM 要怎麼做呢?
首先要看你想存的 浮點數 是字串還是真的 float 數值
如果 想直接存入 字串時,
char PI[7] = "3.14159";
EEPROM_WriteAddressPIsizeofPI ) );


如果想存入 float 數值時,
1. 要先將字串轉為 float 數值, 可以使用 C string function 來達成
char PI[7]="3.14159";
float f_PI;
sscanfPI"%f", &f_PI );

此時f_PI內容即為數值 3.14159f

2. 接著要因為EEPROM API寫入的內容為 Bytes, 因此要知道 浮點數 float 型別的儲存內容為何?
任何 C 變數型別, 依不同的編譯器及平台, 由特定長度的 Byte 來儲存其值,
其中 float 型別依照 IEEE-754 規範以 4 個 Bytes來表示,
因此我們宣告一個 int32 型別來取得 float 變數的 4 個 Byte內容,
方便 EEPROM API來存取,
下面是拆成細部分解來解釋:
char PI[7]="3.14159";  // 浮點數字串
float f_PI;           // 真正的 浮點數
uint8_t i_PI[4];   // 要寫入 EEPROM的 4個Bytes buffer
int32_t *p_PI;    // 指向 4個 Byets的 32 bit 指標

sscanfPI"%f", &f_PI );  // 將字串轉成浮點數 f_PI
p_PI = (int32_t*)i_PI;        // 將32 bit指標指向 4個Bytes buffer
*p_PI = *((int32_t*)(&f_PI));  // 將浮點數 f_PI 存放的 4 個Bytes內容, 複製到 p_PI指向的 Buffer i_PI
EEPROM_Writeaddressi_Pi); // 將 i_PI存入 EEPROM
// ==============
EEPROM_Readaddressi_Pi); // 將 i_PI 自 EEPROM 讀出
p_PI = (int32_t*)i_PI;   // 將32 bit指標指向 4個Bytes buffer
f_PI= *((float*)(p_PI)); // 將p_PI指向的 4個Bytes Buffer i_PI,  複製到浮點數 f_PI
sprintfPI"%f"f_PI ); // 將浮點數 f_PI轉成字串



而實際上了解記憶體型別轉換的概念後, 真正的 code 可以簡化為
char PI[7]="3.14159";  // 浮點數字串
float f_PI;           // 真正的 浮點數
uint8_t i_PI[4];   // 要寫入 EEPROM的 4個Bytes buffer

sscanfPI"%f", &f_PI );  // 將字串轉成浮點數 f_PI
memcpyi_PI, (uint8_t *)(&f_PI), ); // 將 f_PI 所在的 4 bytes內容複製給 i_PI
EEPROM_Writeaddressi_Pi); // 將 i_PI存入 EEPROM
// ==============
EEPROM_Readaddressi_Pi); // 將 i_PI 自 EEPROM 讀出
memcpy( (uint8_t*)(&f_PI), i_PI); // 將 i_PI 所在的 4 bytes內容複製給 f_PI
sprintfPI"%f"f_PI ); // 將浮點數 f_PI轉成字串


或者也這樣寫, 但看起來比較暈

char PI[7]="3.14159";  // 浮點數字串
float f_PI;           // 真正的 浮點數
uint8_t i_PI[4];   // 要寫入 EEPROM的 4個Bytes buffer

sscanfPI"%f", &f_PI );  // 將字串轉成浮點數 f_PI
*((float*)i_PI) = f_PI// 將 f_PI 所在的 4 bytes內容複製給 i_PI
EEPROM_Writeaddressi_Pi); // 將 i_PI存入 EEPROM
// ==============
EEPROM_Readaddressi_Pi); // 將 i_PI 自 EEPROM 讀出
f_PI = *((float*)i_PI); // 將 i_PI 所在的 4 bytes內容複製給 f_PI
sprintfPI"%f"f_PI ); // 將浮點數 f_PI轉成字串

發表於: 2021/11/3 13:42

Edited by Libra on 2021年11月03日 14:02:01
Edited by Libra on 2021年11月03日 15:10:38
Edited by Libra on 2021年11月10日 08:08:27
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------