我目前有一些代码,我必须在其中对 double vector 进行归一化(将每个元素除以总和)。调试的时候有时会看到vector里面的元素都是0.0.如果我然后对元素求和,我会得到 0.0 或 4.322644347104e-314#DEN(我最近发现这是一个非规范化数字)。当总和为 0.0 或非规范化数字时,我想防止对 vector 进行规范化。我能想到的处理这两种情况的唯一方法是检查总和是否小于“epsilon”,其中 epsilon 是一些小数字(但我不确定使 epsilon 有多小)。
我有两个问题:
- 考虑这些情况的最佳方式是什么?
- 非规范化数的值是否依赖于机器?
最佳答案
C99 提供了fpclassify
来检测非规范化数字。它还随 C++0x 和 Boost.Math 一起提供。
// C++0x
#include <cmath>
using std::fpclassify;
// Boost
//#include <boost/math/special_functions/fpclassify.hpp>
//using boost::math::fpclassify;
if(fpclassify(sum) == FP_SUBNORMAL) {
// ...
}
关于c++ - 在 C++ 中检查零或非规范化数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6733471/