2011-01-08 5 views
-1

sqrt function에 의해 2147483647의 제곱근을 계산했습니다. 결과는 float 값 46340.95가되어야하지만 46341 값을 반환합니다. 아무도 문제가있는 곳을 말해 줄 수 있습니까? ? 내가 코드를 사용하고 :C에서 sqrt (2147483647)의 제곱근과 관련된 문제

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

어떤 유형의 변수를 사용합니까? – Ishmael

+4

코드를 표시하지 않으면 도움을 드릴 수 없습니다. –

+2

코드가 무엇입니까? – Mehrdad

답변

2

같은 결과가 나옵니다.

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

저를 제공합니다 : 나는 setprecision를 주입한다면, 내가 올바른 가치를

46340.95 

사실, 당신은 folowing 코드를 사용하는 경우 : 당신이 얻을

#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 

그래서 ite appea rs는 기본 설정 (적어도 내 환경에서는 0)입니다.

의 경우 특정 형식을으로 지정하려면 명시 적으로 요청하는 것이 좋습니다.

1

이 사소한 코드는 46340.9 산출 :

#include <cmath> 
#include <iostream> 

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

같은 코드의 어떤 것일까?

는 (그냥 기록을 위해 :. 시험 GCC (g ++) 맥 OS X 10.6.6에 4.5.2을 사용하여)

1

cout의 기본 정밀도는 결과의 소수 부분을 입증하기에 충분하지 않다. 결과는 46340.95이며 6 자리의 정밀도로 반올림되면 43641.0이며 cout에 의해 43641로 표시됩니다. 내 시스템에서

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

이 46340.95의 결과를 보여줍니다 더 정밀도를 표시하려면 먼저 cout의 정밀도를 설정합니다.