
Alexander Thanks for working on this. I suggest you add your draft patches and comments to the ticket #7858. Otherwise there is a terrible danger that they'll get lost. Simon | -----Original Message----- | From: ghc-devs [mailto:ghc-devs-bounces@haskell.org] On Behalf Of | Alexander Berntsen | Sent: 19 April 2014 19:02 | To: ghc-devs@haskell.org | Subject: Strange behaviour in my signum | | 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 | | _______________________________________________ | ghc-devs mailing list | ghc-devs@haskell.org | http://www.haskell.org/mailman/listinfo/ghc-devs