시스템 클래스 FLOAT — 부동소수점(float)

시스템 클래스 FLOAT — 부동소수점(float)

소수를 다룰 때 우리가 쓰는 부동소수점 수가 FLOAT 타입입니다. 이 페이지는 float가 수학적으로 어떻게 정의되는지, 그리고 타입 지정자로는 어떻게 쓰는지 정리한 내용이에요.

출처: CLHS — System Class FLOAT

클래스 우선순위 목록

float, real, number, t

본문 (Description)

float 는 수학적 유리수(Common Lisp의 rational이 아니라)로서 다음 형태로 표현됩니다.

s * f * b^(e - p)

각 기호는 다음을 의미해요.

  • s부호(sign), +1 또는 -1
  • b밑(base/radix), 1보다 큰 정수
  • p정밀도(precision), float의 밑-b 자릿수로 나타낸 양의 정수
  • f가수(significand), b^(p-1)b^p - 1 사이(포함)의 양의 정수
  • e지수(exponent), 정수

p의 값과 e의 범위는 구현과, 그 구현 안에서의 float 종류에 따라 달라집니다.

여기에 부동소수점 0(floating-point zero) 이 있고, 구현에 따라서는 마이너스 0(minus zero) 도 존재할 수 있어요.

  • 마이너스 0이 없다면 0.0-0.0은 모두 그냥 부동소수점 0으로 해석됩니다. 이 경우 (= 0.0 -0.0)은 항상 참이에요.
  • 마이너스 0이 있다면 (eql -0.0 0.0)은 거짓이 되고, 없다면 참이 돼요.

FLOAT의 하위 타입

short-float, single-float, double-float, long-float 네 타입은 float의 하위 타입입니다. 이 중 어떤 두 타입은 서로 분리된 타입(disjoint) 이거나 같은 타입이어야 해요. 그리고 만약 같은 타입이라면, 위 순서에서 그 사이에 있는 다른 타입들도 반드시 같은 타입이어야 합니다.

예를 들어 single-floatlong-float이 같은 타입이면, double-float도 반드시 같은 타입이어야 해요.

복합 타입 지정자 (Compound Type Specifier)

  • Kind: Abbreviating
  • 구문:
float [lower-limit [upper-limit]]
  • 인자:

    • lower-limit, upper-limitfloat 타입에 대한 구간 지정자(interval designator). 각각의 기본값은 기호 *.

float 타입 지정자는 abbreviating 종류로, lower-limitupper-limit이 기술하는 구간 위의 float들을 나타냅니다.

Notes

흥미로운 점은 모든 수학적 정수가 Common Lisp에서 real로만 표현되는 게 아니라 복소수 float로도 표현될 수 있다는 거예요. 예를 들어 수학적 수 1은 다음과 같이 여러 방식으로 표현될 수 있습니다.

  • 정수 1
  • float 1.0
  • 복소수 #C(1.0 0.0)

더 알아보기 (Learn more)