더북(TheBook)

036 다음 부동소수점 값

 

10 같은 정수는 10+1(양의 무한대 방향)이나 10-1(음의 무한대 방향)처럼 다음 정숫값(integer-point value)을 구하기가 아주 쉽다. floatdouble은 같은 결과를 얻기가 정수만큼 쉽지 않다.

JDK 6부터 Math 클래스에 nextAfter() 메서드가 추가됐다. 이 메서드는 처음 수(floatdouble)와 방향(Float/Double.NEGATIVE/POSITIVE_INFINITY)을 두 인자로 받아 다음 부동소수점 값을 반환한다. 여기서는 이 메서드로 음의 무한대 방향으로 0.1에 가까운 다음 부동소수점을 반환하는 예제를 살펴보겠다.

float f = 0.1f;

// 0.099999994
float nextf = Math.nextAfter(f, Float.NEGATIVE_INFINITY);

JDK 8부터는 nextAfter() 메서드를 보다 손쉽게 사용할 수 있으면서 더 빠른 두 개의 메서드가 Math 클래스에 추가됐다. 두 메서드는 nextDown()nextUp()이다.

float f = 0.1f;

float nextdownf = Math.nextDown(f); // 0.099999994
float nextupf = Math.nextUp(f);     // 0.10000001

double d = 0.1d;

double nextdownd = Math.nextDown(d); // 0.09999999999999999
double nextupd = Math.nextUp(d);     // 0.10000000000000002

즉, 음의 무한대 방향의 nextAfter()Math.nextDown()으로, 양의 무한대 방향의 nextAfter()Math.nextUp()으로 구할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.