代码

#include <iostream>
using namespace std;
const double eps = 1e-15;double sqrtByBisection(double n); // 第一种
double sqrtByNewton(double n); // 第二种
float sqrtHack(float x); // 第三种
float Q_rsqrt(float number); // 变形
float InvSqrt(float x); // 变形int main() {double num;cin >> num;//cout << sqrtByBisection(num);//cout << sqrtByNewton(num);//cout << sqrtHack(num);//cout << Q_rsqrt(num);cout << 1 / InvSqrt(num);return 0;
}double sqrtByBisection(double n) {if (n < 0) // 小于 0return n;double mid, last; // last 保存上一次的计算得到的 middouble low = 0, up = n;mid = (low + up) / 2;do{if (mid * mid > n) up = mid;else low = mid;last = mid;mid = (up + low) / 2; } while (abs(mid - last) > eps); // 精度控制return mid;
}double sqrtByNewton(double n) { // 牛顿迭代法double val = n;double last; // 保存上一次的值do {last = val;val = (val + n / val) / 2;        } while (abs(val - last) > eps);return val;
}/*
Quake-III Arena (雷神之锤3)是90年代的经典游戏之一。
该系列的游戏不但画面和内容不错,而且即使计算机配置低,
也能极其流畅地运行。
这要归功于它3D引擎的开发者约翰-卡马克(John Carmack)。
*/
float sqrtHack(float x)
{float xhalf = 0.5f * x;int i = *(int*)&x; // get bits for floating VALUE i = 0x5f375a86 - (i >> 1); // gives initial guess y0x = *(float*)&i; // convert bits BACK to floatx = x * (1.5f - xhalf * x * x); // Newton step, repeating increases accuracyx = x * (1.5f - xhalf * x * x); // Newton step, repeating increases accuracyx = x * (1.5f - xhalf * x * x); // Newton step, repeating increases accuracyreturn 1 / x;
}// 在game/code/q_math.c里发现了这样一段代码。
// 它的作用是将一个数开平方并取倒,经测试这段代码比(float)(1.0/sqrt(x))快4倍:
float Q_rsqrt(float number)
{long i;float x2, y;const float threehalfs = 1.5F;x2 = number * 0.5F;y = number;i = *(long*)&y;   // evil floating point bit level hackingi = 0x5f3759df - (i >> 1); // what the fuck?y = *(float*)&i;y = y * (threehalfs - (x2 * y * y)); // 1st iterationy = y * (threehalfs - (x2 * y * y)); // 2nd iteration, this can be removedy = y * (threehalfs - (x2 * y * y)); // 增加精确度#ifndef Q3_VM#ifdef __linux__assert(!isnan(y)); // bk010122 - FPE?#endif#endifreturn 1 / y;   // y 为平方根倒数
}float InvSqrt(float x)
{float xhalf = 0.5f * x;int i = *(int*)&x; // get bits for floating VALUE i = 0x5f375a86 - (i >> 1); // gives initial guess y0x = *(float*)&i; // convert bits BACK to floatx = x * (1.5f - xhalf * x * x); // Newton step, repeating increases accuracyx = x * (1.5f - xhalf * x * x); // Newton step, repeating increases accuracyx = x * (1.5f - xhalf * x * x); // Newton step, repeating increases accuracyreturn x;
}

关于雷神三快速求平方根的解释

参考链接

0x5f3759df这个快速开方中的常数的数学依据是什么?

想看各种数如何变成二进制的可以去 IEEE-754 Floating Point Converter 试一下






浮点数的存储

单精度浮点数float在计算机中如何存储、float所能表示的范围






小结

牛顿迭代法
对数近似值
浮点数存储方式:有效位、指数部分(阶码表示)、有效位
存储的二进制浮点数看成整数

