[Section 1 - Floating-Point Number System]
[Section 2 - Floating-Point Number의 연산]

square65_blue.gif 2.1 Introduction

    컴퓨터는 사람과 달리 계산하고, 저장하는데 유한한 공간만을 가지고 있다. 그러다 보니, 사람들이 손쉽게 생각할 수 있는 무한의 개념을 보유하고 있지 않아서, 여러 가지 계산을 하는데 있어서, 이상적인 값(Ideal value)를 찾기가 굉장히 어렵다. 따라서, 컴퓨터는 그에 근접하는 값만을 빠른 속도로 찾는데 그 계산적인 의의가 있다.

    이러한 점 때문에 항상 Computer를 이용한 해석에는 Round-off 에러가 존재한다. 이는 우리가 생각하는 이상적인 값이 접근하기 전에 얼마만큼의 차이를 표현하는 값이다. 이러한 값을 표현하기 위해서는 Computer에서는 다음과 같은 실수의 표기법을 사용한다. (이 내용은 IEEE에서 인정한 방법이다.)

    dia_bluve.gif Definition 2.1.1 [Floating-point Number]

    b를 기본으로 하는 floating-point number 는 다음과 같은 형태를 갖는다.

    여기서, 들은 모두 정수이며,

    라는 조건을 만족한다.

    일반적으로 b는 여러 가지의 수가 올 수 있다. 컴퓨터는 2진수를 기반으로 시스템이 구성되므로, 그에 확장인 8이나, 16등이 b로 사용된다. 물론 사람은 10진수에 익숙하므로, 10진수를 즐겨쓰게 된다.

    위와 같은 표기법에서 얻을 수 있는 장점은, 일반적인 실수를 t개의 유한한 개수의 저장부에 저장할 수 있다는 점이다. (예를 들면 t=16이면, 16byte의 메모리에 값을 넣을 수 있다.) 그러면서 동시에 상당히 작은 실수나, 자연수도 표현하기 쉽다는 장점을 가지게 된다.

    dia_bluve.gif Example 2.1.1

    이러한 수들이 floating-point의 예제이다.

    한번 마지막 수인 를 계산해 보자.

    즉, 이런 식으로 값들을 표현하는 것이다.

    참고로, t는 digit라고도 표현하기도 한다. 이는 정보를 처리할 수 있는 최소의 메모리를 의미한다.

    dia_bluve.gif Definition 2.1.2 [Error들]

    만일 가 실수이고, 이 floating-point number에 의해 접근하는 값이라면 는 absolute error이라 하고, 는 relative error라고 한다.

    예제를 보자.

    dia_bluve.gif Example 2.1.2

    만일 62,133과 의 두 수가 있다고 하자. 이 경우 absolute error를 계산하면 -3이 나온다. 그리고 relative error를 계산하면 가 된다.

    위의 두 에러들은 접근해야 할 값이 어떤 방법의 신뢰도를 가져야 하는지에 대해서, 어떤 것을 채택할 것인지 판단을 하게 된다.

    마지막으로 machine precision (또는 machine epsilon)에 대해서 이야기해보도록 하자. 이 값은 기계 자체가 가지고 있는 정확도를 이야기하는 값으로, relative error에서 나온 값이다.

    Relative error를 라고 하면 다음과 같이 될 것이다.

    따라서

    의 형태가 될 것이다. 이를 임의의 양의 에 의해서 를 bounded시키는 값을 machine precision이라 부르며, 이 값은 이 되는 가장 작은 값이 된다. (단 은 floating-point number이며, 1은 실수이다.)

    dia_bluve.gif Example 2.1.3 Machine Precision 산출법

    어떤 컴퓨터의 현재 floating-point number가 다음과 같은 형태로 계산이 된다고 하자.

    (단 는 floating-point number이다.)

    그렇다면 하나의 digit를 증가시킨 다음 값은

    이 되며 이는 컴퓨터에서 관찰할 수 있는 제일 작은 값으로써, 은 machine precision이 된다.

bar01_dot1x1_black.gif

square65_green.gif 2.2 Floating-Point Number의 연산

    일반적으로 이 floating-point number라고 하고, 가 machine precision이라고 하자. 이 경우 Floating-Point Number의 사칙연산을 고려해보자.

    • Addition
      • .

