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程序不慌
siotufzp1#
help(numpy.seterr)将下溢描述为下溢:结果非常接近于零,导致某些精度丢失这对应于man feenableexcept中更精确的描述:当结果必须表示为浮点数,但其绝对值小于最小的正规范化浮点数时(并且当表示为非规范化数字时会失去很多准确性),就会发生下溢异常。零不是一个非正规化的数。零之后的下一个更高或更低的值将被反规格化。因此,如果启用它,将引发浮点异常。参见:什么是次正态浮点数?下面的C代码也发出浮点异常信号:
help(numpy.seterr)
man feenableexcept
#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)
numpy.finfo('f8').smallest_normal
1条答案
按热度按时间siotufzp1#
help(numpy.seterr)
将下溢描述为下溢:结果非常接近于零,导致某些精度丢失
这对应于
man feenableexcept
中更精确的描述:当结果必须表示为浮点数,但其绝对值小于最小的正规范化浮点数时(并且当表示为非规范化数字时会失去很多准确性),就会发生下溢异常。
零不是一个非正规化的数。零之后的下一个更高或更低的值将被反规格化。因此,如果启用它,将引发浮点异常。参见:什么是次正态浮点数?
下面的C代码也发出浮点异常信号:
如果你想跳过低于正常值,直接从零到
numpy.finfo('f8').smallest_normal
(2.2250738585072014e-308)