社区
C语言
帖子详情
怎么判断和定义浮点数的无穷大以及NaN?
hummk
2007-06-06 05:48:19
最好是在TC2.0中的方法,不要C++的。
...全文
2748
13
打赏
收藏
怎么判断和定义浮点数的无穷大以及NaN?
最好是在TC2.0中的方法,不要C++的。
复制链接
扫一扫
分享
转发到动态
举报
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
打赏
举报
回复
沙发
IEEE-754标准
定义
浮点数
转换工具
输入十进制
浮点数
,可转换成IEEE-754标准的数据,也可以将IEEE-754标准的数据转换成十进制
浮点数
,非常好用的小工具
浮点数
(单精度
浮点数
,双精度
浮点数
)
单精度
浮点数
,双精度
浮点数
,
浮点数
是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。
Verilog
浮点数
加法器
利用verilog,以IEEE754标准实现
浮点数
加法
TMS320C3x
浮点数
简介、IEEE754的32位转VC33的32位
浮点数
算法、IEEE754的64位
浮点数
转VC33的40位
浮点数
算法
本文档简介了TMS320C3x
浮点数
简介、IEEE754的32位转VC33的32位
浮点数
算法、IEEE754的64位
浮点数
转VC33的40位
浮点数
算法;给相关TI的DSP开发工程师提供开发参考。
HEX与
浮点数
相互转换
支持
浮点数
与HEX格式相互转换
C语言
70,020
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章