Opened 6 years ago

Closed 6 years ago

#4228 closed bug (fixed)

atanh (-1) returns NaN instead of -Infinity

Reported by: sbroadhead Owned by:
Priority: normal Milestone: 7.0.1
Component: Prelude Version: 6.12.1
Keywords: Cc: ghc@…
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: Incorrect result at runtime Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s):
Wiki Page:


According to the man page for libc's atanh:

If x is +1 or -1, a pole error occurs, and the functions return HUGE_VAL, HUGE_VALF, or HUGE_VALL, respectively, with the mathematically correct sign.

atanh 1 correctly returns Infinity, but atanh (-1) returns NaN instead of -Infinity. A C program compiled on the same system gives the correct result.

Attachments (1)

4228.patch (44.6 KB) - added by norriscm 6 years ago.
FIX #4228 (use alternate formula for atanh)

Download all attachments as: .zip

Change History (4)

comment:1 Changed 6 years ago by igloo

  • Architecture changed from x86 to Unknown/Multiple
  • Milestone set to 6.14.1
  • Operating System changed from MacOS X to Unknown/Multiple

Since the beginning of time:

Thu Jun 28 15:15:04 BST 2001  simonmar
  * [project @ 2001-06-28 14:15:04 by simonmar]
  First cut of the Haskell Core Libraries

we've had:

asinh x = log (x + sqrt (1.0+x*x))
acosh x = log (x + (x+1.0) * sqrt ((x-1.0)/(x+1.0)))
atanh x = log ((x+1.0) / sqrt (1.0-x*x))

for Double, Float and Complex a.

Changed 6 years ago by norriscm

FIX #4228 (use alternate formula for atanh)

comment:2 Changed 6 years ago by norriscm

  • Cc ghc@… added
  • Status changed from new to patch

By using a different (but mathematically equivalent) formula for atanh, we can get the desired behavior without explicitly handling the branch cuts:

atanh x = 0.5 * log ((1.0+x) / (1.0-x))

This definition gives atanh 1 == Infinity and atanh -1 == -Infinity. The attached patch makes the changes in GHC.Float and Data.Complex for the Float, Double, and Complex a instances.

comment:3 Changed 6 years ago by igloo

  • Resolution set to fixed
  • Status changed from patch to closed

Patch applied, thanks.

Note: See TracTickets for help on using tickets.