数値解析日記

数値解析関係のネタ帳。C++,pythonなど

nextafter関数の使い方

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でも同様のミスをしている人を発見。