5

我正在尝试将这条曲线作为我目前正在开发的一个小游戏的调平系统的一部分来实现。方程如下

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。我以前从来没有遇到过这个问题,这是怎么回事?

4

3 回答 3

5

Math#pow

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

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

始终查看文档,它们可以为您节省大量时间。

于 2013-11-07T06:50:37.733 回答
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)));
}
于 2013-11-07T06:59:42.813 回答
1

这样做的原因是,如果你对一个非整数的幂做任何负数,你就是在沿着这条线的某个地方取它的根。例如,-e ^ .5 与 -e 的平方根相同,-e ^ 1.5 与 -e 的平方根相同,立方。

真的,你需要编辑你对函数的真实想法:

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

因为它实际上是:

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

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

于 2013-11-07T07:02:48.747 回答