zoukankan      html  css  js  c++  java
  • 一种高速开平方并取倒数算法

           今天在查资料过程中,无意中看到这样一段奇妙的代码。决定转载到自己的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("计算精度比較: 
    ");
    	printf("输入值:   %f    高速算法: %f    VC函数: %f 
    ", val, InvSqrt(val), 1.0f / sqrt(val));
    
    	val = 16.0f;
    	printf("输入值:  %f    高速算法: %f    VC函数: %f 
    ", val, InvSqrt(val), 1.0f / sqrt(val));
    
    	val = 25.0f;
    	printf("输入值:  %f    高速算法: %f    VC函数: %f 
    ", val, InvSqrt(val), 1.0f / sqrt(val));
    
    	val = 100.0f;
    	printf("输入值: %f    高速算法: %f    VC函数: %f 
    ", val, InvSqrt(val), 1.0f / sqrt(val));
    
    	printf("
    计算性能比較: 
    ");
    	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 
    ", (timeEnd - timeStart) * 0.001); 
    
    	timeStart = GetTickCount();
    	for (int i = 0; i < count; i++)  
    	{  
    		val = 1.0f / sqrt(100.0f);  
    	}  
    	timeEnd  = GetTickCount();  
    	printf("VC函数耗时:   %f 
    ", (timeEnd - timeStart) * 0.001); 
    
    	printf("
    ");
    	system("pause");
    	return 0;
    }
           这里与sqrt()分别比較了计算精度及计算性能,測试环境为vs2005。普通pc笔记本(事实上是一台年久的、玩的了游戏、写得了代码的小黑)。从对照结果看,该高速算法在计算结果上有一点点误差,可是计算性能上非常可观。

    下图为对照结果:


                                   



  • 相关阅读:
    包图网+千图网图片代下
    Java基于二维数组自定义的map
    java23种设计模式-行为型模式-中介者模式
    基于SpringBoot、Redis和RabbitMq的商品秒杀处理
    wps+稻壳vip账号免费分享
    wps+稻壳vip15天领取地址
    图精灵、易图、笔图,vip免费分享
    文库、氢元素、办图、六图,vip免费分享
    快图网、千库,go设计,vip免费分享
    MySQL索引规范及优化
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6985247.html
Copyright © 2011-2022 走看看