c++ - 在 C++ 中检查零或非规范化数字

标签 c++ divide-by-zero

我目前有一些代码,我必须在其中对 double vector 进行归一化(将每个元素除以总和)。调试的时候有时会看到vector里面的元素都是0.0.如果我然后对元素求和,我会得到 0.0 或 4.322644347104e-314#DEN(我最近发现这是一个非规范化数字)。当总和为 0.0 或非规范化数字时,我想防止对 vector 进行规范化。我能想到的处理这两种情况的唯一方法是检查总和是否小于“epsilon”,其中 epsilon 是一些小数字(但我不确定使 epsilon 有多小)。

我有两个问题:

  1. 考虑这些情况的最佳方式是什么?
  2. 非规范化数的值是否依赖于机器?

最佳答案

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/

相关文章:

c++ - 如何导致故意除以零?

java - try-catch 除以零

ruby-on-rails - 如何在 Ruby 中对字符串应用除法运算符?

python - 防止列表推导式中除以零

c++ - 有谁见过 2-Sat 的实现吗

c# - 如何使用非托管 C++ 中的自定义绑定(bind)连接到 WCF 服务

c++ - 每个选项卡只看到一次 onload 事件

c# - 尝试在 SmartDevice 项目中使用 PInvoke 时出现 MissingMethodException

c++ - 如何实现点击式用户交互模型?

excel - Excel 2007 中出现 div/0 错误,在大型公式中返回 0