2012-12-30 2 views
0

두 부분으로 입력을 가져온 다음 분수 부분을 추출하기 위해 유형 변환하고 있습니다. 그러나 입력이 작은 숫자 인 경우 4294967295.2을 사용하면 소수 부분이 검색되지만 더 큰 숫자를 입력하면 소수 부분이 0이됩니다. 나는 그것이 몇 가지 일이라는 것을 알고 있지만, 나는이 물건에 조금 새로운 것입니다. 입력 번호가 9007199254740991.2 일 때 분수 부분을 0으로 만드는 이유는 무엇입니까? 여기에 코드입니다 :C++의 double에서 분수 부분 검색

unsigned long long first,second; 
double a,b,remainderA,remainderB; 
cout << "Enter first number:\n"<< endl; 
cin>> a; 
cout << "\nEnter second number:\n"<< endl; 
cin >> b; 

first=(unsigned long long) a; 
second=(unsigned long long) b; 

remainderA=a-first; 
remainderB=b-second; 


cout<<remainderA<<endl; 

감사

+0

참조 : [모든 컴퓨터 과학자가 부동 소수점에 대해 알아야 할 사항] (http://docs.oracle.com/cd/E19957-01/806-3568/) ncg_goldberg.html) –

답변

2

에서보고가있을 수 있습니다. 두 배에는 52 비트의 가수가 있습니다.이 가수는 15-17 비트의 십진수입니다. 두 번째 예제가이 한도에 도달하고 분수 (0.2)가 가장 비슷한 경우 두 배 안에 저장되지 않습니다.

0

입력 번호가 대상 유형은 더 큰 범위를 가지고 두 배의 입력을 복용 0으로 캐스팅됩니다에 거주하기에 충분히 크다. 더 작은 범위를 갖는 부호없는 long long으로 변환합니다. 그래서 문제가 발생합니다.

는 다음

그것은 단순히 정밀도의 문제

http://www.tutorialspoint.com/cprogramming/c_type_casting.htm

+0

그렇다면 숫자가 클 때도 분수 부분을 조사하려면 어떻게해야합니까? – Alfred

+0

당신은 문자열에서 그것을 조작하는 데 필요한 큰 충분히 큰 숫자입니다. bigNumber에서 Google 검색을하면 충분한 리소스를 얻을 수 있습니다. –

0

더블 범위 갖는다 : 1.7E +/- 308 (15 진수)
길이 부호를 오랫동안 보유 범위 : 0 18,446,744,073,709,551,615에 (20 진수)

및 주조되는 긴 긴 제 = (서명) a;
예 : 당신이 9007199254740991.2을 삽입하는 경우 "a"는 다음
삽입되는 값은 따라서

a = 9,0072e+015 
    first :90071992547409910 

그에게 정밀의 문제이다. 그래서 당신이 문제를 겪고있는 것입니다.

0

부동 소수점 숫자는 특정 자릿수를 저장합니다. 숫자가 너무 길 경우, 분수 부분은 이미 데이터 유형의 한계 정밀도를 지나치고 있습니다.

double보다 더 중요한 수치를 얻으려면 long double을 시도하십시오. https://ideone.com/i8Yyt0

당신은 정수 타입에 많은 수의 캐스팅 때문에 라운딩을 수행 할 std::floor을 사용할 수 있습니다 그것은 정수형의 범위를 벗어나는 정의되지 않은 동작이 발생합니다 : 예를 들어,이 0.2 (약, 다시 제한 정밀도로 인해)를 출력한다.