一种高速开平方并取倒数算法

今天在查资料过程中,无意中看到这样一段奇妙的代码。决定转载到自己的csdn博客,可是找了半天。愣是没找到csdn转载功能。此前常常看到别人转载文章。然后心里一直在想,是不是转载是一个隐藏功能,或者使用什么命令就能够了。于是特意谷歌了下,原来csdn的转载功能,根本没有什么高速转载、一键转载,仅仅有对着原文复制、粘贴,然后在自己的博客里面又一次排版,最后在公布文章时选择转载,这样该文章就成为一篇转摘的文章了。

这么设计也有道理,仅仅有不嫌麻烦的人。才会耐心的完毕转载,算是提高了转载的门槛。避免出现大量反复文章。只是,这么设计的副作用就是,浪费了非常多时间和精力。吐槽就到这里,还是看看这段奇妙的高速开平方并取倒数代码:

float InvSqrt(float x )
{
	float xhalf = 0.5f * x;
	int i = *( int *)& x;
	i = 0x5f3759df - ( i>>1);
	x = *( float *)& i;
	x = x * (1.5f - xhalf * x * x);

	return x;
}

关于该段代码的很多其它说明。请參看这篇文章《0x5f3759df的数学原理》。

以下为我编写的简单測试代码:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>

// 开平方取倒数
float InvSqrt(float x )
{
	float xhalf = 0.5f * x;
	int i = *( int *)& x;
	i = 0x5f3759df - ( i>>1);
	x = *( float *)& i;
	x = x * (1.5f - xhalf * x * x);

	return x;
}

int main()
{
	// 比較精度
	float val = 0.0f;
	val = 1.0f;
	printf("计算精度比較: \n");
	printf("输入值:   %f    高速算法: %f    VC函数: %f \n", val, InvSqrt(val), 1.0f / sqrt(val));

	val = 16.0f;
	printf("输入值:  %f    高速算法: %f    VC函数: %f \n", val, InvSqrt(val), 1.0f / sqrt(val));

	val = 25.0f;
	printf("输入值:  %f    高速算法: %f    VC函数: %f \n", val, InvSqrt(val), 1.0f / sqrt(val));

	val = 100.0f;
	printf("输入值: %f    高速算法: %f    VC函数: %f \n", val, InvSqrt(val), 1.0f / sqrt(val));

	printf("\n计算性能比較: \n");
	int count = 1000000;
	DWORD timeStart = 0, timeEnd = 0;
	timeStart = GetTickCount();
	for (int i = 0; i < count; i++)
	{
		val = InvSqrt(100.0f);
	}
	timeEnd  = GetTickCount();
	printf("高速算法耗时: %f \n", (timeEnd - timeStart) * 0.001); 

	timeStart = GetTickCount();
	for (int i = 0; i < count; i++)
	{
		val = 1.0f / sqrt(100.0f);
	}
	timeEnd  = GetTickCount();
	printf("VC函数耗时:   %f \n", (timeEnd - timeStart) * 0.001); 

	printf("\n");
	system("pause");
	return 0;
}

这里与sqrt()分别比較了计算精度及计算性能,測试环境为vs2005。普通pc笔记本(事实上是一台年久的、玩的了游戏、写得了代码的小黑)。从对照结果看,该高速算法在计算结果上有一点点误差,可是计算性能上非常可观。

下图为对照结果:

时间: 2024-08-28 09:51:25

一种高速开平方并取倒数算法的相关文章

一种快速开平方并取倒数算法

今天在查资料过程中,无意中看到这样一段神奇的代码,决定转载到自己的csdn博客,但是找了半天,愣是没找到csdn转载功能,此前经常看到别人转载文章,然后心里一直在想,是不是转载是一个隐藏功能,或者使用什么命令就可以了.于是特意谷歌了下,原来csdn的转载功能,根本没有什么快速转载.一键转载,只有对着原文复制.粘贴,然后在自己的博客里面重新排版,最后在发布文章时选择转载,这样该文章就成为一篇转摘的文章了.这么设计也有道理,只有不嫌麻烦的人,才会耐心的完成转载,算是提高了转载的门槛,避免出现大量重复

