R言語の==の不可解な挙動

[code]

    > cos(pi/4)
    [1] 0.7071068
    > sin(pi/4)
    [1] 0.7071068
    > cos(pi/4)==sin(pi/4)
    [1] FALSE
    
[/code]

これは、無理数どうしで、しょうがないかなと思うのですが、

[code]

    > cos(pi/3)
    [1] 0.5
    > sin(pi/6)
    [1] 0.5
    > cos(pi/3)==sin(pi/6)
    [1] FALSE
    
[/code]

というように、有理数どうしで同じ値でも、等しくないとみなされます。どのような説明が可能でしょうか。ちなみに、

[code]

    > (sqrt(2))^2
    [1] 2
    > (sqrt(2))^2==2
    [1] FALSE
    
[/code]

というように、整数どうしで同じ値でも、等しくないとみなされる場合があります。ぜひとも、一般論を教えてください。




Rの公式のFAQに書かれている説明です。

[7.31 Why doesn't R think these numbers are
equal?](http://www.hep.by/gnu/r-patched/r-faq/R-FAQ_82.html)

> The only numbers that can be represented exactly in R's numeric type  
>  are integers and fractions whose denominator is a power of 2. Other  
>  numbers have to be rounded to (typically) 53 binary digits accuracy.  
>  As a result, two floating point numbers will not reliably be equal  
>  unless they have been computed by the same algorithm, and not always  
>  even then.

Rにおける数値型で正確に表現できる数値は、整数及び分母が2の冪である分数のみです。その他の数値は（一般的には）53桁の２進数の精度に丸められます。  
結果的に、同じアルゴリズムによって計算されない限り２つの浮動小数点数が確実に等しくなることはなく、場合によってはそれすら保証されません。

