1. 程式人生 > >C語言中超過32位數據的開方

C語言中超過32位數據的開方

超過 語言 64位 bsp 用法 += 位數 for return

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));

C語言中超過32位數據的開方