所以,我在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也会产生错误的答案。谢谢!
答案 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";
}