c++ - 如何检查和处理非常接近于零的数字

标签 c++ math numeric numerical-stability

我有一些数学(在 C++ 中)似乎生成一些非常小的、接近于零的数字(我怀疑触发函数调用是我真正的问题),但我想检测这些案例,以便我可以更详细地研究它们。

我目前正在尝试以下方法,是否正确?

if ( std::abs(x) < DBL_MIN ) {
     log_debug("detected small num, %Le, %Le", x, y);
}

其次,数学的本质是三角函数(又名使用大量弧度/度数转换和sin/cos/tan 调用等),我可以做什么样的转换来避免数学错误?

显然对于乘法我可以使用 log transform - 还有什么?

最佳答案

与普遍看法相反,DBL_MIN 不是最小的正 double 值,而是最小的正归一化 double值(value)。通常 - 对于 64 位 ieee754 doubles - 它是 2-1022,而最小的正 double 值为 2-1074。因此

I'm currently trying out the following, is it correct?

if ( std::abs(x) < DBL_MIN ) {
     log_debug("detected small num, %Le, %Le", x, y);
}

可能会有肯定的回答。该条件检查 x非规范化(也称为次规范)数字还是 ±0.0。在不了解您的具体情况的情况下,我无法判断该测试是否合适。非规范化数字可以是合法的计算结果,也可以是正确结果为 0 的舍入结果。当数学上正确的结果为 0 时,舍入也可能产生比 DBL_MIN 大得多的数字, 因此一个更大的阈值可能是明智的。

关于c++ - 如何检查和处理非常接近于零的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6982217/

相关文章:

javascript - 如何在 JavaScript 中根据数字将数字四舍五入到最接近的 100/1000?

c++ - 如何计算两点之间的角度并以此为基础旋转第三点?

php - 过滤数字 PIN 码字符串数组,格式可能为 "######"或 "### ###"

python - Numpy 中的特征向量 : Very bad numerics? 我做错了什么吗?

debugging - 使用定点的 n 次方根中的错误

c++ - 字段声明为 void/struct 或未在此范围内声明的变量

c++ - 宏内的宏扩展

c++ - C++如何在内存中连续(连贯)存储三维数组?

java - ProjectEuler#15出现问题

c++ - OpenCL "multithreading"示例