문제

나는 MIN_NORMAL이 "보통" double에 추가할 수 있는 값이고 숫자가 변경될 것이라고 생각했습니다.예:Double.MIN_NORMAL을 0.1d에 추가하면 0.1d와 다른 값을 얻지만 내 이해가 잘못되었습니다.

public static void test(double val) {
    if (val == (val - Double.MIN_NORMAL*1e50d))
        System.out.printf("val == (val - Double.MIN_NORMAL*1e50d) for val=%.20f\n", val);
    else
        System.out.printf("val != (val - Double.MIN_NORMAL*1e50d) for val=%.20f\n", val);
}

다음을 생성합니다.

test(0.0d);
> val != (val - Double.MIN_NORMAL*1e50d) for val=0.00000000000000000000

test(1.0d);
> val == (val - Double.MIN_NORMAL*1e50d) for val=1.00000000000000000000

test(0.1d);
> val == (val - Double.MIN_NORMAL*1e50d) for val=0.10000000000000000000

누군가 여기에 내 논리에 어긋나는 것이 무엇인지 설명해주세요. MIN_NORMAL에 1e50d를 더해도 여전히 같은 숫자를 얻게 됩니다.

이진 표현을 확인했는데 1 * Double.MIN_NORMAL은 2 * Double.MIN_NORMAL과 다르지만 0이 아닌 다른 것에서 이를 빼도 원래 숫자는 변경되지 않습니다.

도움이 되었습니까?

해결책

MIN_NORMAL Javadoc에서 말한 것처럼 정규화된 가장 작은 것입니다. double 값.하지만 그렇다고 해서 다음과 같은 의미는 아닙니다. 1 ~을 위한 int에스:부동 소수점 값의 경우 다음과 같습니다. 아니요 표준 "eps"를 추가하여 다음 표현 가능한 값으로 변경할 수 있습니다. "eps"는 항상 주어진 부동 소수점 값의 지수에 따라 달라집니다.그래서 그들은 이렇게 불린다. 떠 있는 포인트는 결국 :)

그러나 Java 1.6+는 다음을 제공합니다. Math.nextAfter() 이는 어떤 주어진 경우에도 반환됩니다. double, 다음 또는 이전 표현 가능 double.

이전 Java 버전에서는 언제든지 다음을 사용할 수 있습니다. Double.doubleToLongBits(), 결과를 증가 또는 감소시키고 다시 변환합니다. Double.longBitsToDouble();이렇게 하면 다음 또는 이전 대표자가 될 수 있습니다. double 값 -- 대부분의 경우에:몇 가지 특별한 경우(NaN, 무한 값)가 있으므로 부동 소수점 초보자에게는 권장되지 않습니다. :)

다른 팁

이중에는 제한된 정밀도가 있습니다.min_normal은 2E-1022입니다.숫자가 2E-1000의 볼펜에도 있지 않으면 삭제 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top