(64 ビット) 整数の平方根を計算する x86 アセンブリ言語 (MASM32) で Windows 用の単純な素数性テスター プログラムをコーディングしています。私の質問は次のとおりです。平方根を取得する簡単な方法はありますか? ADD/SUB/DIV/MUL 命令を組み合わせて使用する必要がありますか?
これを C 言語で実現する方法についていくつかの情報を見つけましたが、ここで何か不足しているのではないかと思っています。
(64 ビット) 整数の平方根を計算する x86 アセンブリ言語 (MASM32) で Windows 用の単純な素数性テスター プログラムをコーディングしています。私の質問は次のとおりです。平方根を取得する簡単な方法はありますか? ADD/SUB/DIV/MUL 命令を組み合わせて使用する必要がありますか?
これを C 言語で実現する方法についていくつかの情報を見つけましたが、ここで何か不足しているのではないかと思っています。
最も簡単な方法は、次のように FPU 命令を使用することだと思いますfsqrt
。
.data?
int64 dq ?
squareRoot dd ?
.code
fild int64 ;load the integer to ST(0)
fsqrt ;compute square root and store to ST(0)
fistp squareRoot ;store the result in memory (as a 32-bit integer) and pop ST(0)
FSQRT命令を使用する以外の意味ですか?確かに、それは浮動小数点ですが、変換を行うのに十分簡単なはずです。それ以外の場合は、ニュートン法のようなものを使用する必要があります。
数値の平方根を計算するためのアルゴリズムと手法は多数あります。実際、ニュートン-ラフソン法を使用して平方根を計算することは、方程式の根を見つける一般的なケースの例として、数値解析の学生にとって標準的な課題です。
コードのプロファイリングとベンチマークを行わずに、単一または複数の平方根 (SSE/SSE2 などによる SIMD 計算) が必要かどうかを把握していない場合は、x87 FPU命令を使用する @Smi の回答FSQRT
から始めることをお勧めします。 . これにより、ロード/ストア ヒット(簡単な要約: FPU と CPU の ALU の間を移動するとキャッシングとパイプラインが中断される) が発生し、組み込みの FPU 命令を使用する利点が無効になる可能性があります。
あなたがプライムテストについて言及したので、sqrtは候補番号ごとに1回だけ使用されて検索範囲を決定すると推測しています(自明でない要因は2 <= f <= sqrt(n)の間で、nは数値ですプライム性についてテスト済み)。素数について特定の数値のみをテストする場合は問題ありませんが、多数の数値を検索する場合は、候補ごとに平方根を実行します。「古典的な」テスト(前楕円曲線)を行っている場合は、気にする必要はないかもしれません。