2013-01-10 4 views
-1

이 이중 곱셈 (이중) 1000000007 * (이중) 11111111의 출력은 7로 끝나야합니다 (또는 정확하게 11111111077777777과 같아야 함). 그러나이 코드는 6으로 끝나는 결과를 출력합니다 (정확하게는 11111111077777776과 같습니다). 나는 내가 뭘 잘못하고 있는지 알 수 없다. 어떤 도움이라도 좋을 것입니다.두 개의 큰 이중 숫자를 곱하면 왜 잘못된 결과가 나옵니까?

#include <iostream> 
#include <iomanip> 

using namespace std; 

int main() 
{ 
    cout << setprecision(40) << (double)1000000007 * (double)11111111; 
} 

답변

7

double 값을 곱하면 결과가 정확하지 않습니다. double에는 고유 한 정밀도를 사용할 수 있습니다. 정확도는 정확하지만 사용자의 가치를 정확하게 나타낼만큼 정확하지 않습니다.

나는 What Every Computer Scientist Should Know About Floating-Point Arithmetic을 읽는 것이 좋습니다.

+1

+1 - 이것은 제가 가장 좋아하는 논문 중 하나입니다 – LittleBobbyTables

+1

정확한 두 배의 'double'을 곱하면 완벽하게 정확합니다. 정확하지 않습니다. (당신은 항상 똑같은 대답을 얻을 것이고 그것은 손으로 결정될 수 있습니다, 그러나 당신의 정신 모델이 '실수'라면 실수가 아닙니다. – Yakk

+0

도와 줘서 고마워요! :) –

2

부동 소수점 연산이 정확하지 않습니다. 정확합니다. 여기에 대해 읽어 보시기 바랍니다 : http://en.wikipedia.org/wiki/Floating_point

기본적으로 정확하게 숫자를 나타내는 비트가 부족하여 정밀도 오류가 발생합니다.

1

아무런 잘못하지 않았습니다. 그것은 복식의 구현과 관련이 있습니다. double의 구현이 제공하는 것 이상의 정확성이 필요하다면 반드시 "큰 수"연산에 사용할 수있는 라이브러리가 있어야합니다.

관련 문제