我正在大学从事项目工作,面临严重问题。实际上,我的代码是总结了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
答案 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(小于零)