久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2166|回復(fù): 14
收起左側(cè)

單片機keil_C51如何返回NaN

[復(fù)制鏈接]
ID:1043747 發(fā)表于 2022-11-27 14:56 來自手機 | 顯示全部樓層 |閱讀模式
我有一個返回浮點數(shù)的函數(shù),當(dāng)有錯時,我想返回NaN,多謝大家!
回復(fù)

使用道具 舉報

ID:94031 發(fā)表于 2022-11-27 16:53 | 顯示全部樓層
通過串口發(fā)“NaN”。
回復(fù)

使用道具 舉報

ID:526108 發(fā)表于 2022-11-27 17:30 | 顯示全部樓層
#define NaN 0xFFFFFFFF
回復(fù)

使用道具 舉報

ID:1043747 發(fā)表于 2022-11-27 18:05 來自手機 | 顯示全部樓層
qq624353765 發(fā)表于 2022-11-27 17:30
#define NaN 0xFFFFFFFF

多謝 好像不行
2022-11-27_175832.png
回復(fù)

使用道具 舉報

ID:1043747 發(fā)表于 2022-11-27 20:42 來自手機 | 顯示全部樓層
xuyaqi 發(fā)表于 2022-11-27 16:53
通過串口發(fā)“NaN”。

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

使用道具 舉報

ID:384109 發(fā)表于 2022-11-27 23:29 | 顯示全部樓層
你應(yīng)該先看懂說明文檔中這個函數(shù)怎么用,你用錯了
回復(fù)

使用道具 舉報

ID:1043747 發(fā)表于 2022-11-28 12:40 來自手機 | 顯示全部樓層
人中狼 發(fā)表于 2022-11-27 23:29
你應(yīng)該先看懂說明文檔中這個函數(shù)怎么用,你用錯了

那該怎么用
回復(fù)

使用道具 舉報

ID:155507 發(fā)表于 2022-11-28 19:19 | 顯示全部樓層
應(yīng)該是。
int NaN = 0x7F800001;
回復(fù)

使用道具 舉報

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

使用道具 舉報

ID:1043747 發(fā)表于 2022-11-28 20:45 來自手機 | 顯示全部樓層
Hephaestus 發(fā)表于 2022-11-28 20:29
很奇怪的問題,一個返回浮點數(shù)的函數(shù),當(dāng)有錯時,它就是返回NaN的,不是你想返回的。把函數(shù)返回值用_check_ ...

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

使用道具 舉報

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

使用道具 舉報

ID:883242 發(fā)表于 2022-11-29 03:38 | 顯示全部樓層
angmall 發(fā)表于 2022-11-28 19:19
應(yīng)該是。
int NaN = 0x7F800001;

屏幕截圖 2022-11-29 031836.png
NaN的31位符號位是0或1無所謂,30~24位階碼必須全部是1,23~0位尾數(shù)只要是非零即可,所以板凳的答案也是對的,0xffffffff也是NaN。
回復(fù)

使用道具 舉報

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,編譯器應(yīng)該轉(zhuǎn)換成4.295e9的浮點數(shù)送進去,當(dāng)然不是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ù)制代碼


關(guān)鍵一句:f=(float*)&i;
只有這么寫,才能保證f的十六進制是0xffffffff,而不是對應(yīng)的相同大小的浮點數(shù)。
回復(fù)

使用道具 舉報

ID:1043747 發(fā)表于 2022-11-29 08:02 來自手機 | 顯示全部樓層
Hephaestus 發(fā)表于 2022-11-29 03:59
那就是說其實你算出來的不是NaN,但是你算出來的結(jié)果按照你的項目需求有個合理范圍,如果超過這個范圍你 ...

多謝幫助,你是個天使
回復(fù)

使用道具 舉報

ID:77589 發(fā)表于 2022-11-30 14:17 | 顯示全部樓層

51hei圖片3.png
從你的圖片上明顯可以看出“NaN”的值應(yīng)該為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。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区三区四区 | 午夜视频导航 | 国产一级一级毛片 | 91在线观| 中文字幕高清av | 国产91在线播放 | 国产精品久久久久久久久久三级 | 欧美日韩18 | 91新视频| 91原创视频| 97视频在线观看免费 | 欧美手机在线 | 欧美专区日韩专区 | 一区二区在线观看av | 国产精品一区二区在线 | 在线免费看黄 | 国产欧美精品区一区二区三区 | 国产精品九九九 | 中文字幕在线观看一区二区 | 国产小视频在线观看 | 午夜专区| 亚洲欧美日韩国产 | 国产精品一区二区无线 | 日韩欧美国产精品一区二区三区 | 国产中文视频 | 99爱在线视频 | 91欧美激情一区二区三区成人 | 久久久久国产精品一区二区 | 成人精品国产 | 黄网站在线播放 | 久久久久国产 | 精品视频一区二区 | 日本超碰| 日本涩涩视频 | 成人a在线观看 | h网站在线观看 | 色综合中文 | 国产激情视频网 | 97人人爱 | 欧美老妇交乱视频 | 成人在线观看黄 |