常见Math运算的实现
1. 不用+实现加法
*思路:将数转为二进制,进行加法,发现分为两步,相加(不进位,用异或^)与进位(用相与&)
int Add(int a, int b) {
int sum = 0;
int a_copy = a;
int b_copy = b;
int carry = 0;
do
{
sum = a_copy ^ b_copy;
//carry is produced with moving upper
carry = (a_copy & b_copy) << 1;
a_copy = sum;
b_copy = carry;
} while (b_copy);
return sum;
}
2. 不用库函数实现开方
常见思路有:二分法,牛顿法等
//二分法实现
//另一种
double Sqrt(double A)
{
double a = 0.0, b = A + 0.25, m; // b = A 是错误的上界
// while(b - a > 2*DBL_EPSILON) { // sometimes dead cycle when m==a or m==b.
for(;;) {
m = (b + a)/2;
if( m-a < DBL_EPSILON || b-m < DBL_EPSILON ) break;
if( (m*m - A) * (a*a - A) < 0 ) b = m;
else a = m;
}
return m;
}