我有以下代码
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
?
答案 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 = -10
,x**i
将在正值和负值之间交替显示,因此-(x**i)
也是-x**i
,这是np.exp(inf) = inf
时np.exp(-inf) = 0
。np.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 []
,这会使权力指数始终为正。