안녕하세요. wrong time no see. 이번 시간에는 부동 소수점 연산에서 분배 법칙이 성립하지 않는 데이터를 만들어 보고자 해요. 먼저 결론부터 보여주는 것이 속 편하겠군요. a가 1.5이고, b는 1.0 + 1/2^52, c는 1/2^52입니다. 이 때, a(b+c)와 ab + ac의 값이 다르게 나옵니다. 더 정확하게 말하면, ab + ac를 계산하는 과정에서 오차가 생깁니다. 결과 값으로 나온 d와 e의 비트 표현을 보겠습니다. 어랏? 다르다는 것을 한 번에 알 수 있어요. 왜 다를까요? 하나 하나 tracing을 해 봅시다. 먼저 b, c, b+c를 보겠습니다. b, c, b+c를 비트로 표현하면 요래 되는데요. 먼저, 011 1111 1111과 011 1100 1011은 52만큼 차이남..
부동소수점 검색 결과
부동 소수점에서 결합 법칙은 성립하지 않는다고 합니다. 어떤 경우에 성립을 하지 않을까요? 간단하게 테스트 케이스를 만들어 보도록 하겠습니다. 프로그램 1을 보겠습니다. a가 1.0이고 b가 1.0인데 c는 (2^53)입니다. 그리고 d는 1.0 + (1.0 + 2^53)의 값을 출력하고요. e는 (1.0 + 1.0) + 2^53의 값을 출력해요. 두 값이 같을까요? 결론은 같지 않았습니다. 어떻게 이런 데이터를 만들었을까요? 영어 위키에 있는 문서에 따르면, 64bit짜리 floating point의 경우, fraction 부분이 52 bit라고 해요. 이것을 보고 데이터를 만들었습니다. 뜬금없이 무슨 멍멍이 소리를 하고 있네요. 어떤 의미인지 밑에서 후술하겠습니다. printDoubleBits입니다...
저번에 부동 소수점에 대한 이야기를 했었습니다. 그러면 C언어에서 double과 float의 차이는 무엇일까요? 정밀도 차이입니다. 그리고 오차 범위도 차이가 날 수 밖에 없는데요. 저는 이 두 가지를 중점적으로 보도록 하겠습니다. 일단, 부동 소수점 같은 경우, 소수부가 2^q꼴 실수인 것들만 표현할 수 있어요. 예를 들어 0.5, 1.625와 같은 것들이 그러한 예입니다. [관련글] 왜 0.1을 저장하면 오차가 생길까요? 이번에는 오차에 대해서 간략하게 짚고 넘어가 보도록 하겠습니다. 먼저 float형, 그러니까 단정밀도를 IEEE 754 형식으로 표현하면 아래와 같습니다. 이는 실수 z가 (1.xxx)와 2^(yyy-bias)의 곱으로 표현이 될 때, 저래 들어간다는 겁니다. 단정밀도는 이 bias..
부동 소수점은, 가수부와 지수부로 나누어서 저장을 합니다. 즉, (a)*2^b꼴로 저장을 하는데요. 이 때, a는 1보다 크거나 같고, 2보다 작은 실수입니다. 즉, (1.xxx)*2^b 꼴로 저장을 한다는 겁니다. 여기까지는 그리 어렵지 않을 것이라고 생각합니다. 보통 부동 소수점, 우리가 흔히 알고 있는 float이나 double형은 이런 식으로 저장이 됩니다. 지수부랑, fraction. 즉 가수부랑 나누어서 저장을 하고 있는데요. 이 fraction 부분은 (1.xxx)*2^b로 표현했을 때, 0.xxx 부분을 저장한다고 보시면 됩니다. 0.xxx를 2진수로 표현해서 저장할 겁니다. 그러면, 실제로 0.1이 어떻게 저장되는지 봅시다. 저는 먼저 double과 long long이 같은 메모리 공간을..
최근댓글