Haskell
wat

[Double] をソートする時の注意点

More than 1 year has passed since last update.


NaNが含まれると思ったとおりにソートされない

> import Data.List

> let nan = 0/0 :: Double -- NaN
> sort [3,2,nan,1,5,nan,4]
[1.0,4.0,NaN,5.0,NaN,2.0,3.0]

ナンと恐ろしい…

> nan < nan

False
> nan == nan
False
> nan > nan
False
> compare nan nan
GT
> nan < 0
False
> nan == 0
False
> nan > 0
False
> compare nan 0
GT

ナンと恐ろしい…

NaNが含まれると思われるリストをソートするときは

isNaN :: RealFloat a => a -> Bool

を使ってNaNを取り除くか、適切に処理した後にソートするようにしたほうが良さそうです。

> sort . filter (not . isNaN) $ [3,2,nan,1,5,nan,4]

[1.0,2.0,3.0,4.0,5.0]

> sort . map (\x -> if isNaN x then -1 else x) $ [3,2,nan,1,5,nan,4]
[-1.0,-1.0,1.0,2.0,3.0,4.0,5.0]