私はフロートのマップ上で線形結合を計算するいくつかのコードを持っていて、コピーコンストラクタを使用するという面白い副作用がありました。Java HashMapコピーコンストラクタが浮動小数点精度に影響するのはなぜですか?
私は2つのマップ内の値の線形結合を計算し、2つのコピーそれらのマップの内の値を使用して計算線形結合と比較した場合、計算は実際に10 ^の周辺に(わずかに異なってい-7 )結果は浮動小数点精度と思われるために発生します。
どうしてですか?
はここにいくつかのサンプルコードです:
import java.util.*;
public class WTF {
public static void main(String[] args) {
Random rand = new Random();
for (int c = 0; c < 1000; c++) {
Map<String, Float> weights = new HashMap<String, Float>();
Map<String, Float> values = new HashMap<String, Float>();
for (int j = 0; j < 10; j++) {
weights.put("sig" + j, Float.valueOf(rand.nextFloat()));
values.put("sig" + j, Float.valueOf(rand.nextFloat()));
}
Map<String, Float> weightsCopy = new HashMap<String, Float>(weights);
Map<String, Float> valuesCopy = new HashMap<String, Float>(values);
float score1 = getScore(weights, values);
float score2 = getScore(weightsCopy, valuesCopy);
if (score1 != score2) {
System.out.println(score1-score2);
}
}
}
public static float getScore(Map<String, Float> weights, Map<String, Float> values) {
float score = 0.0f;
for (String name : weights.keySet()) {
Float weight = weights.get(name);
Float value = values.get(name);
score += weight.floatValue() * value.floatValue();
}
return score;
}
}
UPDATE:
同じ問題がまたputAll
操作に適用されます。それを使用してHashMap
を「コピー」すると、同じ浮動小数点精度の問題が発生します。
このコードは、具体的には 'for'ループを含む、コンパイルされません。コンパイルしたサンプルを投稿できますか? (質問の答えについての理論はありますが、最初に検証したいと思います) –
あなたのコードは現在コンパイルされていません。 'main'の' for'ループはどちらも壊れています。 (あなたは*どんなマップにも何も追加していません...)それらを修正できますか? –
マップに入力するコードは表示されません。 –