最快的开平方 sqrt 算法,供赏析

绝妙之处,没有使用循环。

[email protected]:~/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;
}
[email protected]:~/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
[email protected]:~/lab$
时间: 2024-11-11 17:21:45

最快的开平方 sqrt 算法,供赏析的相关文章

最快的Hash表算法

我们由一个简单的问题逐步入手:有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做?有一个方法最简单,老老实实从头查到尾,一个一个比较,直到找到为止,我想只要学过程序设计的人都能把这样一个程序作出来,但要是有程序员把这样的程序交给用户,我只能用无语来评价,或许它真的能工作,但...也只能如此了. 最合适的算法自然是使用HashTable(哈希表),先介绍介绍其中的基本知识,所谓Hash,一般是一个整数,通过某种算法,可以把一个字符串"压缩&q

Jeff Somers's N Queens Solutions 最快的n皇后算法

1 /* Jeff Somers 2 * 3 * Copyright (c) 2002 4 * 5 * [email protected] 6 * or 7 * [email protected] 8 * 9 * April, 2002 10 * 11 * Program: nq 12 * 13 * Program to find number of solutions to the N queens problem. 14 * This program assumes a twos compl

这可能是最快的自幂数算法

这可能是最快的自幂数算法 自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身.(例如:当n为3时,有1^3 + 5^3 + 3^3 = 153,153即是n为3时的一个自幂数) 自幂数包括:独身数.水仙花数.四叶玫瑰数.五角星数.六合数.北斗七星数.八仙数.九九重阳数.十全十美数 ---摘自百度百科 最近研究了一下水仙花数,完了之后就自然而然的优化成了计算自幂数的算法... 我的第一版本是 eight1 后来想提升一下计算的效率,就做了两次优化 第一次优化后的是eight2

AGG第三十二课 renderer_outline_aa更快的渲染线段算法

留给:曾经在校园奔跑时候,摔破膝盖,擦伤手掌的孩子! 1 前言 本章提供了采用新的线段渲染算法的例子,相比于已经实现的stroke管道算法,平均提高了2倍的速度,最好的情况下是2.6倍加速度.当然这种算法应用在细线上速度才会快,最好是小于2个像素. 在其他的章节中会跟conv_stroke进行效率的对比.同样的避免不了引入更多的限制,这一点可以在下面了解到.多说一句:conv_stroke是最昂贵的转换器. The rasterizer itself works much faster, bes

算法导论学习之快排+各种排序算法时间复杂度总结

快排是一种最常用的排序算法,因为其平均的时间复杂度是nlgn,并且其中的常数因子比较小. 一.快速排序 快排和合并排序一样都是基于分治的排序算法;快排的分治如下: 分解:对区间A[p,r]进行分解,返回q,使得A[p–q-1]都不大于A[q] A[q+1,r]都大于A[q]; 求解:对上面得到的区间继续递归进行快排 合并:因为快排是原地排序,所以不需要特别的合并 从上可以看出最重要的就是分解函数,其按关键值将数组划分成3部分,其具体实现的过程见代码注释. 我们一般取数组的最后一个元素作为划分比较

最快的内容查找算法-----暴雪的Hash算法

暴雪公司有个经典的字符串的hash公式  :先提一个简单的问题,假如有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做?  有一个方法最简单,老老实实从头查到尾,一个一个比较,直到找到为止,我想只要学过程序设计的人都能把这样一个程序作出来,但要是有程序员把这样的程序交给用户,我只能用无语来评价,或许它真的能工作,但也只能如此了.  最合适的算法自然是使用HashTable(哈希表),先介绍介绍其中的基本知识,所谓Hash,一般是一个整数,通

renderer_outline_aa更快的渲染线段算法

1 前言 本章提供了一种新的渲染线段的算法,相比于已经实现的stroke管道算法,平均提高了2倍的速度,最好的情况下是2.6倍加速度. 2 头文件 #include"agg/include/agg_rasterizer_outline_aa.h" #include"agg/include/agg_renderer_outline_aa.h" 3 代码实例: agg::rendering_buffer&rbuf = rbuf_window(); agg::pi

4行代码求出圆周率800位,供赏析

[email protected]:~/lab$ cat main.c  #include "stdio.h" int main(){ long a=10000,b,c=2800,d,e,f[2801],g; for(;b-c;) f[b++]=a/5; for(; d=0,g=c*2; c-=14,printf("%.4ld",e+d/a),e=d%a) for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); } [email

c 自定义sqrt算法。

转载自:http://www.examw.com/biancheng/c/194822/ #include <stdio.h> #include <math.h> #include <stdlib.h> #define ACC 0.000000001 double newSqrt(double n) { double low, high, mid, tmp; if(n > 1) { low = 1; high = n; } else { low = n; high