2017-09-29 16 views
0

정수형과의 이중/부동 비교 (관계 연산자)의 정밀도는 무엇입니까?정수형과의 double/float 비교 (관계 연산자)의 정밀도는 무엇입니까?

모든 비교에서 부동 소수점을 사용하지 않는 것이 좋습니다.

int x = 90; 
    float y = 90.00_001f; 

    if (x < y) { 
     System.out.println("it works!"); // gets printed 
    } 

    // now just add one zero to lessen the precision a bit... 

    int x = 90; 
    float y = 90.000_001f; 

    if (x < y) { 
     System.out.println("it works!"); // not printed 
    } 
+1

정확도는 두 개의 'float'변수와 같이 정밀도가 높습니다. [확대 변환] (https://docs.oracle.com/javase/specs/jls/se8/html/jls- 5.html # jls-5.1.2). –

+0

https://stackoverflow.com/questions/13297207/is-it-valid-to-compare-a-double-with-an-int-in-java –

+0

https://stackoverflow.com/questions/41653576/is -it-safe-to-compare-a-float-and-int-in-java –

답변

0

IEEE 754 단 정밀도 부동 소수점의 정밀도는 6에서 9 자리까지의 유효 10 진수 (source)입니다.

double-precision의 경우 유효 자릿수는 15에서 17 사이입니다.

3

문제는 여기에 정수로 비교하지 않지만 float 자체의 정밀도 : 그러나 지금까지이 작업이 허용되는, 여기에 질문입니다.

float (또는 double) 리터럴을 지정할 때 원하는만큼 소수 자릿수를 지정할 수 있습니다. 그러나 이것은 코드가 컴파일 될 때 정밀도가 유지된다는 것을 의미하지는 않습니다.

는 예를 들어, 다음은 모두 동일한 값을 가지고

90.f 
90.000_001f 
90.000000000000000000000000000000000000000000000000000000000‌​00000001f 

Ideone demo

은 따라서 제 2 비교가 실패 이유 90.000_001f90.f 같다고이다; 이는 90에서 float으로 확대되는 가치와 같습니다.

0

다른 답변은 정확하므로 여기에서 반복하지 않겠습니다.

내가 추가하고 싶은 것은 일반적으로 연관성을 암시 동치 관계로 == 고려에 대한 또 다른 가능성 놀라운이다 :

class Main { 
    public static void main(String[] args) { 
    int i=16777217; 
    float f=16777216.0f; 
    double d=16777216.0; 
    if(i == f) { 
     System.out.println("i == f"); 
    } 
    if(d == f) { 
     System.out.println("d == f"); 
    } 
    if(i == d) { 
     System.out.println("i == d"); 
    } 
    } 
} 
:

(a == b) and (b == c) => (a == c) 

는하지만 https://repl.it 예를 들면이 조각을 시도하는 경우

놀랍게도 i==ff==d이지만 not(i==d) ...
이것은 i==f을 쓸 때 암시 적 변환 float(i)==f이 발생합니다. int는 최대 31 비트의 정밀도를 요구할 수 있기 때문에이 변환은 잠재적으로 느슨합니다. float는 최대 24 개를 제공합니다.

Lisp, Scheme 또는 최근 버전 가족 이죠 작업이 합리적이고 부동 소수점 인수를 모두 포함 할 경우 Pharo 스몰 토크는 비교를 처리 /, 당신은

추출 일반적으로 http://www.lispworks.com/documentation/lcl50/aug/aug-170.html

에서 ... 그들은 정확성에 대한 관심 것을 볼 수 있습니다, 유리수는 먼저 부동 소수점 형식으로 변환 된 다음 연산은 pe입니다. 형성. 이 변환 프로세스를 부동 소수점 감염이라고합니다. 그러나 수치 평등 비교의 경우 인수는 동등성 (또는 불평등) 관계의 전 이성을 보장하기 위해 합리적인 산술을 사용하여 비교됩니다.