在Java

时间:2018-05-02 16:04:06

标签: java runtime-error nan

我正在大学从事项目工作,面临严重问题。实际上,我的代码是总结了2个变量,以便之后做一些工作。正如我将在下面显示的那样,列表不是空的,代码从列表中提取值,但是虽然但它没有递增计数器。如果有人能给我一些帮助,我会表示赞同。

        //CHeck if we have already imported data, if yes we use it, unless we import
        if ((this.stockHistory != null) && (!(this.stockHistory.isEmpty())))
          {
            evolution = this.stockHistory;

          }
        else 
          {
            evolution = getHostoricalData(cloned);
          }
        // Here I am sure the list ( evolution ) is not empty, in my case it has 63 elements
        double spot ;
        double sommeTendance = 0 ;
        double sommeVarianceQuotidienne = 0 ;
        for (int i=0;i<evolution.size()-1; i++)
            {
                double i1 =evolution.get(i+1) ;
                System.out.println(" i1 = " + i1);
                double i0 = evolution.get(i) ;
                System.out.println("i0 is " + i0);
                sommeTendance+= Math.log(i1/i0);
                System.out.println("tendance == " +sommeTendance);
                sommeVarianceQuotidienne += Math.pow(Math.log(i1/i0),2);
                System.out.println("variance daily  == " + sommeVarianceQuotidienne);
            }
        System.out.println("size == " + evolution.size());
        System.out.println("total tendance == " + sommeTendance);
        System.out.println("total daily variance == " + sommeVarianceQuotidienne);

这是输出的最后一行

16:59:52,524 INFO  [stdout] (default task-62)  i1 = 51.619999
16:59:52,524 INFO  [stdout] (default task-62) i0 is 52.73
16:59:52,524 INFO  [stdout] (default task-62) tendance == NaN
16:59:52,524 INFO  [stdout] (default task-62) variance daily  == NaN
16:59:52,524 INFO  [stdout] (default task-62)  i1 = 53.330002
16:59:52,524 INFO  [stdout] (default task-62) i0 is 51.619999
16:59:52,525 INFO  [stdout] (default task-62) tendance == NaN
16:59:52,525 INFO  [stdout] (default task-62) variance daily  == NaN
16:59:52,525 INFO  [stdout] (default task-62) size == 63
16:59:52,525 INFO  [stdout] (default task-62) total tendance == NaN
16:59:52,525 INFO  [stdout] (default task-62) total daily variance == NaN

2 个答案:

答案 0 :(得分:0)

首先,您需要了解NaN代表什么。 Nan代表Not a Number。

你是如何得到NaN的?

  

如果浮点运算有一些输入,则会产生“Nan”   导致操作产生一些未定义结果的参数。

什么可能导致NaN?

  

例如,0.0除以0.0是算术上未定义的。查找   出现负数的平方根也是未定义的。

另外,

  

使用NaN作为操作数的所有数值运算都会产生NaN。   这背后的原因是NaN是无序的,所以进行数字比较   涉及一个或两个NaN的操作返回false。

由于我们完全了解NaN,现在让我们解决这个问题。

在您的情况下,NaN由Math.log(i1/i0);生成 对数函数未在(-oo,0)上定义。因此,作为参数Math.log(i1/i0);输入的每个负数将在java中返回NaN作为结果。

你能做什么?

- &GT;在i1 / i0上作为Math.log()

中的参数传递之前构建一个微小的测试

建议:

for (int i=0;i<evolution.size()-1; i++)
    {
        double i1 =evolution.get(i+1) ;
        double i0 = evolution.get(i) ;
        if (i1/i0>0)
        {
            //you are good 
            sommeTendance+= Math.log(i1/i0);
            sommeVarianceQuotidienne += Math.pow(Math.log(i1/i0),2);
        }
        else
        {
            //you are not good, the number will yield an undefined result 
            //do something else... like displaying an error....?
            System.out.println("Math.log will yield into an undefined result. Please check your input");
        }
    }

有用的链接:

希望这有帮助。

答案 1 :(得分:-1)

sommeTendance+= Math.log(i1/i0);

Math.log(double)说:

  

如果参数为NaN或小于零,则结果为NaN。

您的计算Math.log(51.619999 / 52.73)= Math.log(0.9789493457234971)= -0.00924061245 = NaN(小于零)