nextafter関数の使い方
import numpy as np
numpyのnextafter関数を使っていたらこんな事態に遭遇した。
nextafter(x1, x2[, out])
Return the next floating-point value after x1 towards x2, element-wise.
np.nextafter(2, 1)
1.9999999999999998
え? x2に+の値入れたのに、下方向に行った!? 慌てて、リファレンスを見なおしてみると、
after x1 towards x2,
となっている。このtoward x2がポイントで、「x2の方向に向かって」とある。
これは、「x1からx2への方向」なので、上の例だと「2から1の方向」なので、マイナス方向になる。
よって、正しく2の隣の浮動小数点数を見つけたかったら
np.nextafter(2, 2+1)
2.0000000000000004
としなければならない。これを一般化して、succ関数とすると以下のようになる。
def succ(x): return np.nextafter(x, x+1)
追記: 上記の例は大きなxに対しては機能しない場合がある。後にnextafterを使った完璧なsuccを公開する予定です。
succ(2)
2.0000000000000004
となる。
ちなみにStackOverFlowでも同様のミスをしている人を発見。