试图找到0到1之间没有根号函数的数的根号
Trying to find sqrt of numbers between 0 and 1 without sqrt function
我无法解决的问题是如何找到0到1之间的数字的根号。在那之后,我想一切都好了。导致程序崩溃的唯一输入数字是介于0(未包含)和1(未包含)之间的数字
帮忙吗?
#include <iostream>
#include <cmath>
#include <cassert>
#include <stdlib.h>
#include <cmath>
using namespace std;
double squareroot(double x) /* computes the square root of x */
{
assert( x >= 0 ); /* make sure x is not negative*/
if (x==0) return 0;
/* the sqrt must be between xhi and xlo */
double xhi = x;
double xlo = 0;
double guess = x/2;
/* We stop when guess*guess-x is very small */
while (abs(guess*guess-x) > 0.00001 )
{
if (guess*guess > x) xhi = guess;
else xlo = guess;
guess = (xhi + xlo)/2;
}
return guess;
}
/* Test Stub */
int main()
{
double testvalue;
cout << "n Enter a TestValue= " ;
cin >> testvalue;
cout << endl;
double testresult = squareroot(testvalue);
cout << "n Square Root= " << testresult << "n" ;
}
程序崩溃,因为这一行:
while (abs(guess*guess-x) > 0.00001 )
当你有0到1之间的数字时,你的算法总是会得到一个大于0.00001的数字,从而导致无限循环。解决方法是将算法更改为另一种平方根近似技术(参见牛顿方法,不动点定理,多项式近似技术等)。
提示:尝试跟踪你的代码,看看发生了什么,即使你需要把它写在纸上相关文章:
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 填充上编译器生成的复制构造函数之间的不一致
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 如何在"push_*()"和"emplace_*()"函数之间进行选择?
- 仅具有运算符()的结构和普通函数之间的实际区别
- 当两者都调用时,删除和析构函数之间的区别?
- Release() 和析构函数之间的区别?
- 调用 "project" 函数和调用 DLL 函数之间的区别
- C++模板和非模板函数之间的重载解析
- std::shared_ptr 和 std::unique_ptr 构造函数之间的不对称
- C++ 和 Lua 函数之间的交互与 3D 矢量参数
- 在结构函数之间传递文件路径 C++ 编辑:修复LNK2019错误
- 在C++同名的顶级函数之间进行选择
- 在成员函数之间传递const变量为数组的索引
- Helgrind 报告了使用 Singleton 及其构造函数之间可能存在的竞争
- 函数模板和函数之间奇怪的不一致"normal"
- 在c#和c函数之间传递值和指针
- 在C++中调用 malloc() 与"operator new"函数之间的实现差异
- 在函数之间传递相同的数组
- C++编译错误是由于使用 std::move 时运动构造函数与其他非运动构造函数之间的冲突