4.5부동소수점

23
4.5 부부 부부부 부 부부부부 부부부 ( 부부부부 )

Transcript of 4.5부동소수점

Page 1: 4.5부동소수점

4.5 부동 소수점 수

데브루키박재홍 ( 꿈꾸는소 )

Page 2: 4.5부동소수점

목차 4.5 부동 소수점 수 4.6 이진 과학적 기수법 4.7 IEEE 754 부동 소수점 표준 4.8 실무에서의 부동 소수점

Page 3: 4.5부동소수점

4.5 부동 소수점 수 4.5.1 리뷰 : 과학적 기수법과학적 기수법은 다 부분들로 구성됨1. 다음과 같은 가수라고 불리는 정수

2. 지수라고 불리는 정수

지수와 가수가 함께 수를 생성하기 위해서 결합된다 .

1.0≤∨𝑚𝑎𝑛𝑡𝑖𝑠𝑠𝑎∨¿10.0

𝑚𝑎𝑛𝑡𝑖𝑠𝑠𝑎×10𝑒𝑥𝑝𝑜𝑛𝑒𝑛𝑡

Page 4: 4.5부동소수점

4.5 부동 소수점 수 4.5.2 제한된 과학적 기수법과학적 기수법에 대한 규칙들1. 가수는 한자리 , 0 이 아닌 정수로 쓰여야만 한다 .

2. 가수는 소수부 수들의 고정된 개수를 가지고 쓰여야만 한다 .( 이것을 M 이라고 정의 )

3. 지수는 고정된 개수의 수들로 쓰여야만 한다 .( 이것을 E 라고 정의 )

4. 가수와 지수는 각각 개별적인 부호를 가진다 .

예를 들어 M=3, E=2 인 형식

1.1 2 3

=()x(9x)x(2)x(2)=3,600,000

Page 5: 4.5부동소수점

4.5 부동 소수점 수 4.5.2 제한된 과학적 기수법가수의 선두 수는 반드시 0 이 아니어야 한다 .

즉 [1,9] 사이 값에 대해 9 가지 선택이 존재 ,

9x10x10x10=9000

이것이 이 기수법의 범위와 정밀도 둘 모두를 유한하도록 한다 .

최소 , 최대 지수

최대 가수 값

최대 표현 가능한 값 :

최소 표현 가능한 값 :

가장 작은 양의 값 :

± (10𝐸−1 )=± (102−1 )=±9910.0− (10−𝑀 )=10.0− (10− 3 )=10.0−0.001=9.999

Page 6: 4.5부동소수점

4.6 이진 과학적 기수법밑수가 10 이어야 할 이유는 없다 . 2 인 경우를 보자

여기서 Mantissa 는 정규화된 1- 도트 -M 고정 소수점 수Exponent 는 E 비트 정수 , SignM, SignE 는 각각 부호를 표현 할 독립적인 비트

읭 ? 8 비트는 256 개가 아닌가 ?

가수의 선두 비트가 반드시 1 이라는 사실을 기억하자 . 그래서 개수도 반으로 준다 .

SignM X Mantissa X

=()x(1x)x(2)x(2)==128

Page 7: 4.5부동소수점

4.6 이진 과학적 기수법최소 , 최대 지수

최대 가수 값

최대 표현 가능한 값 : = 15

최소 표현 가능한 값 :

가장 작은 양의 값 :

여기 까지는 기본 개념이다 !

± (2𝐸−1 )=± (22−1 )=±3

2.0− (2−𝑀 )=2.0− (2− 3 )=1.875

Page 8: 4.5부동소수점

4.7 IEEE 754 부동 소수점 표준1970 년대 초에서 중기까지 과학자들과 공학자들은 실수 표현을 위해 매우 자주 부동 소수점을 이용하였는데 표준의 부재가 문재를 일으켰다 !

그 것은 컴퓨터의 제조사와 모델에 따라 다른 결과를 생성했기 때문 ! 플랫폼 의존적이었다

Page 9: 4.5부동소수점

4.7 IEEE 754 부동 소수점 표준 4.7.1 기본 표현http://enc.daum.net/dic100/contents.do?query1=10XXX14125

