找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2294|回復: 14
打印 上一主題 下一主題
收起左側(cè)

單片機keil_C51如何返回NaN

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1043747 發(fā)表于 2022-11-27 14:56 來自觸屏版 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
我有一個返回浮點數(shù)的函數(shù),當有錯時,我想返回NaN,多謝大家!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

15#
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ù)據(jù)類型強制轉(zhuǎn)換;如果不想數(shù)據(jù)類型強制轉(zhuǎn)換,就把函數(shù)返回類型由unsigned char修改成ResultType_t。
回復

使用道具 舉報

14#
ID:1043747 發(fā)表于 2022-11-29 08:02 來自觸屏版 | 只看該作者
Hephaestus 發(fā)表于 2022-11-29 03:59
那就是說其實你算出來的不是NaN,但是你算出來的結(jié)果按照你的項目需求有個合理范圍,如果超過這個范圍你 ...

多謝幫助,你是個天使
回復

使用道具 舉報

13#
ID:883242 發(fā)表于 2022-11-29 03:59 | 只看該作者
censv 發(fā)表于 2022-11-28 20:45
因為這個返回浮點數(shù)的函數(shù)是我寫的

那就是說其實你算出來的不是NaN,但是你算出來的結(jié)果按照你的項目需求有個合理范圍,如果超過這個范圍你就要把結(jié)果一律轉(zhuǎn)換成NaN的意思嗎?如果是的話,那么你在地板位的代碼第9行很有問題,因為_chkfloat_函數(shù)的參數(shù)是float,而你填寫了0xffffffff,編譯器應該轉(zhuǎn)換成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ù)。
回復

使用道具 舉報

12#
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。
回復

使用道具 舉報

11#
ID:384109 發(fā)表于 2022-11-28 22:20 | 只看該作者
樓主用錯函數(shù)了吧,_chkfloat_()本身就是一個檢測浮點數(shù)的函數(shù),你所說的NaN本身就是這個函數(shù)的其中一個返回值,還是先看看C語言有關函數(shù)的知識吧
回復

使用道具 舉報

10#
ID:1043747 發(fā)表于 2022-11-28 20:45 來自觸屏版 | 只看該作者
Hephaestus 發(fā)表于 2022-11-28 20:29
很奇怪的問題,一個返回浮點數(shù)的函數(shù),當有錯時,它就是返回NaN的,不是你想返回的。把函數(shù)返回值用_check_ ...

因為這個返回浮點數(shù)的函數(shù)是我寫的
回復

使用道具 舉報

9#
ID:883242 發(fā)表于 2022-11-28 20:29 | 只看該作者
很奇怪的問題,一個返回浮點數(shù)的函數(shù),當有錯時,它就是返回NaN的,不是你想返回的。把函數(shù)返回值用_check_float_()查一下就行了,為什么要自己定義?
回復

使用道具 舉報

8#
ID:155507 發(fā)表于 2022-11-28 19:19 | 只看該作者
應該是。
int NaN = 0x7F800001;
回復

使用道具 舉報

7#
ID:1043747 發(fā)表于 2022-11-28 12:40 來自觸屏版 | 只看該作者
人中狼 發(fā)表于 2022-11-27 23:29
你應該先看懂說明文檔中這個函數(shù)怎么用,你用錯了

那該怎么用
回復

使用道具 舉報

6#
ID:384109 發(fā)表于 2022-11-27 23:29 | 只看該作者
你應該先看懂說明文檔中這個函數(shù)怎么用,你用錯了
回復

使用道具 舉報

5#
ID:1043747 發(fā)表于 2022-11-27 20:42 來自觸屏版 | 只看該作者
xuyaqi 發(fā)表于 2022-11-27 16:53
通過串口發(fā)“NaN”。

我要返回給調(diào)用者
回復

使用道具 舉報

地板
ID:1043747 發(fā)表于 2022-11-27 18:05 來自觸屏版 | 只看該作者
qq624353765 發(fā)表于 2022-11-27 17:30
#define NaN 0xFFFFFFFF

多謝 好像不行

2022-11-27_175832.png (131.76 KB, 下載次數(shù): 98)

2022-11-27_175832.png
回復

使用道具 舉報

板凳
ID:526108 發(fā)表于 2022-11-27 17:30 | 只看該作者
#define NaN 0xFFFFFFFF
回復

使用道具 舉報

沙發(fā)
ID:94031 發(fā)表于 2022-11-27 16:53 | 只看該作者
通過串口發(fā)“NaN”。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

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