我有一些数学(在 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/