Strange behaviour in my signum

Simon Peyton Jones simonpj at microsoft.com
Mon Apr 21 08:32:17 UTC 2014


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 at haskell.org] On Behalf Of
| Alexander Berntsen
| Sent: 19 April 2014 19:02
| To: ghc-devs at 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 at haskell.org
| http://www.haskell.org/mailman/listinfo/ghc-devs


More information about the ghc-devs mailing list