不使用 sqrt 函数求平方根?

2024-01-31

我正在寻找不使用 sqrt 函数来求平方根的算法,然后尝试进行编程。我最终得到了 C++ 中的工作代码

    #include <iostream>
    using namespace std;

    double SqrtNumber(double num)
    {
             double lower_bound=0; 
             double upper_bound=num;
             double temp=0;                    /* ek edited this line */

             int nCount = 50;

        while(nCount != 0)
        {
               temp=(lower_bound+upper_bound)/2;
               if(temp*temp==num) 
               {
                       return temp;
               }
               else if(temp*temp > num)

               {
                       upper_bound = temp;
               }
               else
               {
                       lower_bound = temp;
               }
        nCount--;
     }
        return temp;
     }

     int main()
     {
     double num;
     cout<<"Enter the number\n";
     cin>>num;

     if(num < 0)
     {
     cout<<"Error: Negative number!";
     return 0;
     }

     cout<<"Square roots are: +"<<sqrtnum(num) and <<" and -"<<sqrtnum(num);
     return 0;
     } 

现在的问题是初始化声明中的迭代次数 nCount(这里是 50)。例如,要找出 36 的平方根,需要 22 次迭代,所以没有问题,而找到 15625 的平方根需要超过 50 次迭代,因此它将在 50 次迭代后返回 temp 的值。请为此给出解决方案。


有一个更好的算法,对于双数最多需要 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 and x/y. If y = sqrt(x),将会是一样的。如果y > sqrt(x), then x/y < sqrt(x)大约相同的数量。换句话说,它会收敛得非常快。

