64ビット範囲の素数を計算するアプリケーションを作成したので、sqrt
関数を使用して64ビット数の平方根を計算しようとするとmath.h
、たとえば入力が~0ull
答えである場合、答えは正確ではないことがわかりまし~0u
た。私が得0x100000000
たものは正しくないので、これがバグであるかどうかを確認するために、アセンブリx86言語を使用して独自のバージョンを作成することにしました。これが私の関数です。
inline unsigned prime_isqrt(unsigned long long value)
{
const unsigned one = 1;
const unsigned two = 2;
__asm
{
test dword ptr [value+4], 0x80000000
jz ZERO
mov eax, dword ptr [value]
mov ecx, dword ptr [value + 4]
shrd eax, ecx, 1
shr ecx, 1
mov dword ptr [value],eax
mov dword ptr [value+4],ecx
fild value
fimul two
fiadd one
jmp REST
ZERO:
fild value
REST:
fsqrt
fisttp value
mov eax, dword ptr [value]
}
}
入力は、平方根を取得するための奇数です。同じ入力で関数をテストすると、結果は同じでした。
私が得られないのは、なぜそれらの関数が結果を丸めるのか、具体的にはsqrt
命令が結果を丸めるのかということです。