別の開発者が、文字列化された倍精度文字列を含む一連の文字列を返すアルゴリズムを私に与えました。これらの文字列出力に対して単体テストを構築しています。私が単位テストを実行する時間の約80%がすべて合格します。返された文字列の二重の部分には、時間のわずか20%のばらつきが発生します。たとえば:実行間の二重計算のわずかな違い
Expected: ((B,D),(C,A)); : 0.05766153477579324
Found: ((B,D),(C,A)); : 0.05766153477579325
Expected: (B,(C,(A,D))); : 0.0017518688483315935
Found (B,(C,(A,D))); : 0.001751868848331593
私は、二重計算が不正確であることができることを知っているが、私は彼らがバリアントであることの聞いたことがありません。アルゴリズム作成者は、アルゴリズムが決定論的であると確信しています。 doubleがtoStringedされる方法は次のとおりです。
for(Tree gt: geneTrees){
double prob = probList.next();
total += prob;
result.append("\n" + gt.toString() + " : " + prob);
}
私はこの変化がどのように可能か説明します。何か案は?
あなたはに*、あなたが実行間同じ入力を取得することを確認するために、文字列の入力を記録することができます同じ注文*? –
異なる注文がどれほど変わるかを確認するhttp://vanillajava.blogspot.co.uk/2012/03/different-results-summing-double.html 1001個の値をランダムな順序で追加し、1000個以上の異なる合計を生成します。 ;) –