我正在尝试将这条曲线作为我目前正在开发的小游戏的练级系统的一部分来实现。等式如下
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
.我以前从未遇到过这个问题,这是怎么回事?
(把我的评论作为答案)
表达式不一样。在蟒蛇中,它看起来像-(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)));
}
请参阅Math#pow
:
如果第一个参数是有限的并且小于零,则 如果第二个参数是有限的而不是整数,则 结果是 NaN。
在你的情况下......就是这样。
始终查看文档,它们可以为您节省大量时间。
这样做的原因是,如果你对非整数的幂做任何负数,你就是在沿着这条线的某个地方取它的根。例如,-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 之前计算。