了解了浮点数的存储以及手算平方根的原理,我们可以考虑程序实现了。
先实现一个64位整数的平方根,根据之前的手算平方根,程序也不是那么难写了。
#include
uint64_t _sqrt_u64(uint64_t a)
{
int i;
uint64_t res;
uint64_t remain;
//0的平方根是0,特殊处理一下
if(a == 0ull)
return 0ull;
//找到最高位的1,并且产生平方根结果最高位的1
for(i=62;;i-=2)
if(a&(3ull<
res = 1ull;
remain = ((a&(3ull<>i) - 1ull;
i -= 2;
break;
}
//根据手算平方根的原理,依次产生各位结果
for(;i>=0;i-=2) {
//右移动两位,并把a接着的两位并入remain
remain = (remain<<2)|((a&(3ull<>i);
if(((res<<2)|1ull) <= remain) {
//产生新一位的1
remain = remain - ((res<<2)|1ull);
res = (res<<1)|1ull;
} else {
//产生新一位的0
res <<= 1;
}
}
return res;
}
其实,可以合在一起写,代码会短一些,但效率会低那么一点点,而且编译器应该不太容易优化。
#include
uint64_t _sqrt_u64(uint64_t a)
{
int i;
uint64_t res;
uint64_t remain;
res = remain = 0ull;
for(i=62;i>=0;i-=2) {
remain = (remain<<2)|((a&(3ull<>i);
if(((res<<2)|1ull) <= remain) {
remain = remain - ((res<<2)|1ull);
res = (res<<1)|1ull;
} else {
res <<= 1;
}
}
return res;
}
不过,我们不需要这个结果。
为了验证其正确性,我们来写个C语言的main
#include
#include
#include
ui