UPDATE:为了加快非常大或非常小的数字的收敛速度,已更改sqrt()函数提取二进制指数并从数字中计算平方根[1, 4)范围。现在需要frexp() from <math.h>获得二进制指数,但可以通过从 IEEE-754 数字格式中提取位来获得该指数,而不使用frexp().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不使用 sqrt 函数求平方根? 的相关文章

  • 如何自定义舍入形式

    我的问题可能看起来很简单 但仍然无法得到有效的东西 我需要自定义 Math round 舍入格式或其他格式以使其工作如下 如果数字是 1 6 他应该四舍五入到 1 如果大于或等于 1 7 他应该四舍五入到 2 0 对于所有其他带有 6 的小
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • (const T v) 在 C 中从来都不是必需的,对吗?

    例如 void func const int i 在这里 const是不必要的 因为所有参数都是按值传递的 包括指针 真的吗 C 中的所有参数确实都是按值传递 这意味着无论您是否包含该参数 实际参数都不会改变const or not 然而
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • 数组中连续元素的最大乘积

    我在现场面试的时候被问到了这个算法问题 由于没有要求我签署保密协议 我将其发布在这里寻求答案 给定一个数组REAL不包含 0 的数字 找到产生最大乘积的连续元素 该算法应在线性时间内运行 我考虑过以下方法 使用两个数组 第一个是利用DP思想
  • 使用 HTMLAgilityPack 从节点的子节点中选择所有

    我有以下代码用于获取 html 页面 将网址设置为绝对 然后将链接设置为 rel nofollow 并在新窗口 选项卡中打开 我的问题是关于将属性添加到 a s string url http www mysite com string s
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 类中不允许使用不完整类型,但类模板中允许使用不完整类型

    以下为无效代码 struct foo struct bar bar x error field x has incomplete type struct bar int value 42 int main return foo x valu
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐

  • 调试未收到消息的 RxJava 问题的最佳方法是什么

    我有一个 Android 应用程序 其中包含多个A型观察者订阅多个B 类可观测量 订阅是在IO Scheduler中完成的 观察是在Android主线程上完成的 我遇到的问题是随机地经过一些工作后 A 从未收到 B 发出的一条消息 并且经过
  • 如何将 geopandas 更新到最新版本?

    我通过 anaconda 安装了 geopandas 包conda install c conda forge geopandas 但由于某种原因安装了 0 6 3 版本 我需要使用missing kwds函数 但该函数仅在最新版本的geo
  • Rails 模型中 around_create 回调的目的是什么?

    around create回调代码什么时候执行 什么情况下我们应该使用它 我也有这个问题 现在找到答案了 around create基本上可以让你同时做before create and an after create以一种方法 你必须使用
  • R:如何删除 X 轴上未绘制的名称(保留已绘制的名称)?

    我有这段代码可以获取前 10 个频率并绘制图表 top n data 3 n 10 Frequency gt barplot Frequency ICD10Code data cex name 5 出现的问题 当时我没有想到 是 它确实绘制
  • 如何将姓名电话键盘键盘类型的号码侧设置为默认(键盘打开时)

    现在 当键盘在我的应用程序上启动时 它默认在字母侧显示字母键盘 问题将在下面的图片中列出 参考下图 This is good 单击 123 将显示数字面 问题 但是 我希望默认显示数字侧 并且稍后在键盘打开时仍然能够切换回字母侧 我该怎么做
  • 如何正确关闭流?

    我被分配了一项任务来编写一个程序 该程序将 打开一个文件 阅读内容 将特定单词替换为另一个单词 保存对文件的更改 我确信我的代码可以打开 读取和替换单词 当我添加 保存对文件的更改 部分时 出现问题 这是代码 open System IO
  • 如何设置每秒重复次数?

    我使用 while 循环在程序中重复我的代码 我想每秒重复一个代码 1000 次 我怎样才能做到这一点 For the 固定延迟执行对于某些代码 使用 a 可能是更好的方法定时器对象 例如java util Timer https docs
  • FOSUserBundle ,法语翻译被忽略

    我是 symfony 的新用户 我目前正在学习课程 全职 我的问题 app config config yml framework translator fallback locale app config parameters ini 我
  • 如果 iMacros 页面中存在文本,请单击按钮

    我正在尝试将 iMacros 与 Firefox 结合使用 仅当页面上存在此代码时单击 取消关注 按钮
  • XAML中UI设计的优点

    在WPF中 我可以使用 NET 2 0风格 如designer cs 制作我的UI 我的问题是使用XAML而不是代码进行UI设计有什么优势 主要优点是 如果您将标记和代码保持干净的分离 例如 通过应用MVVM模式 http msdn mic
  • 分发可执行文件时缺少 MSVCP140D.dll

    我已经做了加密应用程序 https github com Cewein Crypto h releases在 Visual Studio 2017 中 它在我的电脑上工作正常 但是当我在没有 Visual Studio 的情况下将可执行文件
  • 如何在.net core 2应用程序中从控制器设置OpenIdConnect选项提示“login”?

    我正在使用 net core 2 应用程序 并已将 OpenIDConnect 选项提示参数设置为在 Startup cs 的 ConfigureServices 方法中同意 AddOpenIdConnect options gt opti
  • 为什么新视图控制器中的表视图不显示?迅速

    这是以下问题的后续 如何调用进行 API 调用的类的实例以及该类中发出请求的函数 并将其分配给变量 迅速 https stackoverflow com questions 72400226 how to call an instance
  • Struts2 当index是变量时访问列表的特定索引

    当索引是变量时 我在访问列表的特定元素时遇到一些问题 当索引只是一个数字时 我在显示我要查找的内容时完全没有问题
  • HXT:在Haskell中使用HXT按位置选择节点?

    我正在尝试使用 Haskell 解析一些 XML 文件 对于这项工作我正在使用HXT http www haskell org haskellwiki HXT获得有关现实世界应用中箭头的一些知识 所以我对箭头主题很陌生 在 XPath 中
  • FFmpeg - 连接具有不同时基的视频[重复]

    这个问题在这里已经有答案了 我正在尝试使用 concat demuxer 连接视频 但在使用一个视频 下面的 video2 mp4 时它不起作用 所谓不起作用 我的意思是在播放器上播放串联视频将起作用 直到第二个视频部分开始 它只是无法再读
  • 流程调度

    假设我有 10 个脚本想要作为 cron 作业定期运行 但是 我不希望它们全部同时运行 我只希望其中两个同时运行 我想到的一种解决方案是创建两个脚本 在每个脚本上放置 5 个语句 并将它们作为 crontab 中的单独条目 然而 该解决方案
  • RadioGroup checkButton 属性

    我正在尝试在 Android 中构建 RadioGroup 并默认选中一个 RadioButton 我想知道是否可以通过 XML 而不是以编程方式来完成此操作 以下代码片段似乎不起作用 因为我收到错误 error Error No reso
  • Apache/Django:导入错误:没有名为“my_project”的模块

    尝试使用 apache2 和 mod wsgi 托管我的 django 项目 我尝试了各种配置 但在浏览器中访问该网站时不断出现导入错误 例如 Traceback most recent call last File home user p
  • 不使用 sqrt 函数求平方根?

    我正在寻找不使用 sqrt 函数来求平方根的算法 然后尝试进行编程 我最终得到了 C 中的工作代码 include