C语言中sqrt计算平方根的几种方法C++算法详细解释相关推荐

  1. c语言中sqrt函数_sqrt()函数以及C ++中的示例

    c语言中sqrt函数 C ++ sqrt()函数 (C++ sqrt() function) sqrt() function is a library function of cmath header ...

  2. linux c计算时间差值,获取时间和计算时间差的几种方法总结,时间差几种方法...

    获取时间和计算时间差的几种方法总结,时间差几种方法 一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( ...

  3. 个人所得税递归函数C语言,C语言实现 计算个人所得税务2种方法

    #include #include /* 基于C语言的个人所得税计税系统 问题描述: 我国现行的个人所得税计算方法如下: 级数 全月应纳税所得额   税率(%) 1 不超过500元的    5 2 超 ...

  4. c语言windows获取时间,【转载】c/c++在windows下获取时间和计算时间差的几种方法总结...

    一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...

  5. 现代密码学3.1--定义计算安全的两种方法

    现代密码学3.1--定义计算安全的两种方法 三种安全性定义 定义计算安全的两种方法 具体方法/concrete approach 渐进方法/asyptotic approach "高效/PP ...

  6. 网络基础知识 快速计算子网掩码的2种方法

    网络基础知识 快速计算子网掩码的2种方法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office ...

  7. php中计算时间差的几种方法,php计算时间差的方法

    一个简单的例子:计算借书的天数,根据每天的日期进行计算. (1) 有数据库的情况 MSSQL可以使用触发器!用专门计算日期差的函数datediff()便可. MYSQL那就用两个日期字段的差值计算的计 ...

  8. [C++] 计算行列式的若干种方法

    计算行列式的三种方法 测试样例 按行(列)展开法 计算结果 高斯消元转化为上三角阵 计算结果 尝试引入permutation operation 尝试使用分数运算 定义法 代码 测试结果 有问题欢迎提 ...

  9. 漫谈分子动力学计算热导率的五种方法

    关注 Mr.material,\color{Violet} \rm Mr.material\ ,Mr.material , 更\color{red}{更}更多\color{blue}{多}多精\col ...

最新文章

  1. Enterprise Library 4 缓存应用程序块的设计
  2. python自动化测试脚本可以测php吗_请对比分析一下php的自动化测试与python的自动化测试...
  3. 玩玩Xamarin Evolve 2016带来的新特性(一)-iOS Simulator(for Windows)
  4. python调用ffmpeg合并_用ffmpeg命令处理mp4剪切与合并
  5. HTML5 API详解(18):IndexedDB 本地存储
  6. 高大上的集团名字_最火的微信名字大全男成熟内涵高大上
  7. djaogo配置session使用redis
  8. 网络_远程开机(ubuntu)
  9. 计算机科学型计算器,全能科学型计算器app
  10. 7.10 18级多校适应训练1题解
  11. 使用Xcode真机调试时没有任何问题,但是当打包成ipa文件安装时,有接口访问不到后台信息
  12. VPU/NPU/TPU/GPU/CPU眼花缭乱,傻傻分不清楚?三百字讲明白
  13. HTML_canvas
  14. PMOS管/NMOS管控制供电电路
  15. NightWatch启动chrome时,弹出设置页面:Microsoft Windows恶意删除工具...
  16. Windows系统制作安装
  17. Linux 中实时查看日志的3种方法
  18. layui Table复杂表头导出
  19. git上传本地工程到码云上,报错: ! [rejected] master - master (non-fast-forward) error: failed to push some
  20. Qt 编译失败,jom.exe退出,退出代码2

热门文章

  1. 联想服务器sr650硬件配置表,ThinkSystem SR650规格解读_联想 System x3650 M4_服务器x86服务器-中关村在线...
  2. 极限学习机(ELM) 算法及MATLAB程序实现
  3. 九度 1341 艾薇儿的演唱会
  4. 202009计算机应用基础考前模拟试题,2009年10月自考00018计算机应用基础历年真题及答案...
  5. Vue学习之路由(Router)
  6. NVIDIA Jetson TX1 系列开发教程之二:刷机与开发前准备
  7. android flash air 打包工具
  8. 羽毛球初学者入门篇(仅个人经验)
  9. 无纸化会议系统的选择理由
  10. JS - 文件上传组件WebUploader使用详解1(带进度的文件上传