문제

이것은 의견과 관련이 있습니다 이 질문:

Java 의이 코드는 12.100000000000001을 생산하며 64 비트 복식을 사용하여 정확히 12.1을 나타낼 수 있습니다. - pyrolistical

이것이 사실입니까? 나는 부동 소수점 번호가 두 개의 힘의 합으로 표시되므로 비트 수에 상관없이 정확히 12.1을 정확하게 표현할 수 없다고 생각했습니다. 그러나 알고리즘을 모두 구현하고 많은 숫자로 (12.1, 3)으로 호출 한 결과를 인쇄했을 때 각각 그의와 광산에 대해 얻을 수 있습니다.

12.10000000000000000000000000000000000000000000000000000000000000000000000000 12.10000000000000100000000000000000000000000000000000000000000000000000000000

나는 이것을 사용하여 인쇄했다 String.format("%76f"). 나는 그것이 필요한 것보다 더 높이라는 것을 알고 있지만 12.1에서 반올림이 보이지 않습니다.

도움이 되었습니까?

해결책

아닙니다. 다른 사람들이 그의 의견에 따르면, 다른 사람들은 두 사람의 유한 한 수의 힘이 정확히 12.1에 추가 될 수 없습니다. 소수점 이후 몇 자리 숫자를 사용하더라도베이스 10에서 정확히 1/3을 정확하게 나타낼 수없는 것처럼.

다른 팁

이진에서 12.1은 다음과 같습니다.

1100.000110011001100110011...

이것은 종료되지 않기 때문에 이중의 53 개의 중요도와 다른 유한 폭 바이너리 플로팅 포인트 유형에서 정확하게 표현할 수 없습니다.

이진에서 0.1을 표현하십시오.
0.5가 너무 큽니다
0.25가 너무 큽니다
0.125가 너무 큽니다
0.0625가 맞고 나머지 0.0375를 남깁니다
0.03125는 적합하며 나머지 0.00625를 남깁니다
0.015625가 너무 큽니다
0.0078125가 너무 큽니다
0.00390625는 적합하며 나머지 0.00234375를 남깁니다
0.001953125는 적합하며 나머지 0.000390625를 남깁니다

0.00011001100의 기본 2 값을 만들어 내고 계속 반복 할 것입니다.

아니요, 두 배로 정확하게 표현할 수 없습니다. Java가 BCD 또는 고정점 소수점을 지원하는 경우 정확하게 작동합니다.

바이너리에 있지 않습니다. 내가 환상적이 될 수 있다면, 당신은 "플로팅 포인트 바이너리 코드 소수점"(내가 아는 한, 절대로 구현 된 적이 없음)에서 다음과 같이 할 수 있습니다.

12.1 = 0000 . 0001 0010 0001 * (10^2)

이진에서는 0이 아닌 모든 값이 형식입니다 1.xyz * m, IEEE 양식은 이것을 활용하여 선두를 생략합니다. 0.xyz * m 대신에.

나는 독서를 제안한다 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것. 그러면 확실히 알게 될 것입니다. :)

이중이 무엇인지 확인하는 방법은 상당히 정확하게 그것을 Bigdecimal으로 변환하는 것입니다.

// prints 12.0999999999999996447286321199499070644378662109375
System.out.println(new BigDecimal(12.1));

예, 부동 소수점에서 정확히 12.1을 나타낼 수 있습니다. 당신은 단지 이진이 아니라 소수점 부동 소수점 표현이 필요합니다.

BigDecimal 유형을 사용하면 정확히 표현할 수 있습니다!

아니요, 소수점 번호 12.1 유한 한 (종료) 이진 부동 소수점 번호로 표시 될 수 없습니다.

기억 12.1 합리적 번호입니다 121/10. 이 비율은 가장 낮은 항일입니다 (분자의 공통 지방을 분모를 제거함으로써 줄일 수 없음).

(모순에 도달하기 위해) 121/10 또한 쓸 수 있습니다 n / (2**k) 어디 n 그리고 k 긍정적 인 정수입니다 2**k denotes the k두 권의 힘. 우리는 반례를 가질 것입니다 고유 한 인수화. 특히

10 * n == 2**k * 121

왼쪽이 오른쪽이 아닌 5로 나눌 수있는 곳.

사용할 수있는 옵션 중 하나는 v = 0.1을 저장하지 않고 대신 v10 = 1을 저장하는 것입니다. 필요할 때 10으로 나뉘 웁니다 (부서는 결과에서 잘린 오류가 발생하지만 V는 여전히 괜찮습니다).

이 경우 기본적으로 고정 포인트 해킹을 수행하지만 숫자를 플로트로 유지합니다. 그러나 당신이 정말로해야한다면 일반적으로 그렇게 할 가치가 없습니다.

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