为什么numpy的nextafter(0,inf)会在flag under(flow)enabled时引发err?

n53p2ov0  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(71)
from numpy import nextafter,seterr
print(nextafter(0.,1.)) #5e-324
seterr(under="raise")
print(nextafter(0.,1.)) #FloatingPointError: underflow encountered in nextafter

我不明白这会引发FloatingPointError:在nextafter中遇到下溢。我用c语言考试,c程序不慌

siotufzp

siotufzp1#

help(numpy.seterr)将下溢描述为
下溢:结果非常接近于零,导致某些精度丢失
这对应于man feenableexcept中更精确的描述:
当结果必须表示为浮点数,但其绝对值小于最小的正规范化浮点数时(并且当表示为非规范化数字时会失去很多准确性),就会发生下溢异常。
零不是一个非正规化的数。零之后的下一个更高或更低的值将被反规格化。因此,如果启用它,将引发浮点异常。参见:什么是次正态浮点数?
下面的C代码也发出浮点异常信号:

#define _GNU_SOURCE
#include <fenv.h>
#include <math.h>
#include <stdio.h>

int main(void)
{
  double f = 0.;
  feenableexcept(FE_UNDERFLOW);
  f = nextafter(f, 1.);
  printf("%g\n", f);
}

如果你想跳过低于正常值,直接从零到numpy.finfo('f8').smallest_normal(2.2250738585072014e-308)

相关问题