打印

keil for arm里如何判断无效浮点数?

[复制链接]
3866|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Wxy8030|  楼主 | 2012-2-28 21:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dengm| | 2012-2-29 00:41 | 只看该作者
有无效的浮点数吗?

使用特权

评论回复
板凳
dqyubsh| | 2012-2-29 07:00 | 只看该作者
我觉得,应该避免出现这样的情况,而不是等待它出现的时候采取某种措施。

比如,做除法之前,先判断一下除数有没有可能小于0.001,如果小于,就别除了。可以先将除数放大固定倍数,或者强制除数<=0.001,反正不能让它等于0的时候去做除法。

预防自杀总比自杀之后再打120好的多吧。

使用特权

评论回复
地板
Wxy8030|  楼主 | 2012-2-29 08:31 | 只看该作者
是把一个浮点保存于 EEPROM 中,读出来的时候为了防止 EEPROM 失效,需要判断一下,C51里有 _chkfloat_ 函数的,keil for arm 里没找着。

使用特权

评论回复
5
ayb_ice| | 2012-2-29 08:33 | 只看该作者
C51有个库内嵌库函数_chkfloat_
ARM应该也有吧

使用特权

评论回复
6
ayb_ice| | 2012-2-29 08:42 | 只看该作者
看看这个函数__fp_status()
我只是粗略看了一下

使用特权

评论回复
7
Wxy8030|  楼主 | 2012-2-29 09:12 | 只看该作者
找到了:isfinite,谢谢  ayb_ice

使用特权

评论回复
8
zhanghui54| | 2016-11-5 12:36 | 只看该作者
楼上你也不说一下你是在哪里找到的,我也需要用一下这个函数

使用特权

评论回复
9
linqing171| | 2016-11-6 20:00 | 只看该作者
#include <math.h>
其中复制出来为:
#define isnan(x) \
    ((sizeof(x) == sizeof(float)) \
        ? __ARM_isnanf(x) \
        : __ARM_isnan(x))
    /*
     * Returns TRUE if x is a NaN.
     */

再展开一步为:
_ARMABI_INLINE_DEF _ARMABI_SOFTFP int __ARM_isnanf(float __x)
{
    return (0x7f800000 - (__FLT(__x) & 0x7fffffff)) >> 31;
}
_ARMABI_INLINE_DEF _ARMABI_SOFTFP int __ARM_isnan(double __x)
{
    unsigned __xf = __HI(__x) | ((__LO(__x) == 0) ? 0 : 1);
    return (0x7ff00000 - (__xf & 0x7fffffff)) >> 31;
}
    /* Return 1 if __x is a NaN, 0 otherwise */
    /* Used by isnan macro */

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

146

主题

2100

帖子

2

粉丝