0

データ型long longの代わりに使用してアルゴリズムを高速化したい。double私のアルゴリズムは、directedの最短経路を見つけることですacyclic graph (DAG)。単純に、エッジの重みを追加し、"E: a->b" to bの新しい重みがb前の重みよりも小さい場合は、に設定されている親とともに更新されます。

つまり、私のアルゴリズムは単にいくつかの加算と比較の操作です。エッジの重みは元々"double"、ですが、それらを多数に乗算してにキャストすることは可能ですか"long long"。この調整によって私のプログラムがより速くなり、検討する価値がある場合。big doubleに丸めることによる不安定性の問題をどのように処理できますかlong long

ありがとう

4

1 に答える 1

1

i5 x64では、imulでさえ[2倍の乗算より]約40%高速であるように見えます。整数の加算も、より少ないサイクル/より良いスループットで発生するはずです。「不正確さ」の問題については、doubleは整数よりも不正確になる可能性があることに注意する必要があります。

10進数を浮動小数点に変換するときに問題が発生する数値を計算しますか?

元のデータにアクセスできる場合(たとえば、重みの10進数表現、10の累乗で乗算すると、丸めアーティファクトのない正確な整数が生成されます。長い場合、唯一の懸念事項はオーバーフローです。

起こりうる丸めの不安定性に対処する方法は、重みのダイナミックレンジと最大反復回数によって異なります。たとえば、重みがすべて1.0未満で2 ^ -52より大きい場合、2 ^ 52を掛けると、丸め誤差のない正確な整数が得られます。次に、「不安定性」はオーバーフローの可能性によって決定されます。(2 ^ 12 * 2 ^ 52)> = 2^64。

于 2013-02-05T06:47:43.063 に答える