2013-05-12 3 views
1

간단한 C++ 코드 :왜 조건이 발생하지 않습니까?

#include "../../std_lib_facilities.h" 
#include <float.h> 

double ctok(double c){ 
    const double koef_c_2_k = 274.15; 
    double k = c + koef_c_2_k; 
    if(k < -koef_c_2_k) error("Output abroad range of admissible values."); 
    return k; 
} 

int main(){ 
    cout << "Max double value: " << DBL_MAX << endl; 
    double c = 0; 
    cout << "Celsius: "; 
    cin >> c; 
    double k = ctok(c); 
    cout << "Kelvin: " << k << endl; 
    return 0; 
} 

출력 : 호스트 괜찬 @

부시 : ~/CPP/BS/5/5.2 $ ./a.out
최대 두 배 값 : 1.79769 E + 308
섭씨 : 0
켈빈 : 274.15
부시 @ 호스트 - 괜찬 : ~/CPP/BS/5/5.2 $ ./a.out
최대 double 값 : 1.79769e + 308
섭씨 : 100
켈빈 : 374.15
부시 @ 호스트 - 괜찬 : ~/CPP/BS/5/5.2 $ ./a.out
최대 double 값 : 1.79769e + 308
섭씨 : -100
켈빈 : 174.15
부시 @ 호스트 - 괜찬 : ~/CPP/BS/5/5.2 $ ./a.out
최대 double 값 : 1.79769e + 308
섭씨 : 1.79769e + 308
켈빈 : 1.79769e + 308
부시 @ host-nix : ~/cpp/bs/5/5.2 $

마지막으로 섭씨에 대한 최대 값을 설정하고 오류 메시지가 표시되기를 기다렸지 만 잘못된 켈빈 값을 받았습니다. 왜 그런 일이 일어 났습니까?

감사합니다. 당신이 바다에 물 한 잔을 추가하는 것처럼

+8

'1.79769e + 308' +'274.15'는 바다에 물 한 컵을 넣는 것처럼 보입니다. – deepmax

+0

이중 값이 가질 수있는 최대 값에 값을 추가하면 어떻게 될까요? 이 값이 -274.15보다 작습니까? –

+0

**를 ** double ** 최대 값에 추가하면 최소 ** double ** 값을 얻어야합니다. 아니면 내가 옳지 않은가? –

답변

7

What Every Computer Scientist Should Know About Floating-Point Arithmetic

1.79769e+308 + 274.15 보인다.

실제 숫자의 정밀도가 제한되어 있으므로 컴퓨터 세계에서 비교할 수 없습니다.

아주 작은 숫자와 매우 큰 숫자에 대해 double 변수를 동시에 사용할 수 없습니다. 범위를 정의하면 솔루션이 현미경 적 또는 거시적이어야합니다.

+0

감사합니다. 나는이 링크를 읽을 것이다. –

+1

그 값은 실제 세계에서도 의미가 없습니다. – rodrigo

+1

물 한잔? 알려진 우주에 원자를 추가하는 것은 멀지 않게 닫을 수 있습니다 :) –

관련 문제