绝妙之处,没有使用循环。
chunli@chunli-Aspire-E1-471G:~/lab$ cat main.c
#include "stdio.h"
float SqrtByCarmack( float number )
{
int i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( int * ) &y;
i = 0x5f375a86 - ( i >> 1 );
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) );
y = y * ( threehalfs - ( x2 * y * y ) );
y = y * ( threehalfs - ( x2 * y * y ) );
return number*y;
}
int main()
{
printf("%f\n", SqrtByCarmack(998001));
printf("%f\n", SqrtByCarmack(99.99998));
printf("%f\n", SqrtByCarmack(3025));
printf("%f\n", SqrtByCarmack(1));
printf("%f\n", SqrtByCarmack(1.21));
printf("%f\n", SqrtByCarmack(1.5129));
printf("%f\n", SqrtByCarmack(1.522756));
printf("%f\n", SqrtByCarmack(1.52399025));
printf("%f\n", SqrtByCarmack(1.52413839));
printf("%f\n", SqrtByCarmack(1.52415568));
return 0;
}
chunli@chunli-Aspire-E1-471G:~/lab$ gcc -Wall main.c && ./a.out
999.000000
9.999999
55.000000
1.000000
1.100000
1.230000
1.234000
1.234500
1.234560
1.234567
chunli@chunli-Aspire-E1-471G:~/lab$