컴퓨터의 소수 계산 질문있습니다.
글쓴이: nicemuy / 작성시간: 금, 2012/10/12 - 3:11오전
먼저 제가 고민하게된 소스 부터 보여드리겠습니다.
아마 c언어를 처음 배우거나할때 참 유명한 소스로 알고있습니다. 0.1을 100번 더하는 소스인데요, 저는 여기에 0.1*100을 한것을 따로 추가했습니다.
궁금한게 지금 저 소스의 출력값이 10.000002와 10.000000으로 나오는데, 어째서 0.1을 100번 더한것과 0.1에 100을 곱한 값의 정밀도가 다른건지 알고싶습니다.
0.1*100도 10.000002가 나와야할것 같은데 의외로 정확하게 나와서 당황했습니다. 어떻게 이렇게 되는지 알려주세요!
File attachments:
첨부 | 파일 크기 |
---|---|
source.png | 146.17 KB |
Forums:
십진수 0.1이 이진수로는
십진수 0.1이 이진수로는 0.000110011...... 인 무한소수인데 CPU의 FPU가 이중 64개의 유효숫자만 잘라서 계산하기 때문에 끝자리 부분에서 계산의 차이가 생기죠.
0.25로 같은 계산을 하면 정확한결과가 나올겁니다.
저것 뿐만 아니고 같은 계산을 곱하기와 나누기의 순서를 바꾸어도 결과가 달라질 수 있습니다.
계산의 차이가 있는건 알고있습니다
0.1이 2진수로 무한소수이고 이것이 단정도나 배정도에서 짤려 저장이되기에 정확하지 않음은 저도 알고있습니다.
제가 궁금한건 0.1이 100번더해서 10.000002가 되는건 알겠지만 100을 곱해서 10.000000 이 왜 나오는지를 알고싶습니다
말씀하셨듯이 0.1은 무한소수로 나오니 100번 더하나 100을 곱하나 정확히 10이 나오진 않더래도 둘의 값은 동일해야하는것 아닌가요??
컴퓨터의 곱셈이 덧셈의 반복과는 다를 수
컴퓨터의 곱셈이 덧셈의 반복과는 다를 수 있죠.
덧셈의 경우는 마지막 유효숫자가 누진되어 계속 더해지지만, 곱셈은 유효숫자끼리 곱해서 자리수만 맞추기 때문에 끝자리가 잘려 나갑니다.
이산수학을 공부해 보세요.
답변 감사합니다.
알것 같으면서도 잘 모르겠네요ㅠㅠ 회로측면에서는 곱셈기가 단순히 full adder로 연결되어있어서 유효숫자의 반복덧셈이나 곱셈이나 마찬가지일줄 알았는데 그게 아닌가보군요... 아무튼 답변 감사합니다.
아래 글을 보시면 DarkSide 님께서 언급하신
아래 글을 보시면 DarkSide 님께서 언급하신 내용이 있습니다.
http://en.wikipedia.org/wiki/Floating_point#Multiplication_and_division
/*** Signature ******************
* blog: http://blog.bluekyu.me/ *
********************************/
감사합니다~
보고나니 이해가 되었네요...! 감사합니다
덧셈을 반복하는 과정에서 유효숫자의 제한으로 인한
덧셈을 반복하는 과정에서 유효숫자의 제한으로 인한 잘림, 올림이 계속 반복되죠.
예를들어, 10진수의 휴효숫자 4자리 시스템에서 1001을 반복해 더한다면 10번 더하면 10010 이 되는데 그 다음부터는 1001 이 아닌 1000 이 더해지게 됩니다.
그럼 덧셈으로 인한 유효자리 숫자 제한
그럼 덧셈으로 인한 유효자리 숫자 제한때문에 덧셈을 할때마다 잘려 올라가고, 곱셈은 한번의 연산으로 해결되서 차이가 나는건가요??
곱셈기 회로때문에 계속 곱셈기도 덧셈기로 이루어져있어서 곱셈도 역시 덧셈의 연산으로 이루어지는게 아닌가해서 헷갈리네요ㅠㅠ 답변 감사합니다!
댓글 달기