uint32_t sqrt_32(uint32_t M)
{
uint32_t N, i;
uint32_t tmp, ttp;
if (M == 0)
{
return 0;
}
N = 0;
tmp = (M >> 30);
M <<= 2;
if(tmp > 1)
{
N++;
tmp -= N;
}
for (i = 15; i > 0; i--)
{
N <<= 1;
tmp <<= 2;
tmp += (M >> 30);
ttp = N;
ttp = (ttp << 1) + 1;
M <<= 2;
if (tmp >= ttp)
{
tmp -= ttp;
N++;
}
}
return N;
}
//H是64位整数的高32位,L是64位整数的低32位
uint32_t sqrt_64(uint32_t h, uint32_t l)
{
uint32_t N, i;
uint32_t tmp, ttp;
if (h == 0)
{
return sqrt_32(l);
}
else
{
N = 0;
tmp = (h >> 30);
h <<= 2;
if (tmp > 1)
{
N++;
tmp -= N;
}
for (i = 15; i > 0; i--)
{
N <<= 1;
tmp <<= 2;
tmp += (h >> 30);
ttp = N;
ttp = (ttp << 1) + 1;
h <<= 2;
if (tmp >= ttp)
{
tmp -= ttp;
N++;
}
}
for (i = 16; i > 0; i--)
{
N <<= 1;
tmp <<= 2;
tmp += (l >> 30);
ttp = N;
ttp = (ttp << 1) + 1;
l <<= 2;
if (tmp >= ttp)
{
tmp -= ttp;
N++;
}
}
return N;
}
}
用法:
uint64_t a=9999999800000001;
uint32_t B= 0;
B = sqrt_64(((a>>32)&0xFFFFFFFF),(a&0xFFFFFFFF));
原文:https://www.cnblogs.com/Tearsly/p/10880732.html