浮点 - NaN

时间:2013-05-10 22:21:14

标签: java floating-point nan floating-point-precision

我正在研究java的研究项目,其中必须进行一些艰难的计算。但是我完成了大部分工作,但仍然坚持了一点......我必须计算以下内容:

  

(2.1-2.3)上升到0.3。

但是我得到了答案NaN ..我已经尝试了包含floatdouble变量的商店结果,但是它显示了相同的结果。奇怪的是,当我使用计算器做同样的事情时,它显示了结果-0.430512

我无法弄清楚如何使它与java一起工作 代码是:

Math.pow((provider1[k][a][m]-provider1[k][j][m]),prior[k][m]);. 

如果上述值为2.1,则2.30.3 - NaN为输出。

但是,如果值为2.12.33,则会获得正确的值(-0.08)。有人可以帮忙如何做到这一点。

4 个答案:

答案 0 :(得分:4)

根据Math.pow Javadocs

  
      
  • 如果第一个参数是有限的且小于零   
        
    • 如果第二个参数是有限偶数,则结果等于结果   将第一个参数的绝对值提高到第二个参数的幂
    •   
    • 如果第二个参数是有限的奇数,则结果等于负数   将第一个参数的绝对值提高到幂的幂的结果   第二个论点
    •   
    • 如果第二个参数是有限的而不是整数,那么   结果是NaN
    •   
  •   

(强调我的)

那是因为raising a negative number to a non-integral power yields a complex number。一个案例无法取数字的平方根:(-1)^0.5。结果不存在于实数中,它激发了虚数i,其在数学中被定义为-1的平方根。通常,将负数提高到非整数幂会产生一个复数,即实数和虚数之和。

答案 1 :(得分:0)

对我来说看起来很复杂。

我的HP 15C科学计算器告诉我(-0.2)^ 0.3是一个错误。

您有时间购买新计算器。

答案 2 :(得分:0)

我希望将来可以帮助你或其他人:

下面的链接使用下面的示例来解释当您将负数基数提升为小数时所获得的复数解决方案背后的数学以及abs()如何帮助您。当您尝试使用标准Math。*函数时,它不知道如何处理解决方案的复杂部分。以Java为例,通过负基数和正小数指数进行计算,通常可以使用:

double d = Math.pow(base,exp);

然而,由于存在负基数和分数指数,因此会产生NaN,因为存在复杂的解。

如果解决方案的复杂部分对您无关紧要(就像我的情况一样),您可以使用这种方法。

本例中使用的等式是Yamada和Gunn对Rackett方程的修改中的参数“Phi”:

phi =(1-T / Tc)^(2/7) - (1-Tr / Tc)^(2/7)

double calculatePhi(double T, double Tr, double Tc){
  double l = T/Tc;
  double m = Tr/Tc;
  double n = 2/7.0;
  double q = (1-l);  //possibly negative
  double r = (1-m);  //possibly negative
  q = abs(q);
    double numa = Math.exp(n * Math.log(q));
  r = abs(r)
    double numb = Math.exp(n * Math.log(r));
  double phi = numa - numb;
  return phi;
}

请参阅此链接以获取数学证明:

A Programmatic Approach to Finding a Real Solution to a Function Having a Potentially Negative Base and Fractional Exponent

答案 3 :(得分:0)

一定是个错误。检查您正在使用的计算器。