关于整型数的溢出问题

donkeydonkey 2009-09-26 10:19:11
今天在看一个开源程序中,看到了下面的代码

/* Yes, this is exceedingly ugly. Blame Microsoft, which hopelessly */
/* violates the IEEE 754 floating-point standard in a bizarre way. */
/* If you're using an IEEE 754-compliant compiler, then x != x is true */
/* iff x is NaN. For Microsoft, (x < x) is true iff x is NaN. */
/* So either way, this macro safely detects a NaN. */

#define SCALAR_IS_NAN(x) (((x) != (x)) || (((x) < (x))))

/* true if an integer (stored in double x) would overflow (or if x is NaN) */
#define INT_OVERFLOW(x) ((!((x) * (1.0+1e-8) <= (double) Int_MAX)) \
|| SCALAR_IS_NAN (x))

SCALAR_IS_NAN我能理解,关键是INT_OVERFLOW宏前面的部分!((x) * (1.0+1e-8) <= (double) Int_MAX)
用来判定浮点数溢出?不知道怎么就能判定的呢?请各位高手帮助解答!小弟不胜感激!
...全文
186 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
2009-09-26
  • 打赏
  • 举报
回复
加上 1e-8 是因为把数稍微放大点比较保险,避免一些临界值(有些整数转为浮点不一定还是整数)。
oyster2008 2009-09-26
  • 打赏
  • 举报
回复
我说说我的理解吧,看代码和注释觉得它是用一个双精度浮点数来存储一个整数,但是整数的最大值不能超过Int_MAX,Int_MAX应该是它定义的宏吧(在C/C++中也有这么一个宏,不过是INT_MAX),表示整型的最大值。如果超过了最大值,就表示溢出了,!((x) * (1.0+1e-8) <= (double) Int_MAX) 就是用来判断这一点的,如果在原来的基础上乘上一个1.0+1e-8大于Int_Max的话,就认为溢出。另外,如果是Nan的话也溢出。可以参考IEEE 754的浮点数标准和Int_Max的值来确定它为什么选择了1e-8这个值
donkeydonkey 2009-09-26
  • 打赏
  • 举报
回复
请说明关键,谢谢!
oyster2008 2009-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 whg01 的回复:]
NAN是什么意思的?
[/Quote]
就是不是一个数Not an number,理解这个宏关键是要知道它这个整数是用双精度浮点数来存储的,INT_MAX是最大的整数的数值
whg01 2009-09-26
  • 打赏
  • 举报
回复
NAN是什么意思的?
Z782282738 2009-09-26
  • 打赏
  • 举报
回复
#define INT_OVERFLOW(x) ((!((x) * (1.0+1e-8) <= (double) Int_MAX))
楼上的讲的很明白了。我就当路过吧。多少给我点分。我好穷啊!

69,382

社区成员

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

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