부호 비트는 양수를 나타내고 1 인 부호 비트는 음수를 나타냄

지수 비트는 자체가 값이 아니라 수치에서 bias 값을 빼주어 값을 낸다 . – 예를 들어 설명

가수 비트는 가장 좌측의 값이 2 의 0 제곱 그 다음이 2 의 -1 제곱 그 다음이 2 의 -2 제곱 … 이처럼

32 비트 단정밀도 부동소수점을 기준으로 2 의 -23 제곱 자리까지 표현할 수 있다 .

Page 10: 4.5부동소수점

4.7 IEEE 754 부동 소수점 표준 4.7.2 범위와 정밀도단정밀도 부동 소수점에서 밑수가 2 인 최대 지수가 127 이라는 것을 알았다 .

그렇다면 최대 가수는 ..

최소 , 최대 단정밀도 부동 소수점 값들은 다음과 같다 .

주어진 정규화된 가수와 가장 가까운 이웃 사이의 차이는 이고 임의의 지수 E 가 주어졌다면두 이웃하는 단정밀도 값 사이의 차이는 다음과 같다 .

1.0+= 1.0+1.0 - = 2.0 - 2.0

±(2.0− 1

223 )×2127≈±3.402823466×1038

𝛿 𝑓𝑝=2𝐸×2− 23=2𝐸− 23

Page 11: 4.5부동소수점

4.7 IEEE 754 부동 소수점 표준 4.7.2 범위와 정밀도를 곱해서 의 항으로 |A| 의 경계를 지을 수 있다 .

이 식으로 |A| 를 전체 지수 항 의 근사값으로 대략 구할 수 있다 .

또 주위에 이웃하는 부동 소수점 값 들 사이 거리의 근사값을 구하기 위해 대입할 수 있다 .

절대 오류와 상대 오류

=

AbsError A 𝑅𝑒𝑙𝐸𝑟𝑟𝑜𝑟 𝐴=𝐴𝑏𝑠𝐸𝑟𝑟𝑜𝑟 𝐴

¿ 𝐴∨¿≈|𝐴|

224×|𝐴|= 1224

¿

고정 소수점과 반대의 사실 .. 고정소수점은 절대 오류가 상수이고 상대오류는 표현된 값들에 반비례로 커졌었다 .

Page 12: 4.5부동소수점

4.7 IEEE 754 부동 소수점 표준 4.7.3 산술 연산- 덧셈과 뺄셈기수 점들은 그 것들의 지수가 동일할 경우에만 정렬된다 .

표준 부동 소수점 덧셈 방법은 두 양수 그리고 더하기 위해 이렇게 작동한다 .

1. 만약 필요하다면 이기 위해서 A 와 B 를 교환한다 .

2. - 비트 만큼 오른쪽으로 를 쉬프트한다 . 만약 라면 , 그 때 이 쉬프트된 는 정규화 되어 있지 않을 것인데 는 1.0 보다 작을 것이다 . 기수 점을 정렬하기 위해서 이러한 과정이 필요하다 .

3. 직접 쉬프트된 가수 그리고 를 더해서 를 계산한다 .

4. = 로 설정한다 .

5. 결과 가수 가 정규화 되어 있지 않는 경우라면 , 오른쪽으로 1 비트 만큼 를 쉬프트하고 에 1 을 더한다 .

Page 13: 4.5부동소수점

4.7 IEEE 754 부동 소수점 표준 4.7.3 산술 연산- 곱셈명시적인 부호 비트를 사용하여서 결과의 부호는 부호 비트들의 XOR 를 수행함으로써 간단하게 계산된다 .

부호들이 동일하다면 양의 결과를 그렇지 않다면 음의 결과를 생성한다 .

지수부 지수 정렬 필요없이 지수를 단순히 더하지만 두 지수 모두 127 의 바이어스값을 포함하고 있기 때문에결과는 254 의 바이어스 값을 가지고 있다 . 그래서 127 을 빼야 한다 .

가수부가수끼리도 곱셈을 하게 된다 . 단 결과 가수가 반드시 1.0 보다 커야한다 . 정규화 되어 있지 않는다면지수부에 1,2 를 추가한뒤 1,2 만큼 오른쪽으로 쉬프트 할 수 있다 .

