在 Java 中计算一个 Phi 系数
Calculate a Phi coefficient in Java
我想为混淆矩阵 2 x 2 计算 Java 中的 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=6930、trueN=6924、falseP=0 和 falseN = 0,这段代码的输出是3629.03401901938。
我计算了 excel 中的 Phi 系数,它 returns 值 1 相同的值
哪里错了?
任何帮助将不胜感激
我可以重现此错误,但前提是 trueP
、trueN
、falseP
和 falseN
是 int
。
如果是int
,那么这一行就溢出了int
的范围,才可以赋值给double
.
double str= (trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);
这个值只有1.74822976E8
,应该是2.3023989982224E15
,比Integer.MAX_VALUE
大,比20亿多一点(2E9
)。
将第一个值转换为 double
以强制对整个表达式进行浮点运算,因为 double
的有效值范围更大。
double str= ( (double) trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);
当我这样做时,我得到了你想要的输出1.0
。
为确保整个计算有效,对所有 4 个变量使用 double
:trueP
、trueN
、falseP
和 falseN
。
如果每个变量都是双倍的,您的代码会产生所需的输出 1.0 :
只需编译和运行下面的java class,它将您想要分配的值分配给 trueP、trueN、falseP 和 falseN:
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
我想为混淆矩阵 2 x 2 计算 Java 中的 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=6930、trueN=6924、falseP=0 和 falseN = 0,这段代码的输出是3629.03401901938。 我计算了 excel 中的 Phi 系数,它 returns 值 1 相同的值
哪里错了?
任何帮助将不胜感激
我可以重现此错误,但前提是 trueP
、trueN
、falseP
和 falseN
是 int
。
如果是int
,那么这一行就溢出了int
的范围,才可以赋值给double
.
double str= (trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);
这个值只有1.74822976E8
,应该是2.3023989982224E15
,比Integer.MAX_VALUE
大,比20亿多一点(2E9
)。
将第一个值转换为 double
以强制对整个表达式进行浮点运算,因为 double
的有效值范围更大。
double str= ( (double) trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);
当我这样做时,我得到了你想要的输出1.0
。
为确保整个计算有效,对所有 4 个变量使用 double
:trueP
、trueN
、falseP
和 falseN
。
如果每个变量都是双倍的,您的代码会产生所需的输出 1.0 :
只需编译和运行下面的java class,它将您想要分配的值分配给 trueP、trueN、falseP 和 falseN:
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