找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

單片機keil_C51如何返回NaN

查看數(shù): 2299 | 評論數(shù): 14 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2022-11-27 14:56

正文摘要:

我有一個返回浮點數(shù)的函數(shù),當有錯時,我想返回NaN,多謝大家!

回復

ID:77589 發(fā)表于 2022-11-30 14:17


從你的圖片上明顯可以看出“NaN”的值應該為4,這里可以用兩種方法解決。
一、定義宏來解決
#define  STD_FLOAT    0
#define  ZERO             1
#define  POS_OF         2
#define  NEG_OF         3
#define  NaN               4
二、定義枚舉來解決
typedef enum {
    STD_FLOAT = 0,
    ZERO = 1,
    POS_OF = 2,
    NEG_OF = 3,
    NaN = 4,
} ResultType_t;
因為你的函數(shù)是返回的unsigned char, 所以用了這種方法,會出現(xiàn)數(shù)據類型強制轉換;如果不想數(shù)據類型強制轉換,就把函數(shù)返回類型由unsigned char修改成ResultType_t。
ID:1043747 發(fā)表于 2022-11-29 08:02
Hephaestus 發(fā)表于 2022-11-29 03:59
那就是說其實你算出來的不是NaN,但是你算出來的結果按照你的項目需求有個合理范圍,如果超過這個范圍你 ...

多謝幫助,你是個天使
ID:883242 發(fā)表于 2022-11-29 03:59
censv 發(fā)表于 2022-11-28 20:45
因為這個返回浮點數(shù)的函數(shù)是我寫的

那就是說其實你算出來的不是NaN,但是你算出來的結果按照你的項目需求有個合理范圍,如果超過這個范圍你就要把結果一律轉換成NaN的意思嗎?如果是的話,那么你在地板位的代碼第9行很有問題,因為_chkfloat_函數(shù)的參數(shù)是float,而你填寫了0xffffffff,編譯器應該轉換成4.295e9的浮點數(shù)送進去,當然不是NaN了。

我寫了個測試代碼,在MinGW上面編譯通過:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <math.h>

  5. int main(int argc, char *argv[]) {
  6.         float *f;
  7.         uint32_t i=0xffffffff;
  8.         f=(float*)&i;
  9.         if(__isnanf(*f))printf("\r\nstep1 NaN.");
  10.         i=0x0;
  11.         if(__isnanf(*f))printf("\r\nstep1 NaN.");
  12.         return 0;
  13. }
復制代碼


關鍵一句:f=(float*)&i;
只有這么寫,才能保證f的十六進制是0xffffffff,而不是對應的相同大小的浮點數(shù)。
ID:883242 發(fā)表于 2022-11-29 03:38
angmall 發(fā)表于 2022-11-28 19:19
應該是。
int NaN = 0x7F800001;


NaN的31位符號位是0或1無所謂,30~24位階碼必須全部是1,23~0位尾數(shù)只要是非零即可,所以板凳的答案也是對的,0xffffffff也是NaN。
ID:384109 發(fā)表于 2022-11-28 22:20
樓主用錯函數(shù)了吧,_chkfloat_()本身就是一個檢測浮點數(shù)的函數(shù),你所說的NaN本身就是這個函數(shù)的其中一個返回值,還是先看看C語言有關函數(shù)的知識吧
ID:1043747 發(fā)表于 2022-11-28 20:45
Hephaestus 發(fā)表于 2022-11-28 20:29
很奇怪的問題,一個返回浮點數(shù)的函數(shù),當有錯時,它就是返回NaN的,不是你想返回的。把函數(shù)返回值用_check_ ...

因為這個返回浮點數(shù)的函數(shù)是我寫的
ID:883242 發(fā)表于 2022-11-28 20:29
很奇怪的問題,一個返回浮點數(shù)的函數(shù),當有錯時,它就是返回NaN的,不是你想返回的。把函數(shù)返回值用_check_float_()查一下就行了,為什么要自己定義?
ID:155507 發(fā)表于 2022-11-28 19:19
應該是。
int NaN = 0x7F800001;
ID:1043747 發(fā)表于 2022-11-28 12:40
人中狼 發(fā)表于 2022-11-27 23:29
你應該先看懂說明文檔中這個函數(shù)怎么用,你用錯了

那該怎么用
ID:384109 發(fā)表于 2022-11-27 23:29
你應該先看懂說明文檔中這個函數(shù)怎么用,你用錯了
ID:1043747 發(fā)表于 2022-11-27 20:42
xuyaqi 發(fā)表于 2022-11-27 16:53
通過串口發(fā)“NaN”。

我要返回給調用者
ID:526108 發(fā)表于 2022-11-27 17:30
#define NaN 0xFFFFFFFF
ID:94031 發(fā)表于 2022-11-27 16:53
通過串口發(fā)“NaN”。

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表