在c ++中使用sqrt函数

时间:2015-06-01 07:02:47

标签: c++

所以,我在c ++中使用sqrt函数,而我遇到的问题是,当sqrt的输入为40000000001时,它返回200000。

#include <iostream>
#include <cmath>

using namespace std;

int main (void)
{
    long long int a;
    cin>>a;
    double b = sqrt(a);
    cout<<b<<"\n";
    return 0;
}

为什么会这样?

它应该返回200000.0000025,我需要这个确切的值。即使获得200000也会产生错误的答案。谢谢!

3 个答案:

答案 0 :(得分:4)

添加

cout << "a=" << a << endl;

将显示当您输入40000000001时,a的值实际上是46341.这是因为要在一个int中表示40000000001,您需要36位,而在您的平台上,很可能是int只有32位(31加一个符号)。

使用long代替我获得200000你没有得到200000.0000025这一事实必须要考虑的事实是,双精度只有有限的精度。尽管Wikipedia表示64位双精度的精度通常为15-17位十进制数,并且您要查找的数字有13位有效数字,但我怀疑在计算的中间步骤中存在舍入误差。 /击>

部分问题还在于打印,如果您打印例如:

    cout << b - 200000 << endl;

然后我得到

    2.49999e-06

作为非常接近0.0000025的输出。您可以增加打印的位数:

    cout << setprecision(13) << b << endl;

然后在我的平台上打印200000.0000025

如果您需要比基元类型提供的更高的精度,可以使用库来查看,例如this list on Wikipedia。特别是,boost似乎有一个库,这里是一个采用100位数字的平方根的例子:Square root of a 100 digit number in C++

答案 1 :(得分:1)

你可以使用fixed,它可以不间断地进行dipsplay。

   #include <iostream>
   #include <cmath>
   using namespace std;

    int main(void)
    {
        double a = 40000000001;
        cout << fixed << a << "\n";
        double b = (double )sqrt(a);
        cout << fixed <<b << "\n";
        return 0;
    }

答案 2 :(得分:1)

使用double而不是int,输入值超过int max value。

#include <iostream>
#include <cmath> 
using namespace std;

int main()
{
    double a;
    cin >> a;
    double b = sqrt(a);
    cout << b << "\n";
}