找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1702|回复: 14
收起左侧

单片机keil_C51如何返回NaN

[复制链接]
ID:1043747 发表于 2022-11-27 14:56 来自手机 | 显示全部楼层 |阅读模式
我有一个返回浮点数的函数,当有错时,我想返回NaN,多谢大家!
回复

使用道具 举报

ID:94031 发表于 2022-11-27 16:53 | 显示全部楼层
通过串口发“NaN”。
回复

使用道具 举报

ID:526108 发表于 2022-11-27 17:30 | 显示全部楼层
#define NaN 0xFFFFFFFF
回复

使用道具 举报

ID:1043747 发表于 2022-11-27 18:05 来自手机 | 显示全部楼层
qq624353765 发表于 2022-11-27 17:30
#define NaN 0xFFFFFFFF

多谢 好像不行
2022-11-27_175832.png
回复

使用道具 举报

ID:1043747 发表于 2022-11-27 20:42 来自手机 | 显示全部楼层
xuyaqi 发表于 2022-11-27 16:53
通过串口发“NaN”。

我要返回给调用者
回复

使用道具 举报

ID:384109 发表于 2022-11-27 23:29 | 显示全部楼层
你应该先看懂说明文档中这个函数怎么用,你用错了
回复

使用道具 举报

ID:1043747 发表于 2022-11-28 12:40 来自手机 | 显示全部楼层
人中狼 发表于 2022-11-27 23:29
你应该先看懂说明文档中这个函数怎么用,你用错了

那该怎么用
回复

使用道具 举报

ID:155507 发表于 2022-11-28 19:19 | 显示全部楼层
应该是。
int NaN = 0x7F800001;
回复

使用道具 举报

ID:883242 发表于 2022-11-28 20:29 | 显示全部楼层
很奇怪的问题,一个返回浮点数的函数,当有错时,它就是返回NaN的,不是你想返回的。把函数返回值用_check_float_()查一下就行了,为什么要自己定义?
回复

使用道具 举报

ID:1043747 发表于 2022-11-28 20:45 来自手机 | 显示全部楼层
Hephaestus 发表于 2022-11-28 20:29
很奇怪的问题,一个返回浮点数的函数,当有错时,它就是返回NaN的,不是你想返回的。把函数返回值用_check_ ...

因为这个返回浮点数的函数是我写的
回复

使用道具 举报

ID:384109 发表于 2022-11-28 22:20 | 显示全部楼层
楼主用错函数了吧,_chkfloat_()本身就是一个检测浮点数的函数,你所说的NaN本身就是这个函数的其中一个返回值,还是先看看C语言有关函数的知识吧
回复

使用道具 举报

ID:883242 发表于 2022-11-29 03:38 | 显示全部楼层
angmall 发表于 2022-11-28 19:19
应该是。
int NaN = 0x7F800001;

屏幕截图 2022-11-29 031836.png
NaN的31位符号位是0或1无所谓,30~24位阶码必须全部是1,23~0位尾数只要是非零即可,所以板凳的答案也是对的,0xffffffff也是NaN。
回复

使用道具 举报

ID:883242 发表于 2022-11-29 03:59 | 显示全部楼层
censv 发表于 2022-11-28 20:45
因为这个返回浮点数的函数是我写的

那就是说其实你算出来的不是NaN,但是你算出来的结果按照你的项目需求有个合理范围,如果超过这个范围你就要把结果一律转换成NaN的意思吗?如果是的话,那么你在地板位的代码第9行很有问题,因为_chkfloat_函数的参数是float,而你填写了0xffffffff,编译器应该转换成4.295e9的浮点数送进去,当然不是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,而不是对应的相同大小的浮点数。
回复

使用道具 举报

ID:1043747 发表于 2022-11-29 08:02 来自手机 | 显示全部楼层
Hephaestus 发表于 2022-11-29 03:59
那就是说其实你算出来的不是NaN,但是你算出来的结果按照你的项目需求有个合理范围,如果超过这个范围你 ...

多谢帮助,你是个天使
回复

使用道具 举报

ID:77589 发表于 2022-11-30 14:17 | 显示全部楼层

51hei图片3.png
从你的图片上明显可以看出“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;
因为你的函数是返回的unsigned char, 所以用了这种方法,会出现数据类型强制转换;如果不想数据类型强制转换,就把函数返回类型由unsigned char修改成ResultType_t。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表