Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中双精度的加法和除法_Java_Double_Division_Ejml - Fatal编程技术网

Java中双精度的加法和除法

Java中双精度的加法和除法,java,double,division,ejml,Java,Double,Division,Ejml,我在项目中使用EJML库。我编写了一个计算SimpleMatrix行向量方差的方法。在某种程度上,我注意到,当将相等元素向量传递给此方法时,我得到的方差>0.0 我写这篇文章是为了进一步调查,并惊讶地发现最后一行打印错误,尽管前一行没有输出 // rowVec is a 1xn SimpleMatrix of equal double elements double one = rowVec.get(0); for (int i = 0; i < rowVec.getNumElements

我在项目中使用EJML库。我编写了一个计算SimpleMatrix行向量方差的方法。在某种程度上,我注意到,当将相等元素向量传递给此方法时,我得到的方差>0.0

我写这篇文章是为了进一步调查,并惊讶地发现最后一行打印错误,尽管前一行没有输出

// rowVec is a 1xn SimpleMatrix of equal double elements
double one = rowVec.get(0);
for (int i = 0; i < rowVec.getNumElements(); i++) {
    if (rowVec.get(i) - one != 0 || rowVec.get(i) != one) {
        System.out.println(rowVec.get(i)); // no output here
    }
}
// why false below???
System.out.println(one == (rowVec.elementSum() / rowVec.getNumElements()));
// why true below???
System.out.println(one*rowVec.getNumElements() < rowVec.elementSum());
//rowVec是由相等的双元素组成的1xn SimpleMatrix
double one=rowVec.get(0);
对于(int i=0;i
有人能解释一下为什么一个相等元素向量的平均值大于它的一个元素吗

跟进:通过以下方式解决了我的问题:

/**
 * Calculates the variance of the argument matrix rounding atoms to the 10th
 * significant figure.
 */
public static double variance(SimpleMatrix m) {
    Preconditions.checkArgument(m != null, "Matrix argument is null.");
    Preconditions.checkArgument(m.getNumElements() != 0, "Matrix argument empty.");
    if (m.getNumElements() == 1) return 0;

    double mean = m.elementSum() / m.getNumElements();
    double sqDiviations = 0;
    for (int i = 0; i < m.getNumElements(); i++) {
        sqDiviations += Math.pow(decimalRoundTo(mean - m.get(i), 10), 2);
    }
    return sqDiviations / m.getNumElements();
}

/** Rounds a double to the specified number of significant figures. */
public static double decimalRoundTo(double d, int significantFigures) {
    double correctionTerm = Math.pow(10, significantFigures);
    return Math.round(d * correctionTerm) / correctionTerm;
}
/**
*计算将原子四舍五入到第10位的参数矩阵的方差
*重要数字。
*/
公共静态双方差(SimpleMatrix m){
checkArgument(m!=null,“矩阵参数为null”);
先决条件.checkArgument(m.getNumements()!=0,“矩阵参数为空”);
如果(m.getNumements()==1)返回0;
双平均值=m.elementSum()/m.GetNumements();
双平方分=0;
对于(int i=0;i
浮点运算是不精确的。当您将
n
idential
double
s相加,并将结果除以
n
时,您并不总能得到开始时的数字

例如,以下各项:

double x = 0.1;
double y = x + x + x;
System.out.println(y / 3. - x);
印刷品

1.3877787807814457E-17

我强烈推荐。

浮点运算是不精确的。当您将
n
idential
double
s相加,并将结果除以
n
时,您并不总能得到开始时的数字

例如,以下各项:

double x = 0.1;
double y = x + x + x;
System.out.println(y / 3. - x);
印刷品

1.3877787807814457E-17

我强烈建议。

在这种情况下,我应该如何在5位有效数字内工作?@suxumuxu:这取决于执行计算的更广泛背景,所以只有你才能回答这个问题。@suxumuxu取差,对其进行Math.abs运算,得到一个正数,并检查它是否小于某个treshold,我想。我想我应该再找一点:]答案现在似乎有点明显,让我为占用你10分钟的时间感到抱歉。谢谢。在这种情况下,我应该如何在5位有效数字范围内工作?@suxumuxu:这取决于你执行计算的更广泛的背景,所以只有你才能回答这个问题。@suxumuxu取差值,对其进行Math.abs运算,得到一个正数,并检查它是否小于某个treshold,我想。我想我应该再找一点:]答案现在似乎有点明显,让我为占用你10分钟的时间感到抱歉。谢谢