
I started preparing patches for #7858. My abs patch works well, my signum patch not at all. The gist of the bug is that abs and signum return erroneous values for for the input -0.0. abs (-0.0 :: Float) should return 0.0, not -0.0. My patch fixes this. For signum the situation is reverse. My patch does *not* fix this. It does not work using GHC nor GHCi (GHCi -ddump-simpl demonstrated below). The code for my signum is correct, as may be demonstrated by putting signumFix x | x == 0.0 = x | isNaN x = x | x > 0.0 = 1 | otherwise = negate 1 in a file signumfix.hs and :l signumfix.hs into GHCi. signumFix (-0.0 :: Float) should now return -0.0, where signum returns 0.0 with the same argument. Following this email come the patches. Please review the second patch. If you can spot what I am doing wrong, I would be grateful. Prelude> abs (-0.0 :: Float) ==================== Simplified expression ==================== let { it_aqt :: GHC.Types.Float [LclId, Str=DmdType, Unf=Unf{Src=<vanilla>, TopLvl=False, Arity=0, Value=False, ConLike=False, WorkFree=False, Expandable=False, Guidance=IF_ARGS [] 70 0}] it_aqt = GHC.Num.abs @ GHC.Types.Float GHC.Float.$fNumFloat (GHC.Num.negate @ GHC.Types.Float GHC.Float.$fNumFloat (GHC.Types.F# (__float 0.0))) } in GHC.Base.thenIO @ () @ [()] (System.IO.print @ GHC.Types.Float GHC.Float.$fShowFloat it_aqt) (GHC.Base.returnIO @ [()] (GHC.Types.: @ () (it_aqt `cast` (UnivCo representational GHC.Types.Float () :: GHC.Types.Float ~# ())) (GHC.Types.[] @ ()))) 0.0 Prelude> signum (-0.0 :: Float) ==================== Simplified expression ==================== let { it_aKQ :: GHC.Types.Float [LclId, Str=DmdType, Unf=Unf{Src=<vanilla>, TopLvl=False, Arity=0, Value=False, ConLike=False, WorkFree=False, Expandable=False, Guidance=IF_ARGS [] 70 0}] it_aKQ = GHC.Num.signum @ GHC.Types.Float GHC.Float.$fNumFloat (GHC.Num.negate @ GHC.Types.Float GHC.Float.$fNumFloat (GHC.Types.F# (__float 0.0))) } in GHC.Base.thenIO @ () @ [()] (System.IO.print @ GHC.Types.Float GHC.Float.$fShowFloat it_aKQ) (GHC.Base.returnIO @ [()] (GHC.Types.: @ () (it_aKQ `cast` (UnivCo representational GHC.Types.Float () :: GHC.Types.Float ~# ())) (GHC.Types.[] @ ()))) 0.0 Alexander Berntsen (2): Make Prelude.abs handle -0.0 correctly (#7858) Make Prelude.signum handle -0.0 correctly (#7858) libraries/base/GHC/Float.lhs | 28 ++++++++++++++++++---------- libraries/base/changelog.md | 2 ++ 2 files changed, 20 insertions(+), 10 deletions(-) -- 1.8.3.2