1

Java で混同行列 2 x 2 の Phi 係数を計算したいのですが、これまでのコードは以下のとおりです。

double str= (trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);
               double output= Math.sqrt(str);
                if (output!= 0.0)
                return (trueP * trueN) / output;
            else return 0.0;

trueP =6930trueN=6924falseP=0 、 falseN = 0の場合、このコードの出力は 3629.03401901938 です。Excelでファイ係数を計算しましたが、同じ値に対して値1が返されます

何が間違っているのですか?

どんな助けでも大歓迎です

4

2 に答える 2

10

truePこのエラーを再現できますが、 、trueNfalseP、およびfalseNints の場合のみです。

それらが の場合、この行は に割り当てる前にintの範囲をオーバーフローします。intdouble

double str= (trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);

この値は、 よりも大きく、20 億より少し大きい ( )である1.74822976E8べき場合のみです。2.3023989982224E15Integer.MAX_VALUE2E9

最初の値を a にキャストして、有効な値の範囲がはるかに広いdoubleため、式全体で浮動小数点演算を強制します。double

double str= ( (double) trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);

これを行うと、目的の の出力が得られます1.0

全体として有効な計算を行うには、double4 つの変数すべてに s を使用します: truePtrueNfalseP、およびfalseN

于 2015-03-06T19:19:34.350 に答える
3

すべての変数が double の場合、コードは目的の出力 1.0 を生成します。

trueP、trueN、falseP、および falseN に割り当てたい値を割り当てる次の Java クラスをコンパイルして実行するだけです。

class confusion {
    public static void main(String[] args) {
    double trueP=6930;
    double trueN=6924;
    double falseP=0;
    double falseN=0;
    double str= (trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);
               double output= Math.sqrt(str);
                if (output!= 0.0) {
                    double output2 =(trueP * trueN) / output;
                    System.out.println(output2);
            }
                else  {
                System.out.println(output); // Display the string.
            }
    }
}

その理由は、 double がケースに十分な大きさの最大値を保持できるためです。

static double   MAX_VALUE
A constant holding the largest positive finite value of type double, (2-2-52)·21023.

ここでわかるように: http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html

于 2015-03-06T19:23:17.887 に答える