2010-12-28 6 views
1

몇 가지 산술 계산을 균일하게 구현하기 위해 double을 사용합니다. 이 계산은 실제로 정수에 적용될 수도 있지만 Java에서 C++과 같은 템플릿이 없으므로 구현 코드를 복제하지 않으므로 int에 "double"버전을 사용하기 만하면됩니다.정수로 제한된 부동 소수점 연산

JVM 사양은 연산이 해당 부동 소수점 연산으로 에뮬레이트 될 때 < =, +, -, * 및/(나머지 == 0 인 경우)와 같은 정수 연산의 정확성을 보장합니까?

(모든 정수는 물론, 두 배의 가수로 표현되는 적당한 크기를 가지고)

답변

2

: 으로 IEEE 754 (기준 나머지 연산자 (§15.17의 예외를 규정 부동 소수점 숫자에

운영자 동작 . 삼)).

공식적인 IEEE 표준 문서에 액세스 할 수 없지만 부동 소수점으로 정확하게 표현할 수있는 정수 연산을 암시 적으로 보장한다는 것은 확실합니다./예상대로 두 번 작동합니다.

1

간단히 예.

double a = 3.0; 
double b = 2.0; 

System.out.println(a*b); // 6.0 
System.out.println(a+b); // 5.0 
System.out.println(a-b); // 1.0 
System.out.println(a/b); // 1.5 // if you want to get 1 here you should cast it to `integer (int)` 
System.out.println(a>=b); // true 
System.out.println(a<=b); // false 

하지만 조심하면서 곱셈 (*) 때문에 정수로 캐스팅하면서 B가 오버 플로우를 일으킬 수 *. 위한 동일한 상황 (+ 및 -)에 Java Language Specification 따르면

+1

감사합니다. 좋은 소식, 이 동작은 JVM/IEEE 사양에 의해 보장 되었습니까, 아니면 실험적 사실입니까? (println은 복식을 쓸 수도 있기 때문에 3.0은 기계어 코드에서 2.99999999999가 될 수 있습니다) – user396672

+0

JVM/IEEE 스펙에 의해 보장되며 @ Michael의 주석도 읽으십시오 –

1

사실, 나는 표준을 발견했습니다 '그리고

JVM 사양 "예"라고 : Java 가상 머신의

반올림 작업은 항상 가까운 모드로 IEEE 754 라운드를 사용합니다. 정확하지 않은 결과는 가장 가까운 표현 가능한 값으로 반올림 한 이며, 연결은 최하위 비트가 0 인 값으로 이동합니다. 이것이 IEEE 754 기본 모드입니다. 그러나 부동 소수점 유형의 값을 0으로 반올림하는 정수 유형의 값으로 변환하는 Java 가상 기계 명령어. Java 가상 머신은 부동 소수점 올림 모드를 변경할 수있는 방법을 제공하지 않습니다.

ANSI/IEEE 표준 754-1985 이진 < ---> 소수점 변환을 제외하고 제 ... 첫 무한 정밀도 정확한 중간 결과를 생성하고있는 것처럼, 각 조작이 수행되어야한다 이 중간 결과를 대상 형식에 맞게 강제 변환합니다.

ANSI/IEEE Std 754-1985 5.4. 부동 소수점 정수와 정수 형식 간의 변환은 7.1에서 지정된 예외가 발생하지 않는 한 정확해야합니다. 결과는 따라서, 정수 결과는 항상 부동 소수점 정수) 이중 형식에 맞는 (그리고 경우


요약

1) 정확한 작업은 항상 정확한 있습니다.
2) int < - double 변환은 부동 소수점 정수의 경우 항상 정확합니다.