如何判定浮点类型值的有效性

lzg0001 2009-03-17 09:14:53

对于 int、UINT,其计值范围都是取可能的最大范围,32位任意赋值都会与一个确定的数值对应;但浮点类型在内存中采用二进制的“科学计数法”,变量的 32 位并不是所有组合都能表示有效的浮点值。

比如:
float n;
*(DWORD *)&n = 0xffffffff;
这时候它的值就是无效的,VC 调试器显示其值为 “-1.#QNAN00”。

当然,我们并不是故意要造一个不可能的值出来,但很难防止这样的情况出现,就比如运算过程中的数值溢出问题,溢出后的结果就是无效的,用其进行浮点运算会造成不可预料的结果。

请问各位,有没有一种标准的方法,准确判定一个浮点变量值是否有效?
谢谢!
...全文
605 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcPlayer 2009-03-17
  • 打赏
  • 举报
回复
汇编还不可靠、不稳定?

具体用法嘛,我也记不清楚了:(,否则也不会去要饭了:)
lzg0001 2009-03-17
  • 打赏
  • 举报
回复
能否写成一个可靠稳定的函数?
vcPlayer 2009-03-17
  • 打赏
  • 举报
回复
汇编:
jo
jc
cnzdgs 2009-03-17
  • 打赏
  • 举报
回复
如果按规定来说,你可以取出指数部分来判断是不是在1~254之间。
lzg0001 2009-03-17
  • 打赏
  • 举报
回复
那也就是与编译器相关 ?看来很难找到一种通用的方法了。
cnzdgs 2009-03-17
  • 打赏
  • 举报
回复
不是充要条件。float数据的第31位表示符号,30~23位表示指数,后面表示有效数字。按规定,指数范围是1~254为有效,不过我用程序验证,指数部分为0时仍可正常使用。
lzg0001 2009-03-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cnzdgs 的回复:]
给你写一个:
C/C++ codeBOOL IsFloatValid(floatf)
{return((DWORD&)f&0x7f800000)!=0x7f800000;
}
[/Quote]

你的意思,判定浮点数无效的充分、必要条件是 32 位储存空间中从 23 到 30 的八位均为 1 ?
  • 打赏
  • 举报
回复
*(DWORD *)&n = 0xffffffff;
没见过这种转换;
cnzdgs 2009-03-17
  • 打赏
  • 举报
回复
给你写一个:
BOOL IsFloatValid(float f)
{
return ((DWORD&)f & 0x7f800000) != 0x7f800000;
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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