2

この1人の人を助けてくれませんか。大きな小数(BigDecimal)のログを取得しようとしていますが、以下の例外エラーメッセージが表示されます。

Exception in thread "main" java.lang.NumberFormatException: Infinite or NaN

これは私が持っているものです:

BigDecimal num = new BigDecimal(totalDocuments/hitDocuments);
BigDecimal idf = new BigDecimal(Math.log(num.doubleValue()));
BigDecimal termF = new BigDecimal(terms.get(j).getTermFreq());
BigDecimal tfIdf = new BigDecimal(termF.doubleValue() * idf.doubleValue());
terms.get(j).setTfIdf(tfIdf.doubleValue());

2行目に例外があります。これを回避するにはどうすればよいですか?何卒よろしくお願い申し上げます。ちなみに、私はテキストファイルの「tf-idf」を計算しようとしています。

これが完全なコードです

File[] corpus = new File("files//").listFiles(); int totalDocuments = (corpus.length) - 1; //-1 for the suspect document.

    int hitDocuments = 1;
    for (int i = 0; i < corpus.length; i++) {
        ArrayList<String> corpusWords = getWords(corpus[i].getAbsolutePath());
        for (int j = 0; j < terms.size(); j++) {
            for (int k = 0; k < corpusWords.size(); k++) {
                if (terms.get(j).getTerm().equals(corpusWords.get(k))) {
                    hitDocuments++;
                }
            }
            //Update the tf-idf
            BigDecimal num = new BigDecimal(totalDocuments/hitDocuments);
            BigDecimal idf = new BigDecimal(Math.log(num.doubleValue()));
            BigDecimal termF = new BigDecimal(terms.get(j).getTermFreq());
            BigDecimal tfIdf = new BigDecimal(termF.doubleValue() * idf.doubleValue());
            terms.get(j).setTfIdf(tfIdf.doubleValue());
        }
    }

`

4

2 に答える 2

3

hitDocumentsまたはtotalDocuments(または両方)がDoubleであり、hitDocumentsが0.0であるように見えます。any / 0.0 = Double.Infinity(またはtotalDocumentsが0.0の場合はNaN)。どちらのログも取得できません。

于 2013-01-17T01:55:18.417 に答える
2

その場合、Math.log()numは戻ります0Infinite

引数が正のゼロまたは負のゼロの場合、結果は負の無限大になります。

于 2013-01-17T01:54:19.867 に答える