본 정리는 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 는 성립하지만 부동소수점에서는 그렇지 못하다.
다음의 예를 통해 알 수 있다.
즉, 부동소수점 수는 정밀도에 있어서 한계가 있고, 실제 결과의 근삿값을 결과로 취하기 때문에 이러한 결과가 나오게 되는 것이다.
오류 : 정수 데이터 형에서 사용되는 병령 수행 방식은 부동소수점 데이터형에도 똑같이 적용된다.
프로그램은 일반적으로 병렬로 수행되는 것을 작성하기 전에 순차적 수행 버전이 작성된다. 따라서 두 버전이 같은 결과를 얻는 것이 중요하다. 예를 들어, 100만개의 수를 더하는데 한 개의 프로세서를 사용한 것과 1000개의 프로세서를 사용한 것의 결과가 같아야한다.
정수형이면 정수 것셈은 결합법칙으 유효하므로 옳지만, 부동 소수점 덧셈은 결합법칙이 성립되지 않으므로 이 가정은 옳지 않다.
함정 : MIPS 명령어 addiu는 16비트의 수치 빌드를 부호확장하여 사용한다.
addiu는 오버플로에 대해 신경 쓰지 않을 때 상수를 부호있는 정수에 더하는 데 사용된다. MIPS는 수치를 사용하는 뺄셈 명령어를 지원하지 않으므로 음수는 부호확장되어야한다. 따라서 MIPS 구조는 수치필드를 부호확장하여 사용한다.
오류 : 이론 수학자만이 부동소수점 연산의 정확성에 신경쓴다.
부동 소수점의 연산의 정확성에 신경쓰지 않아 나타난 버그가 매우 많다.
'CS > 컴퓨터 구조' 카테고리의 다른 글
[Chapter 4.2 컴퓨터 구조 및 설계] 클러킹 방법론과 Combinational element, Sequential Element (0) | 2022.07.18 |
---|---|
[Chapter 4.1 컴퓨터 구조 및 설계] 프로세서 구현에 대한 개요 (명령어는 하드웨어에서 어떻게 실행되는가) (0) | 2022.07.17 |
[Chapter 3.7 컴퓨터 구조 및 설계] 부동 소수점 곱셈 (0) | 2022.07.15 |
[Chapter 3.6 컴퓨터 구조 및 설계] 부동 소수점 덧셈 (0) | 2022.07.15 |
[Chapter 3.5 컴퓨터 구조 및 설계] IEEE 754 부동 소수점 반올림과 근사 (0) | 2022.07.13 |