본문 바로가기
CS/컴퓨터 구조

[Chapter 3.8 컴퓨터 구조 및 설계] 연산에 있어서 겪을 수 있는 오류 및 함정

by 베어 그릴스 2022. 7. 16.
본 정리는 CS422-컴퓨터 구조 및 설계 : 하드웨어/소프트웨어 인터페이스. David A. Patterson, 존 헤네시 책을 바탕으로 하고 있음을 미리 알립니다.

 

오류와 함정


(여기서 부르는 함정은 흔히들 하는 실수이고, 오류는 많은 사람들이 공통적으로 잘못 알고 있는 부분이다.)

 

오류 : 한 비트 왼쪽 자리이동 명령어가 2를 곱해준 것과 같은 결과를 보이듯이 오른쪽 자리이동 명령어는 2로 나누어 준 것과 같은 결과를 나타낸다.

 

해당 오류는 부호 없는 정수에서는 찾을 수 없다.

문제는 부호있는 정수를 사용하는 경우이다.

 

예를 들어, -5를 4로 나눈다고 생각하자.

 

1111 1111 1111 1111 1111 1111 1111 1011 (-5의 2의 보수 표현법)

 

이러한 오류에 따르면 2비트 오른쪽으로 자리이동한 것은 4로 나눈 것과 샅아야 한다.

 

0011 1111 1111 1111 1111 1111 1111 1110

 

이 수는 -1이 아닌 양수의 굉장히 큰 수가 되어버렸다.

 

해결책은 좌측에 0이 아닌 1을 채우는 것이다. 이렇게 해도 값이 정확하진 못하다. (-5 / 4는 -1이 나와야함.)

 

1111 1111 1111 1111 1111 1111 1111 1110 (-2의 2의 보수 표현법)

 

 

함정 : 부동소수점의 덧셈은 결합법칙이 성립하지 않는다.

 

관례적으로, c +(a+b) = (c+a)+b 는 성립하지만 부동소수점에서는 그렇지 못하다.

 

다음의 예를 통해 알 수 있다.

예시. E38은 10의 38제곱을 말한다.

즉, 부동소수점 수는 정밀도에 있어서 한계가 있고, 실제 결과의 근삿값을 결과로 취하기 때문에 이러한 결과가 나오게 되는 것이다.

 

 

오류 : 정수 데이터 형에서 사용되는 병령 수행 방식은 부동소수점 데이터형에도 똑같이 적용된다.

 

프로그램은 일반적으로 병렬로 수행되는 것을 작성하기 전에 순차적 수행 버전이 작성된다. 따라서 두 버전이 같은 결과를 얻는 것이 중요하다. 예를 들어, 100만개의 수를 더하는데 한 개의 프로세서를 사용한 것과 1000개의 프로세서를 사용한 것의 결과가 같아야한다.

 

정수형이면 정수 것셈은 결합법칙으 유효하므로 옳지만, 부동 소수점 덧셈은 결합법칙이 성립되지 않으므로 이 가정은 옳지 않다.

 

 

 

함정 : MIPS 명령어 addiu는 16비트의 수치 빌드를 부호확장하여 사용한다.

 

addiu는 오버플로에 대해 신경 쓰지 않을 때 상수를 부호있는 정수에 더하는 데 사용된다. MIPS는 수치를 사용하는 뺄셈 명령어를 지원하지 않으므로 음수는 부호확장되어야한다. 따라서 MIPS 구조는 수치필드를 부호확장하여 사용한다.

 

 

오류 : 이론 수학자만이 부동소수점 연산의 정확성에 신경쓴다.

 

부동 소수점의 연산의 정확성에 신경쓰지 않아 나타난 버그가 매우 많다.