高速幂取余算法

以下是一个高速幂的介绍: 先贴一个秦九韶算法(Horner算法)的原理: 设有项的次函数 将前项提取公因子,得 再将括号内的前项提取公因子.得 如此重复提取公因子,最后将函数化为 令 ...... 则即为所求 以下是解说高速幂的:(By  夜せ︱深   感谢作者) 高速幂取模算法 在站点上一直没有找到有关于高速幂算法的一个具体的描写叙述和解释,这里,我给出高速幂算法的完整解释,用的是C语言.不同语言的读者仅仅好换个位啦,毕竟读C的人较多~ 所谓的高速幂.实际上是高速幂取模的缩写,简单的说,就是高

Raising Modulo Numbers_快速幂取模算法

Description People are different. Some secretly read magazines full of interesting girls' pictures, others create an A-bomb in their cellar, others like using Windows, and some like difficult mathematical games. Latest marketing research shows, that

快速幂取余算法

下面是一个快速幂的介绍: 先贴一个秦九韶算法(Horner算法)的原理: 设有项的次函数 将前项提取公因子,得 再将括号内的前项提取公因子,得 如此反复提取公因子,最后将函数化为 令 ...... 则即为所求 下面是讲解快速幂的:(By  夜せ︱深   感谢作者) 快速幂取模算法 在网站上一直没有找到有关于快速幂算法的一个详细的描述和解释,这里,我给出快速幂算法的完整解释,用的是C语言,不同语言的读者只好换个位啦,毕竟读C的人较多~ 所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求

位运算之——按位与(&amp;)操作——(快速取模算法)

由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快. 按位与(Bitwise AND),运算符号为& a&b 的操作的结果:a.b中对应位同时为1,则对应结果位也为1. 例如: 10010001101000101011001111000 & 111111100000000 --------------------------------------------- 10101100000000 对10101100000000进行右移8位得到的是101011,这就得

【转】C语言快速幂取模算法小结

(转自:http://www.jb51.net/article/54947.htm) 本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余).在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法.我们先从简单的例子入手:求abmodc 算法1.直接设计这个算法: int ans = 1; for(int i =

快速乘法取模算法

原理: 32+16+4=52 1 LL qmul(LL x, LL y, LL mod) { // 乘法防止溢出, 如果p * p不爆LL的话可以直接乘: O(1)乘法或者转化成二进制加法 2 //快速乘法取模算法 3 4 LL ret = 0; 5 while(y) { 6 if(y & 1) 7 ret = (ret + x) % mod; 8 x = x * 2 % mod; 9 y >>= 1; 10 } 11 return ret; 12 } 原文地址:https://www

总结5种比较高效常用的排序算法

1 概述 本文对比较常用且比较高效的排序算法进行了总结和解析,并贴出了比较精简的实现代码,包括选择排序.插入排序.归并排序.希尔排序.快速排序等.算法性能比较如下图所示: 2 选择排序 选择排序的第一趟处理是从数据序列所有n个数据中选择一个最小的数据作为有序序列中的第1个元素并将它定位在第一号存储位置,第二趟处理从数据序列的n-1个数据中选择一个第二小的元素作为有序序列中的第2个元素并将它定位在第二号存储位置,依此类推,当第n-1趟处理从数据序列的剩下的2个元素中选择一个较小的元素作为有序序列中

算法的概率分析技术(取自算法导论)

对于一个算法,它可能会出现最佳情况比如O(n),也有可能出现最坏情况O(n^2),但更多的可能是出现一般情况O(nlgn).那么是否采用这个算法取决于它的平均情况,也就是它的期望值,这是一种概率分析手段. 下面就来具体介绍这种分析手段,前提假设您已经了解了离散数学的概率论的随机变量和期望值的相关内容. 以一个雇用问题来说明: 假设你需要雇用一名新的办公室助理.你先前的雇用尝试都以失败告终,所以你决定找一个雇用代理.雇用代理每天给你推荐一个应聘者.你会面试这个人,然后决定要不要雇用他.你必须付给雇