我创建了一个应用程序来计算64位范围内的素数,所以当我尝试使用i的sqrt函数计算64位数的平方根时,math.h发现答案是不准确的,例如当输入是~0ull答案应该是~0u但是我得到的是0x100000000哪个不对,所以我决定用汇编x86语言创建我自己的版本,看看这是不是一个bug,这是我的函数:
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 …Run Code Online (Sandbox Code Playgroud)