【发布时间】:2015-07-18 16:52:45
【问题描述】:
我正在尝试实现我自己的平方根函数,它只给出平方根的整数部分,例如3 的平方根 = 1。
看到here的方法,尝试实现方法
int mySqrt(int x)
{
int n = x;
x = pow(2, ceil(log(n) / log(2)) / 2);
int y=0;
while (y < x)
{
y = (x + n / x) / 2;
x = y;
}
return x;
}
上述方法对于输入 8 失败。另外,我不明白为什么它应该有效。
另外,我尝试了here的方法
int mySqrt(int x)
{
if (x == 0) return 0;
int x0 = pow(2, (log(x) / log(2))/2) ;
int y = x0;
int diff = 10;
while (diff>0)
{
x0 = (x0 + x / x0) / 2; diff = y - x0;
y = x0;
if (diff<0) diff = diff * (-1);
}
return x0;
}
在第二种方式中,对于输入 3,循环继续...无限期地进行(x0 在 1 和 2 之间切换)。
我知道这两种方法本质上都是 Netwon 方法的版本,但我无法弄清楚为什么它们在某些情况下会失败,以及如何让它们适用于所有情况。我想我在实施中有正确的逻辑。我调试了我的代码,但我仍然找不到让它工作的方法。
【问题讨论】:
-
C++ 不是 C 也不是 Java。
-
您将结果存储在整数变量中,您希望在这里发生什么?
-
如果我是你,我会调试代码或打印每个操作成员的结果值,例如
cout << log(n); -
@adrian008
std::pow和std::log和std::ceil都不是整数运算。它们都在浮点数学方面工作,这意味着所有的不准确性(尤其是截断浮点 - 整数转换)...... -
您已经有三个关于同一主题的 cmets:当大多数操作返回
float或double时,您将数据存储在int中。这就是整个问题。
标签: c++ math square-root