2015-06-08 43 views
-2

所以,基本上我有这种算法,使用算术编码对单词进行编码。用百分比(字符串[] [] tabelaProbs和字(字符串palavra)矩阵如下:添加双打问题。算术编码

矩阵:

String tabelaProbs[][] = {{"A", "E", "I", "O", "U", "!"},{"0.2", "0.3", "0.1", "0.2", "0.1", "0.1"}}; 

字:

String palavra = "EAII!"; (in lower case: " e a i i ! ") 

的事情是,它的给我错误的结果,因为与双打的一些款项给出了错误的结果,这也影响最终结果也 最终结果(credencialCodificada)预计为:0.23354

任何人都可以帮忙吗?

public static double codificarCredenciaisAcesso(String[][] tabelaProbs, String palavra) { 
    double aux = 0; 
    String letra, palavraAux = ""; 
    int indice = 0; 

    double[] probabilidadesAux = new double[tabelaProbs[1].length + 2]; 
    probabilidadesAux[0] = 0; 
    for (int i = 0; i < tabelaProbs[1].length; i++) { 
     aux += Double.parseDouble(tabelaProbs[1][i].trim()); 
     probabilidadesAux[i + 1] = aux; 
    } 
    probabilidadesAux[probabilidadesAux.length - 1] = 1; 


    for (int indiceLetra = 0; indiceLetra < palavra.length(); indiceLetra++) { 
     letra = palavra.charAt(indiceLetra) + ""; 
     palavraAux += letra; 


     for (int iProb = 0; iProb < tabelaProbs[0].length; iProb++) { 
      if (letra.equalsIgnoreCase(tabelaProbs[0][iProb])) { 
       indice = iProb; 
       break; 
      } 
     } 

     double intervaloProb = probabilidadesAux[indice + 1] - probabilidadesAux[indice]; 
     for (int i = 0; i < probabilidadesAux.length; i++) { 
      if (indice == i) { 
       probabilidadesAux[0] = probabilidadesAux[indice]; 
       probabilidadesAux[probabilidadesAux.length - 1] = probabilidadesAux[indice + 1]; 
       aux = probabilidadesAux[0]; 
       for (int j = 1; j < probabilidadesAux.length - 1; j++) { 
        double probabilidadeX = Double.parseDouble(tabelaProbs[1][j - 1]); 
        probabilidadesAux[j] = aux + (probabilidadeX * intervaloProb); 
        aux = probabilidadesAux[j]; 
       } 
       break; 
      } 
     } 
    } 
    double credencialCodificada = probabilidadesAux[indice]; 

    return credencialCodificada; 
} 
+1

您的调试器显示了什么? –

+0

,在某些情况下,它会给出错误的结果。例如,如果总和为0.1 + 0.2,结果不会是0.3,而是0.30000004。它看起来很小,但它会影响最后的结果 –

回答

0

问题是双打的精度低于其总大小。所以3.0000004精确到4位小数点,但是它大于4位小数点。

这也是为什么你应该避免比较或分组的双打。

这里是谈论类似的东西的链接: how to fix double precision issue in java

+0

你有什么建议呢? –

+0

底部的链接解释它,另外的答案都建议使用BigDecimal,如果你真的需要 – Jacob

0

例如,如果你总结0.1 + 0.2的结果不会是0.3,而是像0.30000004。它看起来很小,但会影响最终结果

如果你想要任意精度的浮点值,我建议你使用BigDecimal,这是java.math中的一个类。关于它的更多信息here()