如何处理浮点下溢?

Wil*_*ing 5 c++ floating-point underflow

我正在尝试理解C++数值属性.因此,我对下溢现象感兴趣.任何人都可以给我一个下溢的例子以及如何处理它?

Pas*_*uoq 6

浮点下溢的一个例子是:

double d = DBL_MIN / 3.0;
Run Code Online (Sandbox Code Playgroud)

符合IEEE 754的实现应该设置d为" 低于正常 ",即一个接近于零的数字,精度会降低.您将在维基百科上找到大量信息.

一些实现可能"刷新到零".上例中的结果是设置d为零.

下溢是较大的负指数无法表示数字的结果.有时可以通过"规范化"计算来避免它们,这相当于以某种方式计算x 1*2 N,x 2*2 N,...而不是x 1,x 2,......对于您选择的N.

浮点下溢不是未定义的行为.如果您愿意,可以使用"FPU例外"通过轮询或接收SIGFPE来检测它.请注意,除了名称之外,"FPU异常"与C++异常没有任何共同之处.

  • @WildThing 除 sqrt(即 +、-、*、/)之外的所有五个基本 IEEE 754 运算都可能导致下溢。每次数学结果介于“-DBL_MIN*(1-DBL_EPSILON/4)”和“DBL_MIN*(1-DBL_EPSILON/4)”之间(给出或取 ULP 的一小部分)时,它们都会导致下溢。 (2认同)
  • 虽然`DBL_MIN/2`下溢,但如果启用了默认下溢处理,则会解除此下溢(未标记且实际上从不存在),因为结果是准确的.在默认模式下,精确结果永不下溢.相反,`DBL_MIN/3`或`DBL_MIN /(2./3)`总是会引发下溢标志. (2认同)