np.exp()的数值问题

时间:2015-06-09 20:20:13

标签: python numpy floating-point

我有以下代码

x = -10
for i in range(2,10):
    print i, " | ",np.exp(-x**i)

使用以下输出:

2  |  3.72007597602e-44
3  |  inf
4  |  0.0
5  |  inf
6  |  0.0
7  |  inf
8  |  0.0
9  |  inf

为什么i偶数的结果为0,Inf的结果为i

3 个答案:

答案 0 :(得分:1)

双精度浮点值的最大值(numpy用于浮点运算)略低于1.8e308(1.8 * 10 ^ 308)。

表格中3的值为e^1000,WolframAlpha表示该值略小于2e434。问题是你想要使用的数字太大而不能处理numpy,所以对于奇数值,你会得到无穷大。

偶数的倒数是正确的;你计算的数字很小,以至于numpy必须将它视为零。

答案 1 :(得分:1)

简短回答

因为 x i x<如果 i 为偶数,则0 大于零;如果 i 为奇数,则小于零。由于指数函数会产生非常大或非常小的数字,具有非常大的正负输入,因此这些值将四舍五入为无穷大或零,这与IEEE-754数字的正常情况一样。

奇数

默认情况下,Python handles floating point编号为IEEE-754"双精度"。

双倍的极限在-1.7 * 10 308 和1.7 * 10 308 之间,上面和下面的所有内容都被认为是-Inf和{ {1}}。现在,如果您为+Inf计算此值,则会得到:

i=3

或大约1.9 * 10 434 ,明显高于阈值。对于每个奇数exp(-(-10**3))=exp(-(-1000))=exp(1000) i的结果为负数,因此-10**i的操作数为正数,您将获得高于阈值的值。

甚至

对于偶数值,这会导致:

exp

再次约为1.13 * 10 -4343

exp(-(-10**4))=exp(-10000) 可以表示的最小正值(大于零)是2 -53 。获得的值明显较低,所有正值均低于此 epsilon ;舍入为零,只是因为它是最接近的可表示值。

答案 2 :(得分:1)

由于x = -10x**i将在正值和负值之间交替显示,因此-(x**i)也是-x**i,这是np.exp(inf) = infnp.exp(-inf) = 0np.exp((-x)**i) }和var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; var ARGUMENT_NAMES = /([^\s,]+)/g; function getParamNames(func) { var fnStr = func.toString().replace(STRIP_COMMENTS, ''); var result = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(ARGUMENT_NAMES); if(result === null) result = []; return result; } 所以对于足够高的数字,你在无穷大和0之间交替。

你可能想写getParamNames(getParamNames) // returns ['func'] getParamNames(function (a,b,c,d){}) // returns ['a','b','c','d'] getParamNames(function (a,/*b,c,*/d){}) // returns ['a','d'] getParamNames(function (){}) // returns [] ,这会使权力指数始终为正。