等式-e ** - (( - log(7)/100.0)*(100-x))+ 7返回NaN

时间:2013-11-07 06:45:07

标签: java python nan curve algebra

我正在尝试将此曲线作为我正在进行的小型游戏的练级系统的一部分。公式如下

f(x) = -e^-((-log(7)/100)*(100-x))+7

在python中可以定义为

f=lambda x:-e**-((-log(7)/100.0)*(100-x))+7

在Python控制台中运行此函数会返回预期的值。我将它移植到Java,它采用以下形式:

public static double f(float x) {
    return (Math.pow(-Math.E, -((-Math.log(7)/100)*(100-x)))+7);
}

然而,神秘的是,这总是返回NaN。我之前从未遇到过这个问题,发生了什么事?

3 个答案:

答案 0 :(得分:5)

请参阅Math#pow

  

如果第一个参数是有限的且小于零那么   如果第二个参数是有限的并且不是整数,那么   结果是 NaN

在你的情况下......就是这样。

总是看文档,它们为您节省了大量时间。

答案 1 :(得分:5)

(把我的评论作为答案)

表达式不一样。在python中它看起来像-(e**someNum)。在java中,它看起来像(-e)**someNum

考虑一下(以一种非常原始的方式),当你将一个负数多次无理解时你会得到什么。这就是为什么你得到一个NaN。


您在Java中想要的是:

public static double f(float x) {
    return 7 - Math.pow(Math.E, -((-Math.log(7)/100)*(100-x)));
}

答案 2 :(得分:1)

这样做的原因是,如果你对非整数的幂进行任何负数,那么你就是把它的根源放在某个地方。例如,-e ^ .5与-e的平方根相同,-e ^ 1.5与-e,squareed的平方根相同。

真的,你需要编辑你对这个功能的真实想法:

f(x) = -e^-((-log(7)/100)*(100-x))+7 

因为它实际上是:

f(x) = -(e^-((-log(7)/100)*(100-x)))+7

请记住,一元运算符优先于偶数指数:-e在e ^ x之前计算。