λΆλμμμ μ κ·Ήμμκ°
μ€μ λ‘ λΆλμμμ (μ€μ) μ°μ°μ λ€λ£¨λ κ²μ μ½μ§λ§, μ»΄ν¨ν°μ λΆλμμμ μ°μ° μ²λ¦¬λ μ½μ§λ§μ μλ€. μ»΄ν¨ν°μμ κ°μ 2μ§μλ‘ λ€λ£¨κ³ , μ΄ λλ¬Έμ μ»΄ν¨ν°κ° λΆλμμμ κ°μ μ°μ°ν λ IEEE 754 λͺ μΈμ λ°λΌ μμ μ μννλ€. μ΄ κ³Όμ μ κ°μ μκ³‘μ΄ λ°μν μ μλ€. μ΄ λ¬Έμ λ CPUλ OS, JVMμ λ¬Έμ κ° μλλΌ λͺ μΈμ λ°λΌ λΆλμμμ μ μ²λ¦¬νλ λͺ¨λ μ»΄ν¨ν°μμ λ°μνλ λ¬Έμ μ΄λ€.
λ°λΌμ λΆλμμμ μ λΉκ΅μ°μ°μλ₯Ό μ¬μ©νμ¬ λΉκ΅ν λ, λΆλμμμ μ κ°μ λΉκ΅ν λ IEEE 754 λ³ν 곡μμ λ°λΌ λ°μνλ μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μλ κ·Ήμμκ°μ μ²λ¦¬ν΄μ£Όλ μ½λκ° λ°λ‘ νμνλ€. λΉκ΅μ°μ°μ ν λ, νΌμ°μ°μμ μ€μ°¨κ° μ€μ°¨λ²μλ³΄λ€ μλ€λ©΄ κ°μ κ°μΌλ‘ μ·¨κΈν΄μ£Όλ κ²μ΄ κ·Έ λ°©λ²μ΄λ€.
κ·Ήμμκ° μ²λ¦¬ λ°©λ²
@μ§μ μ€μ°¨λ²μ μ§μ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
double d1 = 987.6543;
double d2 = 1.111111;
System.out.println(d1 + d2 == 988.765411); // false
System.out.println(d1 + d2); // 988.7654110000001
// κ²°κ³Ό λ€μ κ·Ήμμμ κ°μ΄ λΆλλ€.
double x = 234.765411;
double y = 754.0;
System.out.println(x + y == 988.765411); // true
System.out.println(x + y); // 988.765411
// κ²°κ³Ό λ€μ κ·Ήμμμ κ°μ΄ λΆμ§ μμλ€.
System.out.println(d1 + d2 == x + y); // false
//-------------------------------------------
double EPSILON = 0.00001;
System.out.println(Math.abs(d1 + d2 - (x + y)) < EPSILON); //true
μμ μ½λμμ d1 + d2μλ κ·Ήμμμ κ°μ΄ λΆκ³ , x + yμλ λ€μ κ·Ήμμμ κ°μ΄ λΆμ§ μμλ€. λ°λΌμ κ°μ κ°μ΄ λμμΌ ν¨μλ λΆκ΅¬νκ³ κ·Ήμμμ κ° λλ¬Έμ λΉκ΅μ°μ°μλ₯Ό μ¬μ©νμ λ falseκ° λμ€κ² λμλ€.
μλμ λ μ€μ μ€λͺ νμλ©΄
- EPSILON κ°μ μ μΈνλ€.
- κ°κ° μ°μ°μμ κ³μ°ν κ°μ μ€μ°¨λ₯Ό ꡬνλ€.
Math.abs()
λ©μλλ₯Ό μ¬μ©νμ¬ μ€μ°¨μ μ λκ°μ ꡬνλ€.- μ΄ μ€μ°¨μ μ λκ°μ΄ EPSILONλ³΄λ€ μλ€λ©΄ λ κ²°κ³Όκ°μ κ°μ κ°μΌλ‘ μ·¨κΈνλ€.
μ λκ°μΌλ‘ λ°κΏμ£Όλ μ΄μ
=> μμμ κ²½μ° λ¬΄μ‘°κ±΄ EPSILON κ°λ³΄λ€ μλ€. λ°λΌμ μ λκ°μ μ°μ§ μλλ€λ©΄ μμμ κ²½μ° -EPSILON λ³΄λ€ μμμΌ νλ€λ 쑰건μ μ€λ³΅ν΄μ μ½λ©ν΄μΌ ν¨
@ INFINITY κ° μ¬μ©
1
2
3
4
5
6
7
8
float f1 = 0.1f;
float f2 = 0.1f;
System.out.println(f1 * f2 == 0.01f); // false
System.out.println(f1 * f2); // 0.010000001
float r = f1 * f2 - 0.01f;
System.out.println(Math.abs(r) <= Float.POSITIVE_INFINITY);
μμ μ½λμμλ μ§μ μ€μ°¨λ²μλ₯Ό μ νμ§ μκ³ μλ°μ μ μλ Float.POSITIVE_INFINITY κ°μ μ€μ°¨λ²μλ‘ μ¬μ©νμλ€.