`ABS` — 절댓값 함수

ABS — 절댓값 함수

어떤 숫자의 크기만 필요하고 부호는 신경 쓰고 싶지 않을 때가 있어요. 그때 쓰는 함수가 abs예요. 겉보기엔 단순하지만 복소수까지 처리할 때는 타입이 어떻게 나오는지를 알아둬야 헷갈리지 않아요.

출처: Common Lisp HyperSpec — Function ABS

본문

시그니처

abs number => absolute-value

인자와 반환값

  • number — 숫자.
  • absolute-value — 음이 아닌 실수(non-negative real).

설명

absnumber의 절댓값을 반환해요.

  • number실수(real) 면, 결과는 number같은 타입이에요.
  • number복소수(complex) 면, 결과는 number같은 크기(magnitude) 를 가진 양의 실수예요. 이때 number의 성분이 유리수(rational)라서 정확한 유리수 결과가 가능한 경우에도 결과가 부동소수점(float) 이 될 수 있어요. 그래서 (abs #c(3 4))의 결과는 구현에 따라 5일 수도 5.0일 수도 있어요.

예제

(abs 0)                => 0
(abs 12/13)            => 12/13
(abs -1.09)            => 1.09
(abs #c(5.0 -5.0))     => 7.071068
(abs #c(5 5))          => 7.071068
(abs #c(3/5 4/5))      => 1 or approximately 1.0
(eql (abs -0.0) -0.0)  => true

복소수 예제를 보면 결과가 항상 실수로 나오는 걸 확인할 수 있어요.

예외 상황

없음.

주의

number가 복소수면 결과는 다음 식과 동등해요.

(sqrt (+ (expt (realpart number) 2) (expt (imagpart number) 2)))

다만 구현은 모든 복소수에 이 공식을 그대로 쓰지 말고, 아주 크거나 아주 작은 성분의 경우 중간 연산에서 오버플로나 언더플로가 나지 않도록 특별히 처리해야 해요.

함께 보기

  • Section 12.1.3.3 (Rule of Float Substitutability)