栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

查找平方根而不使用sqrt函数?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

查找平方根而不使用sqrt函数?

有一个更好的算法,最多需要6次迭代才能收敛到双精度的最大精度:

#include <math.h>double sqrt(double x) {    if (x <= 0)        return 0;       // if negative number throw an exception?    int exp = 0;    x = frexp(x, &exp); // extract binary exponent from x    if (exp & 1) {      // we want exponent to be even        exp--;        x *= 2;    }    double y = (1+x)/2; // first approximation    double z = 0;    while (y != z) {    // yes, we CAN compare doubles here!        z = y;        y = (y + x/y) / 2;    }    return ldexp(y, exp/2); // multiply answer by 2^(exp/2)}

算法从1开始,作为平方根值的一阶近似值。然后,在每个步骤上,通过取当前值

y
和之间的平均值来改善下一个近似
x/y
。如果
y
=
sqrt(x)
,则将相同。如果
y
>
sqrt(x)
,则
x/y
<
sqrt(x)
大约相等。换句话说,它将很快收敛。

更新 :为加快非常大或非常小的数字的收敛,更改了

sqrt()
函数以提取二进制指数并从
[1,4)
范围内的数字计算平方根。现在需要
frexp()
从中
<math.h>
获取二进制指数,但是可以通过从IEEE-754数字格式中提取比特而不使用来获得该指数
frexp()



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/616989.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号