
[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]

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


CC BY-SA 3.0
2015-02-19T11:51:27.033
6778
2015-02-19T12:22:18.980
2015-02-19T12:09:01.193
5750
8408
question
r
R言語の==の不可解な挙動


`R`の数値は浮動小数点ですので、一般的なプログラミング言語での浮動小数点の比較と同じ注意が必要です。

[code]

    > sin(pi/6) - 0.5
    [1] -5.551115e-17
    > cos(pi/3) - 0.5
    [1] 1.110223e-16
    
[/code]

のように、実際には異なる数値ですので、等値比較はFALSEになります。

よくある方法としてはあらかじめ許容誤差を決めておき、それを含めて判定するということをやります。

[code]

    > epsilon <- 1e-10
    > abs(sin(pi/6) - cos(pi/3)) <= epsilon
    [1] TRUE
    
[/code]

以下の質問投稿で、こうした誤差を考慮した比較用関数を自前で用意するという案もでていました。

cf. [floating point - Numeric comparison difficulty in R - Stack
Overflow](https://stackoverflow.com/questions/2769510/numeric-comparison-
difficulty-in-r)


CC BY-SA 3.0
2015-02-19T12:05:07.167
6780
2015-02-19T12:05:07.167
2017-05-23T12:38:56.083
-1
3313
6778
answer


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桁の２進数の精度に丸められます。  
結果的に、同じアルゴリズムによって計算されない限り２つの浮動小数点数が確実に等しくなることはなく、場合によってはそれすら保証されません。


CC BY-SA 3.0
2015-02-19T12:16:34.180
6781
2015-02-19T12:22:18.980
2015-02-19T12:22:18.980
3639
3639
6778
answer