νμ x
, y
λ κ°μ λΆλ μμμ μ«μν©λλ€. νκ· μ κ³μ°νλ μ¬λ°λ₯Έ λ°©λ²μ 무μμ
λκΉ?
μμ§ λ°©λ²μ (x+y)/2
μ€λ² νλ‘μ°κ° λ°μν λ μ x
μ y
λ무 ν½λλ€. λ΄ μκ° μ 0.5 * x + 0.5 * y
μλ§λ λ λμ,νμ§λ§ (μλ§λ λΉν¨μ¨μ μΈ)μ΄ κ³±μ
μ ν¬ν¨, κ·Έκ²μ μΆ©λΆν μ’μ κ²½μ°μ λλ νμ€νμ§ μλ€. λ μ’μ λ°©λ²μ΄ μμ΅λκΉ?
λ΄κ° λκ³ μλ λ λ€λ₯Έ μμ΄λμ΄λ (y/2)(1 + x/y)
if x<=y
μ
λλ€. κ·Έλ¬λ λ€μ, λλ μ΄κ²μ λΆμνλ λ°©λ²μ λͺ¨λ₯΄κ² κ³ κ·Έκ²μ΄ λ΄ μꡬ μ¬νμ μΆ©μ‘±νλ€λ κ²μ μ¦λͺ
ν©λλ€.
λν κ³μ° λ νκ· μ΄ >= min(x,y)
λ° μΌ κ²μ΄λΌλ 보μ₯μ΄ νμν©λλ€ <= max(x,y)
. Don Hatchμ λ΅λ³ μμ μ§μ νλ―μ΄μ΄ μ§λ¬Έμ μ κΈ°νλ λ μ’μ λ°©λ²μ μλ§λ κ°μ₯ μ νν κ²°κ³Όλ₯Ό μ 곡νλ λ μ«μμ νκ· κ΅¬νμ 무μμ
λκΉ? κ²½μ° μ¦, x
λ° y
λΆλ μμμ μ«μλ μ΄λ»κ² λΆλ μμμ μ«μμ κ°μ₯ κ°κΉμ΄μ κ³μ°νλ (x+y)/2
? μ΄ κ²½μ° κ³μ° νκ· μ μλ >= min(x,y)
μ΄λ©° <= max(x,y)
μ
λλ€. μμΈν λ΄μ©μ Don Hatchμ λ΅λ³ μ μ°Έμ‘°νμμμ€.
μ°Έκ³ : μ°μ μμλ κ°λ ₯ν μ νμ±μ λλ€. ν¨μ¨μ±μ΄ μλͺ¨λ©λλ€. κ·Έλ¬λ κ°λ ₯νκ³ μ νν μκ³ λ¦¬μ¦μ΄ λ§μ κ²½μ° κ°μ₯ ν¨μ¨μ μΈ μκ³ λ¦¬μ¦μ μ νν©λλ€.
λ΅λ³
Highamμ μμΉ μκ³ λ¦¬μ¦ μ μ νμ±κ³Ό μμ μ±μ μ΄λ¬ν μ νμ λ¬Έμ λ₯Ό λΆμ ν μμλ λ°©λ²μ λ€λ£¨κ³ μλ€κ³ μκ° ν©λλ€. 2 μ₯, νΉν μ΄λ 2.8μ μ°Έμ‘°νμμμ€.
μ΄ λ΅λ³μμ λλ Highamμ μ± μμ μ€μ λ‘ λ€λ£¨μ§ μμ κ²μ μ§μ νκ³ μΆμ΅λλ€ (κ·Έ λ¬Έμ μ λν΄μλ λ리 μλ €μ§μ§ μμ κ²μΌλ‘ 보μ λλ€). μ΄μ κ°μ κ°λ¨ν μμΉ μκ³ λ¦¬μ¦μ μμ±μ μ¦λͺ νλ €λ κ²½μ° Haskellμ sbv μ κ°μ ν¨ν€μ§λ₯Ό μ¬μ©νμ¬ z3 κ³Ό κ°μ μ΅μ SMT μλ² ( λ§μ‘±λ λͺ¨λλ‘ μ΄λ‘ ) μ κΈ°λ₯μ μ¬μ©ν μ μμ΅λλ€ . μ΄κ²μ μ°νκ³Ό μ’ μ΄λ₯Ό μ¬μ©νλ κ²λ³΄λ€ λ€μ μ½μ΅λλ€.
μ£Όμ΄μ‘κ³ z = ( x + y ) / 2 κ° x β€ z β€ yλ₯Ό λ§μ‘± νλμ§ μκ³ μΆμ΅λλ€ . λ€μ νμ€μΌ μ½λ
0β€xβ€yz=(x+y)/2
xβ€zβ€y
import Data.SBV
test1 :: (SFloat -> SFloat -> SFloat) -> Symbolic SBool
test1 fun =
do [x, y] <- sFloats ["x", "y"]
constrain $ bnot (isInfiniteFP x) &&& bnot (isInfiniteFP y)
constrain $ 0 .<= x &&& x .<= y
let z = fun x y
return $ x .<= z &&& z .<= y
test2 :: (SFloat -> SFloat -> SFloat) -> Symbolic SBool
test2 fun =
do [x, y] <- sFloats ["x", "y"]
constrain $ bnot (isInfiniteFP x) &&& bnot (isInfiniteFP y)
constrain $ x .<= y
let z = fun x y
return $ x .<= z &&& z .<= y
μ΄ μμ
μ μλμΌλ‘ μννκ² μ΅λλ€ . λ€μ test1 fun
μ IS λͺ
μ λ κ·Έ λͺ¨λ μ ν μλ X , Y μ 0 β€ X β€ Y .
x,y
0β€xβ€y
Ξ»> prove $ test1 (\x y -> (x + y) / 2)
Falsifiable. Counter-example:
x = 2.3089316e36 :: Float
y = 3.379786e38 :: Float
λμΉλ€. μ΄μ λ€λ₯Έ 곡μμ μ·¨νλ€κ³ κ°μ ν΄λ³΄μμμ€
z=x/2+y/2Ξ»> prove $ test1 (\x y -> x/2 + y/2)
Falsifiable. Counter-example:
x = 2.3509886e-38 :: Float
y = 2.3509886e-38 :: Float
μ μ§μ μΈλ νλ‘λ‘ μΈν΄ μλνμ§ μμ΅λλ€ ( λͺ¨λ μ°μ μ΄ κΈ°λ³Έ 2 μ΄λ―λ‘ μ§κ΄μ μ΄μ§ μμ μ μμ).
(x/2)Γ2β xμ΄μ :
z=x+(yβx)/2Ξ»> prove $ test1 (\x y -> x + (y-x)/2)
Q.E.D.
곡μ₯! λ Q.E.D.
Aλ μ¦κ±° κ²μ test1
μμμ μ μ λ μμ±μ λͺ¨λ μλ λ₯Ό μν΄ λ³΄μ νκ³ μμ΅λλ€.
λμΌνμ§λ§ ( 0 β€ x β€ y λμ )λ‘ μ νλλ κ²μ μ΄λ»μ΅λκΉ?
xβ€y0β€xβ€y
Ξ»> prove $ test2 (\x y -> x + (y-x)/2)
Falsifiable. Counter-example:
x = -3.1300826e34 :: Float
y = 3.402721e38 :: Float
μ, λμΉλ©΄ z = x + ( y / 2 β x / 2 )λ μ΄λ»μ΅λκΉ?
yβxz=x+(y/2βx/2)
Ξ»> prove $ test2 (\x y -> x + (y/2 - x/2))
Q.E.D.
κ·Έλμ λ΄κ° μ¬κΈ°μμ μλν μμ μ€ κ° μλνλ κ²μ²λΌ 보μ λλ€ (μ¦κ±°μ ν¨κ»). SMT μλ² μ κ·Όλ²μ μ°νκ³Ό μ’ μ΄λ‘ λΆλ μμμ μ€λ₯ λΆμμ μννλ κ²λ³΄λ€ κ°λ¨ν λΆλ μμμ μμμ λν μμ¬μ ν¨μ¬ λΉ λ₯Έ λ°©λ²μΌλ‘ 보μ λλ€.
x+(y/2βx/2)λ§μ§λ§μΌλ‘ μ νμ±κ³Ό μμ μ±μ λͺ©νλ μ’ μ’ μ±λ₯μ λͺ©νμ μμΆ©λ©λλ€. μ±λ₯μ μν΄, λλ μ»΄νμΌλ¬κ° λ³΄λ€ λμ λ°©λ²μ μ€μ λ‘ λ³΄μ§ λͺ»ν©λλ€ . νΉν μ»΄νμΌλ¬λ μ΄κ²μ κΈ°κ³ λͺ λ Ήμ΄λ‘ λ²μνλ λ° λ§μ λ Έλ ₯μ κΈ°μΈμ΄κ³ μκΈ° λλ¬Έμ λλ€.
(x+y)/2PS μ΄κ²μ λͺ¨λ λ¨ μ λ°λ IEEE754 λΆλ μμμ μ°μ μ λλ€. λλ κ²μ¬ λ°°μ λ°λ μ°μ° (κ΅μ²΄μλ₯Ό ν¨κ» ), κ·Έκ²λ μλν©λλ€.
xβ€x+(y/2βx/2)β€ySFloat
SDouble
-ffast-math
PPPS 쑰건λΆμμ΄ κ°λ¨ν λμμ νν λ§ μ΄ν΄ 보μμ΅λλ€ . λ ν΄μΉ μ 곡μ μ μμ²λκ² μ’μ΅λλ€.
λ΅λ³
첫째, λͺ¨λ κ²½μ°μ κ°μ₯ μ νν λ΅λ³μ μ 곡νλ λ°©λ²μ΄ μλ€λ©΄ νμν 쑰건μ λ§μ‘±μν¬ κ²μ
λλ€. (μ£Ό λ΄κ° λ§ν κ²μ 보λ€λ κ°μ₯ μ νν λ΅ κ°μ₯ μ νν λλ΅μ, μ΄νμ΄ μΉμκ°μμ μ μμ΅λλ€.) μ¦λͺ
: λ§μ½μ΄, λ°λλ‘, λΉμ μ μλ μ νν κ²κ³Ό κ°μ΄ κ°λ₯ν λλ΅μ΄ μλ€ , κ·Έ μꡬ 쑰건μ λ§μ‘±μ μ΄λ μλ¨ (μΌμ΄μ€κ°λλ λλ λ μμ λͺ¨μμ΄λ€) (μΌμ΄μ€κ°μλ λ μμ λͺ¨μμ΄λ€).answer<min(x,y)<=max(x,y)
min(x,y)
min(x,y)<=max(x,y)<answer
max(x,y)
λ°λΌμ κ·νμ μ§λ¬Έμ΄ κ°μ₯ μ νν λ΅λ³μ μ°Ύλ κ²μΌλ‘ μμ½λ©λλ€. IEEE754 μ°μ μ 체λ₯Ό κ°μ νλ©΄ λ€μμ μ μν©λλ€.
if max(abs(x),abs(y)) >= 1.:
return x/2. + y/2.
else:
return (x+y)/2.
μ΄κ²μ΄ κ°μ₯ μ νν λ΅λ³μ μ 곡νλ€λ μ£Όμ₯μ λ€μ μ§λ£¨ν μ¬λ‘ λΆμμ λλ€. κ°λ€ :
-
μ¬λ‘
max(abs(x),abs(y)) >= 1.
:- νμ μΌμ΄μ€ xμ yλ λΉμ κ· νλμ§ μμ΅λλ€.μ΄ κ²½μ° κ³μ° λ λ΅λ³
x/2.+y/2.
μ λμΌν κ°μλ₯Ό μ‘°μνλ―λ‘(x+y)/2
μ€λ²νλ‘λ₯Ό λ°©μ§νκΈ° μν΄ νμ₯ λ μ§μλ₯Ό κ°μ νλ©΄ μ°μΆλ κ³Ό μ νν λμΌν λ΅λ³μ μ 곡ν©λλ€ . μ΄ λ΅λ³μ λ°μ¬λ¦Ό λͺ¨λμ λ°λΌ λ€λ₯Ό μ μμ§λ§ μ΄λ€ κ²½μ°μ΄λ IEEE754λ μ΅μμ λ΅λ³μμx+y
보μ₯ ν©λλ€ (κ³μ° λ κ° μ΄ μν x + yμ κ°μ₯ κ°κΉμ΄ κ·Όμ¬κ°μ 보μ₯ νλ€λ μ¬μ€μμ 2λ‘ λλ κ°μ μ νν©λλ€) μΌμ΄μ€). -
νμ μ¬λ‘ xλ λΉμ κ· νλμμ΅λλ€
abs(y)>=1
.answer = x/2. + y/2.
= y/2. since abs(x/2.) is so tiny compared to abs(y/2.)
= the exact mathematical value of y/2
= a best possible answer. -
νμ μ¬λ‘ yλ λΉμ κ· νλμ΄
abs(x)>=1
μμ΅λλ€.
- νμ μΌμ΄μ€ xμ yλ λΉμ κ· νλμ§ μμ΅λλ€.μ΄ κ²½μ° κ³μ° λ λ΅λ³
- μ¬λ‘
max(abs(x),abs(y)) < 1.
:- κ³μ° λ νμ μ¬λ‘λ
x+y
λΉμ κ· ν λλ λΉμ κ· ν λ° βμ§μβμ λλ€. κ³μ°x+y
μ΄ μ ν νμ§λ μμ§λ§ IEEE754μμλ μν x + yμ λν κ°λ₯ν κ·Όμ¬κ°μ 보μ₯ν©λλ€. μ΄ κ²½μ° μμμ 2λ‘ λλ μ΄νμ(x+y)/2.
μ νν λλκΈ° μ΄λ―λ‘ κ³μ° λ λ΅(x+y)/2.
μ μν (x + y) / 2μ λν κ°μ₯ κ·Όμ¬μΉμ λλ€. - κ³μ° λ νμ μ¬λ‘
x+y
λ λΉμ κ· νλκ³ βνμβμ λλ€.μ΄ κ²½μ° μ νν x, y μ€ νλλ λΉμ κ· ν λ° βνμβμ¬μΌν©λλ€. μ¦, x, y μ€ λ€λ₯Έ νλλ λ°λ λΆνΈλ‘ λΉμ κ· νλμ΄ κ³μ°x+y
λ©λλ€. μ ννκ² μν x + yμ΄λ―λ‘(x+y)/2.
IEEE754λ μν (x + y) / 2μ λν κ°λ₯ν κ·Όμ¬κ°μ κ³μ°ν©λλ€.
- κ³μ° λ νμ μ¬λ‘λ
λ΅λ³
binary64
(μ΄μ€ μ λ°λ) κ³μ°μΌλ‘ μμ λ IEEE-754 μ΄μ§ λΆλ μμμ νμμ κ²½μ° S. Boldoλ μλμ νμλ κ°λ¨ν μκ³ λ¦¬μ¦μ΄ μ¬λ¦Ό λ νκ· μ μ 곡ν¨μ 곡μμ μΌλ‘ μ¦λͺ
νμ΅λλ€.
Sylvie Boldo, βλΆλ μμμ νκ· μ κ³μ°νλ νλ‘κ·Έλ¨μ 곡μ κ²μ¦.β μμ 곡μ μμ§λμ΄λ§ λ°©λ²μ κ΄ν κ΅μ νμ , PP. 17-32. Cham, Springer, 2015. ( μ¨λΌμΈ μ΄μ )
(x+y)/2
x/2+y/2
binary64
C
νΉμ μ¬μ© μ¬λ‘μ κ°μ₯ μ ν©ν μ±λ₯μ μ 곡ν©λλ€.
λ€μκ³Ό κ°μ μμ ISO-C99
μ½λκ° μμ±λ©λλ€.
double average (double x, double y)
{
const double C = 1; /* 0x1p-967 <= C <= 0x1p970 */
return (C <= fabs (x)) ? (x / 2 + y / 2) : ((x + y) / 2);
}
μ΅κ·Ό νμ μμ μμ S. Boldoμ 곡λ μ μλ FMA (fused multiply-add) μ°μ°κ³Ό μ μλ €μ§ μ λ°λλ₯Ό μ¬μ©νμ¬ IEEE-754 10 μ§μ λΆλ μμμ νμμ λν΄ μ΅μμ κ²°κ³Όλ₯Ό μ»λ λ°©λ²μ 보μ¬μ£Όμμ΅λλ€. λ°°κ° λΉλ© λΈλ‘ (TwoSum) :
Sylvie Boldo, Florian Faissole λ° Vincent Tourneur, βμ νν 10 μ§μ λΆλ μμμ μμ νκ· μ κ³μ°νλ 곡μμ μΌλ‘ μ μ¦ λ μκ³ λ¦¬μ¦β μμ μ»΄ν¨ν° μ°μ (ARITH 25)μ 25 IEEE μ¬ν¬μ§μ 6 μ 2018 PP. 69-75. ( μ΄μ μ¨λΌμΈ )
λ΅λ³
κ·Έκ²μ λ§€μ° ν¨μ¨μ μΈ μ±λ₯ νλͺ
νμ μμ£Ό κ°λ¨ν λ°©λ²μ΄λμ§ μμ μ μμ§λ§ (1) μ«μμ νμΈ κ²λ μ΄μ μλμ§ νμΈνκ±°λ x
λλ y
(NO μ€λ² νλ‘μ°)κ³Ό (2) λ‘ βμ ννβλΆλ μμμ μ μ μ§ λΊμ
μ΄ μ¬μ© λλλΌλ κ°λ₯ν μΆκ° (λ° (3)) κ°μ μμλ‘ μ μ₯λμ§ μμ΅λλ€.
float difference = max(x, y) - min(x, y);
return min(x, y) + (difference / 2.0);
λΉμ μ΄ κ²½μ°μ μ€μ λ‘, μ λ§ μ νμ±μ μν΄ κ°κ³ μΆμ΄, λΉμ λ κ·Έ μ리μμ λΆν μ μν ν νμκ° μμ΅λλ€; λ¨μ§μ κ°μ λ°ν min(x, y)
νκ³ difference
λ
Όλ¦¬μ μΌλ‘ λ¨μν μ΄μ μ‘°μ ν μ μμ΅λλ€.
λ΅λ³
λ λμ μ λ°λλ‘ λ³ννκ³ κ±°κΈ°μ κ°μ μΆκ° ν ν λ€μ λ³ννμμμ€.
λ λμ μ λ°λμλ μ€λ²νλ‘κ° μμ΄μΌνλ©° λ λ€ μ ν¨ν λΆλ μμμ λ²μμ μμΌλ©΄ κ³μ° λ μ«μλ λ΄λΆμ μμ΄μΌν©λλ€.
κ·Έλ¦¬κ³ κ·Έκ²λ€μ΄ μ ννμ§ μμΌλ©΄ μ΅μ μ κ²½μ° ν° μ«μμ μ λ°μ ν΄λΉν©λλ€.
λ΅λ³
μ΄λ‘ μ μΌλ‘ x/2
κ°μμμ 1μ λΉΌμ κ³μ°ν μ μμ΅λλ€.
κ·Έλ¬λ μ€μ λ‘ μ΄μ κ°μ λΉνΈ μ°μ°μ ꡬννλ κ²μ΄ λ°λμ κ°λ¨ν κ²μ μλλλ€. νΉν λΆλ μμμ μ«μμ νμμ λͺ¨λ₯΄λ κ²½μ° νΉν κ·Έλ μ΅λλ€.
μ΄ μμ μ μν ν μ μμΌλ©΄ μ 체 μμ μ΄ 3 λνκΈ° / λΉΌκΈ°λ‘ κ°μλμ΄ ν¬κ² κ°μ λ κ²μ λλ€.
λ΅λ³
@Roland Heathμ κ°μ μ€μ μκ°νκ³ μμμ§λ§ μμ§ μΈκΈ ν μλ μμ΅λλ€.
x/2
μ§μ μμ 1μ λΉΌμ κ³μ°ν μ μμ΅λλ€ (κ°μκ° μλλΌ κ°μμμ 1μ λΉΌλ©΄ 2^(value_of_exponent-length_of_mantissa)
μ 체 κ°μμ λΉΌκΈ° ).
μΌλ°μ μΈ κ²½μ°λ₯Ό μ ννμ§ μκ³ λ₯Ό κ°μ ν΄ λ΄
μλ€ x < y
. (κ²½μ° x > y
, λ³μ λ μ΄λΈμ μ¬.νλ©΄ x = y
, (x+y) / 2
κ°λ¨νλ€.)
- λ³ν
(x+y) / 2
μΌλ‘x/2 + y/2
, (μ§μμμ νλ) κ°μ μ μ λΊμ μ μν΄ μν λ μμλ- κ·Έλ¬λ ννμ λ°λΌ μ§μμ ννμ΄ μμ΅λλ€. 1μ λΉΌκΈ° μ μ μ§μκ° μ΄λ―Έ μ΅μ μΈ κ²½μ°μ΄ λ°©λ²μ νΉλ³ν κ²½μ° μ²λ¦¬κ° νμν©λλ€. μ΅μ μ§μ λ ννν
x
μμλ κ²x/2
λ³΄λ€ μκ² λ§λ€ κ²μ λλ€ (μ λν°κ° μμ μ μ ν 1λ‘ νμλλ€κ³ κ°μ ). - λμ μ§μμμ 1μ κ°μ°
x
, μ¬ννΈx
(μλ κ²½μ°, μκΈ° μμ μ μ λ 1μ μΆκ°)μ μμ°¨μ μΌλ‘ μ°μΈ‘μΌλ‘μ κ°μ. - μ΅μκ°μ΄ μλ κ²½μ° yμ μ§μμμ 1μ λΊλλ€. μ΅μκ° (yλ κ°μλ‘ μΈν΄ xλ³΄λ€ νΌ) μΈ κ²½μ°, κ°μλ₯Ό μ€λ₯Έμͺ½μΌλ‘ νλμ© μ΄λν©λλ€ (μλ κ²½μ° μμ μ μ ν 1 μΆκ°).
x
μ μ§μμ λ°λΌ μ κ°μλ₯Ό μ€λ₯Έμͺ½μΌλ‘ μ΄λν©λλ€y
.- κ°μκ°
x
μμ ν μ΄λ λμ§ μμ κ²½μ° κ°μμ μ μλ₯Ό λν©λλ€ . λ μ§μκ° λͺ¨λ μ΅μ μΈ κ²½μ° μ ννλ μ€λ²νλ‘κ° λ°μν©λλ€. μ€λ²νλ‘λ μμ μ μ ν 리λκ°λκΈ° λλ¬Έμ λλ€.
- κ·Έλ¬λ ννμ λ°λΌ μ§μμ ννμ΄ μμ΅λλ€. 1μ λΉΌκΈ° μ μ μ§μκ° μ΄λ―Έ μ΅μ μΈ κ²½μ°μ΄ λ°©λ²μ νΉλ³ν κ²½μ° μ²λ¦¬κ° νμν©λλ€. μ΅μ μ§μ λ ννν
- νλμ λΆλ μμμ μΆκ°.
- νΉλ³ν κ²½μ°λ μκ°ν μ μμ΅λλ€. λ°μ¬λ¦Όμ μ μΈνκ³ λ μμμ μ€λͺ ν μ΄λμλ μ μ©λ©λλ€.