Page 14: 4.5부동소수점

4.7 IEEE 754 부동 소수점 표준 4.7.3 산술 연산반올림 모드4 가지의 반올림 모드가 있다 .

1. 0 으로 반올림2. - 무한대로 반올림3. 무한대로 반올림4. 가장 가까운 값으로 반올림가수를 표현 될 수 있는 M 이라고 부르는 부분과 그 나머지 하위 비트들인 R 이라고 부르는 부분으로분해한다 . 0 으로의 반올림은 또한 버림이라고 하는데 M 은 사용되고 R 은 무시되거나 잘라낸다 .

무한대로의 반올림은 R=0 인지 아닌지로 나뉘게 된다 .

Page 15: 4.5부동소수점

4.7 IEEE 754 부동 소수점 표준 4.7.4 특수한 값1. 0

2. 무한3. 수가 아닌 값들

Page 16: 4.5부동소수점

4.7 IEEE 754 부동 소수점 표준 4.7.5 매우 작은 값정규화된 가수 들과 0 의 구멍

정규화된 가수의 한 가지 부작용은 0 근처에서 흥미롭게 작동 한다는 것이다

최소의 정규화된 값을 살펴보자 (min 으로 정의 )

지수가 -126 인 부분 =

위 값보다 단지 비트 1 만 다른데 최하위 가수 비트가 설정된다 .(next 라고 정의 )

=min

둘 사이의 거리next-min=

Min 의 0 과의 거리가 가장 가까운 이웃의 거리보다 크다 . 라는 것을 알 수 있다 . 정밀도를 표현할 수 없는 0.0 과 min 사이 수들의 커다란 구멍을 남긴다 . 그리고 종종 그것을 0 으로의 플로싱이라고 말한다 .

여기서 문제점을 하나 보자면 서로 다른 수들의 뺄셈이 0 이 될 수 있다는 것이다 . A-B=0 이지만 A 는 B 와 같지않다 .

Page 17: 4.5부동소수점

4.7 IEEE 754 부동 소수점 표준 4.7.5 매우 작은 값디노멀과 점진적인 언더플로우IEEE 명세는 0 의 구멍이라고 불리는 문제를 해결하기 위한 매우 작은 수들에 대한 행위를 상술한다 .

이러한 행위를 점진적인 언더플로우라고 하고 이러한 점진적인 언더플로우는 디노멀 또는 디노멀라이드 수 라고 불리는 값들을 생성한다 .

디노멀에서 지수는 -126 이 된다고 가정되고 가수는 범위 안에 있다 .

명세가 단지 지수가 유효한 최소 지수인 -126 일 때 디노멀라이즈드 가수를 허용함으로써모든 0 이 아닌 부동소수점 값들이 여전히 유일하다는 것을 기억하자 .

[ 1223 ,1− 1

223 ]

Page 18: 4.5부동소수점

4.7 IEEE 754 부동 소수점 표준 4.7.7 배정밀도IEEE 754 명세는 C/C++ 에서 내장 double 형으로 알려진 64 비트 배정밀도 부동 소수점 값을 지원한다 .

비트단위 구조를 가지고 단정밀도 형식과 완전하게 동일하다 .

부호 1 비트 지수 11 비트 가수 52 비트이러한 구조로 배정밀도는 거의 대부분의 범위와 많은 정밀도 논제들에서 해결첵이 있지만 이것도 결점은 있다 .

결점들1.메모리 . 정밀도 값들은 단정밀도 값들의 저장소의 두 배를 요구하고 특히 벡터들의 배열들이 배정밀도로 저장되어야만 할 경우에 어플리케이션에서 요구하는 메모리가 가파르게 증가할 수 있다2. 성능 . 당연히 메모리가 증가하고 범위가 많아져 계산 속도가 엄청 느리다3. 플렛폼 논제들 . 모든 플렛폼이 배정밀도를 지원하는 것은 아니다 .

Page 19: 4.5부동소수점

4.8 실무에서의 부동 소수점 4.8.1 내부 FPU 정밀도Main ()

