[英]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.