标题: 单片机keil_C51如何返回NaN [打印本页]

作者: censv    时间: 2022-11-27 14:56
标题: 单片机keil_C51如何返回NaN
我有一个返回浮点数的函数,当有错时,我想返回NaN,多谢大家!
作者: xuyaqi    时间: 2022-11-27 16:53
通过串口发“NaN”。
作者: 624353765    时间: 2022-11-27 17:30
#define NaN 0xFFFFFFFF
作者: censv    时间: 2022-11-27 18:05
qq624353765 发表于 2022-11-27 17:30
#define NaN 0xFFFFFFFF

多谢 好像不行

2022-11-27_175832.png (131.76 KB, 下载次数: 98)

2022-11-27_175832.png

作者: censv    时间: 2022-11-27 20:42
xuyaqi 发表于 2022-11-27 16:53
通过串口发“NaN”。

我要返回给调用者
作者: 人中狼    时间: 2022-11-27 23:29
你应该先看懂说明文档中这个函数怎么用,你用错了
作者: censv    时间: 2022-11-28 12:40
人中狼 发表于 2022-11-27 23:29
你应该先看懂说明文档中这个函数怎么用,你用错了

那该怎么用
作者: angmall    时间: 2022-11-28 19:19
应该是。
int NaN = 0x7F800001;
作者: Hephaestus    时间: 2022-11-28 20:29
很奇怪的问题,一个返回浮点数的函数,当有错时,它就是返回NaN的,不是你想返回的。把函数返回值用_check_float_()查一下就行了,为什么要自己定义?
作者: censv    时间: 2022-11-28 20:45
Hephaestus 发表于 2022-11-28 20:29
很奇怪的问题,一个返回浮点数的函数,当有错时,它就是返回NaN的,不是你想返回的。把函数返回值用_check_ ...

因为这个返回浮点数的函数是我写的
作者: 人中狼    时间: 2022-11-28 22:20
楼主用错函数了吧,_chkfloat_()本身就是一个检测浮点数的函数,你所说的NaN本身就是这个函数的其中一个返回值,还是先看看C语言有关函数的知识吧
作者: Hephaestus    时间: 2022-11-29 03:38
angmall 发表于 2022-11-28 19:19
应该是。
int NaN = 0x7F800001;


NaN的31位符号位是0或1无所谓,30~24位阶码必须全部是1,23~0位尾数只要是非零即可,所以板凳的答案也是对的,0xffffffff也是NaN。

作者: Hephaestus    时间: 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,而不是对应的相同大小的浮点数。
作者: censv    时间: 2022-11-29 08:02
Hephaestus 发表于 2022-11-29 03:59
那就是说其实你算出来的不是NaN,但是你算出来的结果按照你的项目需求有个合理范围,如果超过这个范围你 ...

多谢帮助,你是个天使
作者: Longan.Wang    时间: 2022-11-30 14:17
censv 发表于 2022-11-27 18:05
多谢 好像不行


从你的图片上明显可以看出“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。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1