【发布时间】:2012-05-30 11:55:20
【问题描述】:
我创建了一个应用程序来计算 64 位范围内的素数,所以当我尝试使用来自 math.h 的 sqrt 函数计算 64 位数的平方根时,我发现答案不准确,例如当输入是~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 指令会舍入结果?
【问题讨论】:
标签: c++ assembly x86 standard-library x87