{

float fdumy =1.0e30f; // 유효한 단정밀도fdumy *= 1.0e38f; // 결과 = 무한fdumy /= 1.0e38f; // 뭥미 ?

}

다음과 같은 상황이 메이저 컴파일러들과 시스템들에서 발생한다 .

1. 초기 할당 이후에 fdumy = 1.0e30 이 될 것이 예상된다 .

2. 곱셈 이후에 fdumy = 무한대가 될 것이 예상된다 .

3. 나눗셈 이후에 fHuge = 1.0e30 이다 !

컴팡일러가 생성하는 기본적인 단계들4. 1.0e30 그리고 1.0e38 을 FPU 로 적재한다 .

5. 적재된 두 값들을 곱하고 무한대로 반환한다 . 그 결과도 마찬가지로 FPU 에서 유지한다 .

6. 이전결과를 1.0e38 로 나누면 , 올바를 결과를 반환한다 .

Page 20: 4.5부동소수점

4.8 실무에서의 부동 소수점 4.8.2 성능간혹 원래 성능보다 20배는 느리게 하는 코드들이 있다 . 그것을 단순히 디노멀의 범위 밖으로 살짝 조절해서 정규화된 부동 소수점 값들로 바꾸었더니 다시 원래 성능으로 돌아왔다 . 하지만 계속 언제까지 그런 수작업을 해야한단 말인가 !

Float TestFunction(float fValue){

return fValue;}Main(){

int I;float fTest;for(i = 0; i<10000; i++)

fTest=TestFunction(1.0e-36f);for(I = 0; i<10000; i++)

fTest=TestFunction(1.0e-40f);}

Page 21: 4.5부동소수점

4.8 실무에서의 부동 소수점- 소프트웨어 부동 소수점 애뮬레이션애플리케이션들은 새로운 플랫폼이 하드웨어 지원 부동 소수점을 제공하는지 아닌지를 판별하기위해서매우 주의 깊게 살펴본다 .

코드를 이식하고 재작성 없이 실행하는 것을 만족 하기 위해서 ..

=>왠지 노가다 같은 작업

모든 FPU 들이 단정밀도와 배정밀도를 지원하지 않는다는 것을 상기하는 것도 가치가 있다 .

예를 들어 몇몇 주요 게임콘솔들은 단정밀도 코드에 대해서 FPU 코드를 생성하고 배정밀도 값들에대해서는 애뮬레이션 코드를 생성 할 것이다 .

결국 배정밀도의 부주의한 사용은 매우 느린 코드를 야기시킨다 .

Page 22: 4.5부동소수점

4.8 실무에서의 부동 소수점 4.8.3 IEEE 명세에 대한 순응과거 보다는 아니지만 현재 최신 CPU 들도 모든 부동소수점 장치들이 항상 완벽히 IEEE 명세에 따르면서단정밀도와 배정밀도 모두를 지원한다고 생각하는 것은 안전하다는 의미는 아니다 .

인텔의 SSE

128 비트 레지스터에 함축된 네 개의 부동 소수점 값들에 병렬로 수학 연산들을 실행 할 수 있는 특별한 벡터 프로세서이다 .

특수한 목적의 FPU 장점에 관련된 여러 설계결정들을 나열한다 .

1. 초기 SSE 명령어들은 단지 32 비트 부동 소수점 값들만 지원 할 수 있다 .

2. 디노멀 값들은 점진적인 언더플로우를 비활성화하도록 0 으로 반올림 될 수 있다 .

3. 완전한 IEEE 754 동작은 선택 사항으로 제공될 수 있지만 최대 성능보다 반 이하로 떨어진다 .

3D 특화 FPU

4. 연산수로 무한대 또는 NaN 을 허용하지 않는다 .

5. 무한대가 아닌 최대 정규 부동 소수점 값은 오버플로우를 발생한다 .

6. 0 으로의 플로시는 단지 언더 플로우의 한가지 형태이다 .

7. 부동 소수점 예외들에 대한 지원은 없다 .

Page 23: 4.5부동소수점

들어주셔서 감사합니다 ~!!- 끄 읏 -