c ++中平方根(2147483647)的问题

时间:2011-01-08 05:26:49

标签: c++

我正在通过sqrt函数计算2147483647的平方根。结果必须是浮点值46340.95但我的代码返回值46341。   谁能告诉我问题出在哪里? 我正在使用代码:

double x=2147483647.0;
double y=sqrt(x);
cout<< y;

3 个答案:

答案 0 :(得分:2)

我得到了同样的结果。但是,如果我注入setprecision,我会得到正确的值:

#include <iostream>
#include <iomanip>
#include <cmath>

int main (void) {
    double x=2147483647.0;
    double y=sqrt(x);
    std::cout << std::setprecision(10) << y << std::endl;
    return 0;
}

给了我:

46340.95

事实上,如果您使用以下代码:

#include <iostream>
#include <iomanip>
#include <cmath>

int main (void) {
    double x=2147483647.0;
    double y=sqrt(x);
    std::cout << y << std::endl;
    std::cout << std::setprecision(0) << std::fixed << y << std::endl;
    std::cout << std::setprecision(1) << std::fixed << y << std::endl;
    std::cout << std::setprecision(2) << std::fixed << y << std::endl;
    std::cout << std::setprecision(3) << std::fixed << y << std::endl;
    return 0;
}

你得到:

46341
46341
46341.0
46340.95
46340.950

因此,默认设置(至少对我的环境而言)似乎是零精度。

如果您想要特定格式,我建议您明确请求。

答案 1 :(得分:1)

这个简单的代码产生46340.9:

#include <cmath>
#include <iostream>

int main()
{
    float x = std::sqrt(2147483647);
    std::cout << x << std::endl;
    return 0;
}

您的代码是什么样的?

(仅供记录:在MacOS X 10.6.6上使用GCC(g ++)4.5.2进行测试。)

答案 2 :(得分:1)

cout的默认精度不足以显示结果的小数部分。您的结果是46340.95,四舍五入到精度的六位数是43641.0,并由cout显示为43641。要显示更高的精度,请先设置cout的精度:

double x=2147483647.0;
double y=sqrt(x);
cout.precision(9);
cout<< y;

在我的系统上显示结果为46340.95。