鍋あり谷あり

テーマを決めずに適当に書いています。

二回適用すると符号が反転する関数

昨日の続き。

昨日書いたやり方だと f(f(x)) が -x にならないことがある。
数学的には正しいと思うんだが、計算誤差でうまくいかないことがある。

その点は、メンテナンス中になっているので確認できないんだが、たぶん、
http://oss.timedia.co.jp/index.fcgi/kahua-web/show/ossz/oneline/2006-04-17
で示されている解答も同じ。こちらの方が計算誤差には強いと思うんだが、やっぱり正しくないことがそれなりにある。と思う。
で。

インチキっぽい C 言語版:

double f( double x )
{
  return x==0 || ((*((long *)&x)^=8)&8)==0 ? -x : x;
}

8 じゃなくてもいいんだけど、末広がりってことで。
このやりかたなら(たぶん)全ての値(非数や無限は除いて)で f(f(x)) が -x になる。
でも、どことなくインチキっぽい。

もっとインチキっぽい ruby

def f(x)
  x.tainted? ? -x : ( x.taint; x )
end

このやりかたなら計算誤差がないことは間違いない。関数として純粋だし。
Float 型を受け取ったら、Float 型を返すってのも題意に合致している。
でもインチキだと思う。