繁体   English   中英

在C ++中使用sqrt函数

[英]Using sqrt function in 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,也会产生错误的答案。 谢谢!

添加一个

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

就会发现,当你进入40000000001价值a实际上是46341.这是因为在您需要36位,而你的平台上,诠释最可能的一个int代表40000000001只有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


如果您需要比原始类型提供的精度更高的精度,可以使用一些库来实现,例如,参见Wikipedia上的此列表 特别地,boost似乎为此提供了一个库,这是一个以100位数字的平方根为例的示例: C ++中100位数字的平方根

使用double代替int,输入值超过int最大值。

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

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

您可以使用fixed ,它可以使连续播放不断。

   #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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM