怎么判断和定义浮点数的无穷大以及NaN?

hummk 2007-06-06 05:48:19
最好是在TC2.0中的方法,不要C++的。
...全文
2748 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
aleda303 2012-04-26
  • 打赏
  • 举报
回复
<接上>

使用中,
float a = NAN ;
double b = NAN;

系统中类型会自动转换

aleda303 2012-04-26
  • 打赏
  • 举报
回复

#define NAN (0.0/0.0) //无效值NaN
#define isNAN(x) ((x)!=(x))

#define INF (1.0/0.0) //无穷大
#define PINF INF //正无穷大
#define NINF -INF //负无穷大
#define isINF(x) (((x)==PINF)||((x)==NINF))
#define isPINF(x) ((x)==PINF)
#define isNINF(x) ((x)==NINF)


hummk 2007-06-07
  • 打赏
  • 举报
回复
向一些数学函数计算错误或超过范围会返回特殊浮点值。那么对于自己编的函数,怎样以最简单的方式返回特殊浮点值?
mLee79 2007-06-07
  • 打赏
  • 举报
回复
混了这么多年, 见过的用过的还没见过不符合 IEEE754 标准的(不支持浮点数的除外) ...
milksea 2007-06-07
  • 打赏
  • 举报
回复
当然不是无穷大,但一般地可以代替无穷大,实用就可以了。非要写一些依赖具体浮点数内部表示的代码,更容易出错。
hummk 2007-06-06
  • 打赏
  • 举报
回复
DBL_MAX
FLT_MAX
LDBL_MAX
这些不是无穷大,而是浮点数能表示的最大值。

milksea 2007-06-06
  • 打赏
  • 举报
回复
无论如何,用编程环境给出的函数比自己写函数处理这种移植性问题要好得多。
milksea 2007-06-06
  • 打赏
  • 举报
回复
无穷大可以用这几个宏代替(float.h):
DBL_MAX
FLT_MAX
LDBL_MAX



TC 2.0是否正确实现了NaN,我不清楚,头文件中没给。如果用MingW GCC,则有几个非标准的函数可以用(float.h):
_CRTIMP int __cdecl _finite (double); /* 有限数 */
_CRTIMP int __cdecl _isnan (double); /* 不是数 */

_CRTIMP int __cdecl _fpclass (double); /* 返回数的类型,后面是返回值的宏 */

/* These are also defined in Mingw math.h, needed to work around
GCC build issues. */
/* Return values for fpclass. */
#ifndef __MINGW_FPCLASS_DEFINED
#define __MINGW_FPCLASS_DEFINED 1
#define _FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */
#define _FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */
#define _FPCLASS_NINF 0x0004 /* Negative Infinity */
#define _FPCLASS_NN 0x0008 /* Negative Normal */
#define _FPCLASS_ND 0x0010 /* Negative Denormal */
#define _FPCLASS_NZ 0x0020 /* Negative Zero */
#define _FPCLASS_PZ 0x0040 /* Positive Zero */
#define _FPCLASS_PD 0x0080 /* Positive Denormal */
#define _FPCLASS_PN 0x0100 /* Positive Normal */
#define _FPCLASS_PINF 0x0200 /* Positive Infinity */
#endif /* __MINGW_FPCLASS_DEFINED */
mLee79 2007-06-06
  • 打赏
  • 举报
回复
酱紫 ...
typedef unsigned long ul;
int isINF( float f )
{
ul x = *(ul*)&f;
return 0==(x&0x7ffffful) && 0x7f800000ul==(x&0x7f800000ul);
}
int isNaN( float f )
{
ul x = *(ul*)&f;
return 0!=(x&0x7ffffful) && 0x7f800000ul==(x&0x7f800000ul);
}
huashizhixin 2007-06-06
  • 打赏
  • 举报
回复
上问转自 happy__888([顾问团]寻开心 www.e-jjj.com)
huashizhixin 2007-06-06
  • 打赏
  • 举报
回复

关于32位浮点数的结构,你可以看我的btlog当中的描述部分
http://btlog.csdn.net/happy_888
根据IEEE的标准,浮点数的定义如下
符号位 指数位 小数部分 指数偏移量
单精度浮点数 1 位[31] 8位 [30-23] 23位 [22-00] 127
双精度浮点数 1 位[63] 11 位[62-52] 52 位[51-00] 1023
我们以单精度浮点数来说明:
符号位,表述浮点数的正或者负
指数实际也有正负的,但是没有单独的符号位,而是采用了一个偏移来表示
在计算机的世界里,进位都是二进制的,指数表示的也是2的N次幂
这个数据格式当中的,指数是8位,可表达的范围是0到255
而对应的实际的指数是-127到+128
这里特殊说明,-127和+128这两个数据在IEEE当中是保留的用作多种用途的
-127表示的数字是0
128和其他位数组合表示多种意义,最典型的就是NAN状态

小数部分,并不是一个浮点数的实际的小数
实际的小数在这个小数前面还保留了一个1
拿浮点数1.0来说
符号位是0, 实际指数是0,对应这里的指数就是127了,也就是0x7f
而小数部分就是1.0了, 1是暗含的不存储,实际的小数部分就是0了
因此组合起来的数据就是,0x3f80000

16位的也是类似的,自己分析一下
WORD w = *((WORD*)(&f))
是把一个浮点数按照内存结构转化成为一个unsigned int 16位的结构
TC 2.0不是C++ ,是c++的话就可以简单 w = (int&) f; 就可以了
mLee79 2007-06-06
  • 打赏
  • 举报
回复
按IEEE标准搞三, 阶码全1,尾数全0的是INF, 阶码全1尾数非全0的就NaN ..
huashizhixin 2007-06-06
  • 打赏
  • 举报
回复
沙发

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