梁不正 2015-07-30 10:47 采纳率: 18.2%
浏览 1589

java 与 php 计算结果的差异

计算矩阵权重的一个方法
输入的矩阵都是
{ 0,2, 6, 1,-7},
{-2,0,-5, 0,-5}
{-6,5, 0, 8, 1}
{-1,0,-8, 0, 7}
{ 7,5,-1,-7, 0}


这是java的计算代码
static double[] weights=new double weights[5];
private double computeCIandWeights(int[][] matrix) {
double totalWeight = 0;
for (int i = 0; i < weights.length; i++) {
weights[i] = 1;
for (int j = 0; j < weights.length; j++)
weights[i] *= decode(matrix[i][j]);
weights[i] = Math.pow(weights[i], (double)1/weights.length);
totalWeight += weights[i];
}
for (int i = 0; i < weights.length; i++)
weights[i] /= totalWeight;
double eig = 0;
for (int i = 0; i < weights.length; i++) {
double part = 0;
for (int j = 0; j < weights.length; j++)
part += decode(matrix[i][j])*weights[j];
part /= weights[i]*weights.length;
eig += part;
}
return (eig-weights.length)/(weights.length-1);
}

    private double decode(int num) {
        if (num < 0)
            return (double)1/(1-num);
        else
            return num+1;
    }

    然后结果是

CI=0.097302165775079
weights:0.10850015438106028
weights:0.056125161448460546
weights:0.45493710163432743
weights:0.06991685010726335
weights:0.3105207324288884
------------------------------------------------------------------------------------
这是php的计算代码

function computeCIandWeights($matrix,&$weights){
$totalWeight=0.0;
$len=5;
for($i=0;$i<$len;$i++){
$weights[$i]=1;
for($j=0;$j<$len;$j++){
$weights[$i]*=decode($matrix[$i][$j]);
}
$weights[$i]=pow($weights[$i],doubleval(1/$len));
$totalWeight +=doubleval($weights[$i]);
}
for($i=0;$i<$len;$i++){
$weights[$i]/=$totalWeight;
}
$eig=0.0;
for($i=0;$i<$len;$i++){
$part=0.0;
for ($j=0;$j<$len;$j++){
$part+=decode($matrix[$i][$j])*$weights[$j];
}
$part/=$weights[$i]*$len;
$eig+=$part;
}
return ($eig-$len)/($len-1);
}
function decode($num){
if($num<0){
return doubleval(1/(1-$num));
}else{
return $num+1;
}
}

$ci=computeCIandWeights($inputMatrix, $weights);
echo 'ci='.$ci.'.
';
for($i=0;$i echo 'weights='.$weights[$i].'.
';
}

结果是
ci=0.0973021657751.
weights=0.106290974412.
weights=0.0549823927295.
weights=0.445674092399.
weights=0.0631581840822.
weights=0.329894356377.

权重的计算结果到小数点后第三位就不一样了。
这种误差属于正常吗?
误差产生的原因是不是与浮点数的计算有关?

  • 写回答

1条回答 默认 最新

  • devmiao 2015-07-30 22:09
    关注

    weights[i] = Math.pow(weights[i], (double)1/weights.length);
    weights[i] = Math.pow(weights[i], (double)1/(double)weights.length);
    否则是整除
    别的一样修改

    评论

报告相同问题?

悬赏问题

  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 请求分析基于spring boot+vue的前后端分离的项目
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?