超快速开平方0x5f3759df算法探究

来源:互联网 发布:alpine linux 添加源 编辑:程序博客网 时间:2024/05/16 14:19

这里写图片描述
这里写图片描述
这里写图片描述
4
5
6
这里写图片描述
这里写图片描述
9
这里写图片描述
这里写图片描述
这里写图片描述
13
这里写图片描述
这里写图片描述
这里写图片描述

//$0x5f337b4a$算法的C语言实现与速度测试}#include<stdio.h>#include<time.h>#include<stdio.h>#define N 100000#include<math.h>float Q_tsqrt(float number){    long i;    float x2,y;    const float threehalfs=1.5F;    x2=number*0.5F;    y=number;    i=*(long *)&y;    //i=0x5f3759df-i/2;    i=0x5f337b4a-i/2;    //i=0x54a352a8-i/3;    y=*(float *)&i;//  y=y*(threehalfs-(x2*y*y));//  y  = y * ( threehalfs - ( x2 * y * y ) );//  y  = y * ( threehalfs - ( x2 * y * y ) );//    return y;}int main(){    int k;    float j;long double i;clock_t start, finish; double time;start = clock(); for(k=0;k<N;k++){    j=1/Q_tsqrt(k);     printf("%f\n",j);} /*for(k=0;k<N;k++){    j=sqrt(k);     printf("%f\n",j);}   */finish = clock(); time = (double)(finish - start) / CLOCKS_PER_SEC; //printf("i的值为%lf\n",i);printf( "运行时间为\n%f 秒\n",time);//显示    return 0;} 
//牛顿迭代法开方#include<stdio.h>#include<time.h>#include<stdio.h>#define N 50000#include<math.h>float a[1000];float newton_sqrt(int c){    int k=2;    a[0]=5.0;    a[1]=0.5*(a[0]+c/a[0]);    while(a[k]-a[k-1]<0.1){        a[k]=0.5*(a[k-1]+c/a[k-1]);        k++;    }       return a[k-1];}int main(){    int k;    float j;long double i;clock_t start, finish; double time; start = clock(); for(k=0;k<N;k++){    j=newton_sqrt(k);     printf("%f\n",j);} finish = clock(); time = (double)(finish - start) / CLOCKS_PER_SEC; printf( "运行时间为\n%f 秒\n",time);//显示    return 0;} 
//$sqrt()$速度测试#include<stdio.h>#include<time.h>#include<stdio.h>#define N 100#include<math.h>int main(){    int k;    float j;long double i;clock_t start, finish; double time; start = clock(); for(k=0;k<N;k++){    j=sqrt(k);     printf("%f\n",j);} finish = clock(); time = (double)(finish - start) / CLOCKS_PER_SEC; printf( "运行时间为\n%f 秒\n",time);//显示    return 0;} 
1 0
原创粉丝点击