위의 는 machine precision이므로, computer가 을 중심으로 생각하느냐, 를 중심값으로 생각할 수 있겠느냐가 큰 관건이 된다.

    dia_bluve.gif Example 2.2.1 Floating-Point의 덧셈연산예제

    만약 , 이라 하자. 일단 의 자리수에 맞추어 두 수의 자리를 맞춰서 표기하면,

    앞의 유효숫자를 계산해보자.

    이므로

    이다. 따라서 이 된다.

    만일 위에서 의 값을 다르게 배정하여 다음과 같이 계산했다면,

    (의 자리수에 맞추기 위하여 의 맨 마지막 4를 버렸다.)

    이 경우 이 되어서,

    의 값이 나올 것이다. (∵)

    이러한 과정은 전 과정에 적용되므로 우리는 아래와 같은 Theorem을 생각할 수 있다.

    dia_bluve.gif Theorem 2.2.1 덧셈에 대한 정리

    . 단 에서 나오는 machine precision.

    마찬가지로 곱에 대하여도 를 생각할 수 있는 sequence 를 다음과 같이 생각한다.

    그러면 우리는 곱하기 연산을 다음과 같이 생각할 수 있다.

bar01_dot1x1_blue.gif

square65_orange.gif 2.3 불량조건문제(Ill-conditioned problem)

컴퓨터는 기본적으로 가지는 Machine-epsilon에 의하여 항상 해를 구하지 못하게 되는 경우가 있다. 일반적으로 우리는 해당하는 문제에 대하여, 풀 수 있는 문제(solvable problem)과 풀 수 없는 문제(unsolvable problem)가 있으나, 컴퓨터의 경우, 이산적인 특성 때문에 자신이 표현하는 값에 대해서는 해당 값을 적절히 표현하지 못하는 문제점을 가지고 있다.

이 때문에 불량조건문제가 발생한다. 이 문제는 기기가 가지고 있는 machine-epsilon에서 그 문제가 기인한다. 이것은 특히 소수점 이하로 machine-epsilon에 접근하는 경우 그 문제가 자주 발생하는 것을 볼 수 있다.

예를 들어 다음의 방정식을 보자.

이 두 직선  A와 B는 실제로 매우 가까운 직선이다. 이 해를 구해 보면, , 가 나온다.

자 여기서 이번에는 직선 대신 다음과 같은 직선 에 대한 연립방정식을 생각해 보자.

이 식은 상수항을 0.001만큼 증가시킨 식이다. 이러한 직선은 에서 매우 약간 벗어나게 된다.  그러나 이 식과 와의 연립방정식의 해는 아까의 값과 판이하게 다르다. , 의 값이 나온다.

이 원인은 무엇일까? 실제로 직선 는 매우 작은 각도로 만나고 있다. 이는 불량조건문제(ill-condition)문제가 되기 쉽다는 점을 내포한다.

따라서 행렬에서도 같은 문제를 유추해 낼 수 있다. 이를 정리하면 다음과 같은 경우이다.

  1. 계수(또는 행렬 원소)의 작은 변화(Perturbation)해의 큰 변화의 중요한 요인이 된다.
  2. 계수행렬의 대각 원소는 비대각원소(off-diagonal elements)보다 작은 경향이 있다.
  3. 계산되어진 는 1로부터 크게 벗어난다.
  4. 계산되어진 와 크게 다르다.
  5. 계산되어진 는 항등행렬과 크게 다르다.
  6. 보다도 더 항등행렬로부터 벗어난다.

이러한 문제를 배제하기 위해서는 정밀도(precision, 또는 Torelance)를 증가시키거나, 해당 문제를 만나지 않도록 완화된 방법을 써야만 한다.

마지막으로, 불량조건문제(ill-codition problem)을 야기할 수 있는 행렬을 소개한다.

위의 행렬의 행렬식의 값(Determinant)와 , 그리고, , 을 구해보면 큰 차이가 나는 것을 알 수 있다. 이 행렬의 일반식은 아래와 같으며, 해당 행렬의 차수가 커지면 커질수록 불량조건문제(ill-condition)문제가 된다.

, 단

이에 대한 Mathematica 예제를 보자. 예제는 총 3개로 이루어져 있다. 첫 번째 sample1.nb는 위의 행렬에 대해 Mathematica에서 Symbol을 중심으로 계산한 것이다. 이 경우에는 Mathematica는 수치적인 계산을 하지 않기 때문에, 우리가 아는 결과와 동일하게 나온다. 그러나 sample2와 sample3의 Mathematica파일에서는 위에서 이야기한 문제가 야기되며, sample3의 경우, 행렬의 차수를 증가시킨 결과이기 때문에, 에러까지 야기한다.

이러한 문제는 아래에서 소개할 LU-분해에서 더욱 많이 발생한다. 따라서 이러한 문제를 생각하고, LU-분해에 접근해야 한다.

bar01_dot1x1_darkyellow.gif

Copyright © 2002, Made by SML(Sungkyunkwan Univ. Linear algebra Lab.), All rights reserved.