C++ 可以在内部表示而无需舍入的 0 和 1 之间的最大和最小数字是什么?

Aci*_*iel 3 c++ double machine-learning probability rounding

我有一个 C++ 函数,它根据一个简单的模型计算概率。似乎 C++ 倾向于将非常小的概率舍入为 0,将非常大的概率舍入为 1。这会导致后续计算出现问题(采用 log(p) 和 log(1-p))。

有没有一种方法可以显式表示小于 1 的最大数字,C++ 可以在内部表示而无需四舍五入?同样,最小的数大于 0?

我可以做这样的事情:

if (probability == 1) 
    probability = 0.999999999;
else if (probability == 0) 
    probability = 0.000000001;
Run Code Online (Sandbox Code Playgroud)

但这会导致其他数字问题(与累积数字有关)。有没有更原则的方法,也许使用 numeric_limits?

Zet*_*eta 5

虽然它的名字可能有点误导,但std::numeric_limits<T>::min正是您要找的。对于浮点类型,它将为您提供大于零的最小值。

对于这仍然少于最大数1,你可以使用std::nexttoward,如果您使用C ++ 11:

代码

#include<cstdio>
#include<cmath>
#include<limits>

int main(){
  printf("Near 0: %1.20e\nNear 1: %1.20e\n",
    std::numeric_limits<double>::min(),
    std::nexttoward(1.0, 0.0)
  );
  return 0;
} 
Run Code Online (Sandbox Code Playgroud)

结果

接近0:2.22507385850720138309e-308
近1:9.99999999999999888978e-01