我正在寻找一些不使用有关浮点类型实现的假设的东西,并且不使用C++ 11/C99方法.
以下代码是检查INF和NAN的可靠方法吗?如果没有,究竟会出现什么问题?
bool isfinite(double n)
{
if(std::numeric_limits<double>::has_infinity)
{
double inf = std::numeric_limits<double>::infinity();
if(std::memcmp(&n, &inf, sizeof(double)) == 0)
return false;
double neginf = -inf;
if(std::memcmp(&n, &neginf, sizeof(double)) == 0)
return false;
}
if(std::numeric_limits<double>::has_quiet_NaN)
{
double nan = std::numeric_limits<double>::quiet_NaN();
if(std::memcmp(&n, &nan, sizeof(double)) == 0)
return false;
double negnan = -nan;
if(std::memcmp(&n, &negnan, sizeof(double)) == 0)
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
编辑:具体来说,我正在寻找一种在语言中实现这一目标的方法,而不是依赖于编译器内部函数,先验定义或其他库,如boost.
自信的OP代码并不总是有效。
A double(例如IEEE 754)具有非唯一的 NaN 二进制表示:(
是s符号位。)
s1111111 1111baaa aaaaaaaa aaaaaaaa aaaaaaaa aaaaaaaa aaaaaaaa aaaaaaaa
Run Code Online (Sandbox Code Playgroud)
其中并非全部baa ... aaa为 0。(如果baa ... aaa全部为 0,则为 。INF)安静 NaN 和信号 NaN 之间的差异通常用 的值来表示b。
突出的问题是并非所有 NaN 都具有相同的位模式。double针对单个位模式提出的测试对于 NaN 检测来说是不够的。
建议进行一种可移植的测试,该测试不依赖于 NaN,也不依赖于给定 C 平台中现有的 Infinity。
double x;
// NAN are never arithmetically equal, even to themselves.
if (x != x) NaN_Detected();
if (x > DBL_MAX || x < -DBL_MAX) Inf_Detected();
Run Code Online (Sandbox Code Playgroud)
[编辑]比较修复:感谢@Jongware
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |