我想用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 = 6930 , trueN = 6924 , falseP = 0,falseN = 0 ,此代码的输出为3629.03401901938 。 我已经计算了 excel 中的Phi系数,它为相同的值返回值 1
什么是错的?
任何帮助都将受到高度赞赏
答案 0 :(得分:10)
我可以复制此错误,但仅当trueP
,trueN
,falseP
和falseN
为int
时。
如果它们是int
s,那么此行会溢出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 :(得分:3)
如果每个变量都是double,则代码会生成所需的输出1.0:
只需编译并运行以下java类,该类将您想要分配的值分配给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