authorgravatar for nick@appletonaudio.comNick Appleton <nick@appletonaudio.com> 2020-04-27 04:03:19+10:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-04-26 14:03:19-04:00
log28c31a8429f513f2d0e04ff5193faa8147721b19
tree597aadd1c16e028dcbfb7e95efae3ce9227248db
parentd44c9bdbd9c6add603997a834506ddd165a70cd4
signature Signed by PGP key 4AEE18F83AFDEB23

Fix f64 variants of math.cosh and math.sinh to accept negative inputs. (#5172)

* add tests for negative inputs to cosh32 and cosh64. fix bug in cosh64 for negative inputs. * fix problem with negative input with f64 sinh and add tests

2 files changed, 18 insertions(+), 2 deletions(-)

lib/std/math/cosh.zig+9-1
...@@ -56,7 +56,7 @@ fn cosh32(x: f32) f32 {...@@ -56,7 +56,7 @@ fn cosh32(x: f32) f32 {
5656
57fn cosh64(x: f64) f64 {57fn cosh64(x: f64) f64 {
58 const u = @bitCast(u64, x);58 const u = @bitCast(u64, x);
59 const w = @intCast(u32, u >> 32);59 const w = @intCast(u32, u >> 32) & (maxInt(u32) >> 1);
60 const ax = @bitCast(f64, u & (maxInt(u64) >> 1));60 const ax = @bitCast(f64, u & (maxInt(u64) >> 1));
6161
62 // TODO: Shouldn't need this explicit check.62 // TODO: Shouldn't need this explicit check.
...@@ -99,6 +99,10 @@ test "math.cosh32" {...@@ -99,6 +99,10 @@ test "math.cosh32" {
99 expect(math.approxEq(f32, cosh32(0.2), 1.020067, epsilon));99 expect(math.approxEq(f32, cosh32(0.2), 1.020067, epsilon));
100 expect(math.approxEq(f32, cosh32(0.8923), 1.425225, epsilon));100 expect(math.approxEq(f32, cosh32(0.8923), 1.425225, epsilon));
101 expect(math.approxEq(f32, cosh32(1.5), 2.352410, epsilon));101 expect(math.approxEq(f32, cosh32(1.5), 2.352410, epsilon));
102 expect(math.approxEq(f32, cosh32(-0.0), 1.0, epsilon));
103 expect(math.approxEq(f32, cosh32(-0.2), 1.020067, epsilon));
104 expect(math.approxEq(f32, cosh32(-0.8923), 1.425225, epsilon));
105 expect(math.approxEq(f32, cosh32(-1.5), 2.352410, epsilon));
102}106}
103107
104test "math.cosh64" {108test "math.cosh64" {
...@@ -108,6 +112,10 @@ test "math.cosh64" {...@@ -108,6 +112,10 @@ test "math.cosh64" {
108 expect(math.approxEq(f64, cosh64(0.2), 1.020067, epsilon));112 expect(math.approxEq(f64, cosh64(0.2), 1.020067, epsilon));
109 expect(math.approxEq(f64, cosh64(0.8923), 1.425225, epsilon));113 expect(math.approxEq(f64, cosh64(0.8923), 1.425225, epsilon));
110 expect(math.approxEq(f64, cosh64(1.5), 2.352410, epsilon));114 expect(math.approxEq(f64, cosh64(1.5), 2.352410, epsilon));
115 expect(math.approxEq(f64, cosh64(-0.0), 1.0, epsilon));
116 expect(math.approxEq(f64, cosh64(-0.2), 1.020067, epsilon));
117 expect(math.approxEq(f64, cosh64(-0.8923), 1.425225, epsilon));
118 expect(math.approxEq(f64, cosh64(-1.5), 2.352410, epsilon));
111}119}
112120
113test "math.cosh32.special" {121test "math.cosh32.special" {
lib/std/math/sinh.zig+9-1
...@@ -62,7 +62,7 @@ fn sinh32(x: f32) f32 {...@@ -62,7 +62,7 @@ fn sinh32(x: f32) f32 {
6262
63fn sinh64(x: f64) f64 {63fn sinh64(x: f64) f64 {
64 const u = @bitCast(u64, x);64 const u = @bitCast(u64, x);
65 const w = @intCast(u32, u >> 32);65 const w = @intCast(u32, u >> 32) & (maxInt(u32) >> 1);
66 const ax = @bitCast(f64, u & (maxInt(u64) >> 1));66 const ax = @bitCast(f64, u & (maxInt(u64) >> 1));
6767
68 if (x == 0.0 or math.isNan(x)) {68 if (x == 0.0 or math.isNan(x)) {
...@@ -104,6 +104,10 @@ test "math.sinh32" {...@@ -104,6 +104,10 @@ test "math.sinh32" {
104 expect(math.approxEq(f32, sinh32(0.2), 0.201336, epsilon));104 expect(math.approxEq(f32, sinh32(0.2), 0.201336, epsilon));
105 expect(math.approxEq(f32, sinh32(0.8923), 1.015512, epsilon));105 expect(math.approxEq(f32, sinh32(0.8923), 1.015512, epsilon));
106 expect(math.approxEq(f32, sinh32(1.5), 2.129279, epsilon));106 expect(math.approxEq(f32, sinh32(1.5), 2.129279, epsilon));
107 expect(math.approxEq(f32, sinh32(-0.0), -0.0, epsilon));
108 expect(math.approxEq(f32, sinh32(-0.2), -0.201336, epsilon));
109 expect(math.approxEq(f32, sinh32(-0.8923), -1.015512, epsilon));
110 expect(math.approxEq(f32, sinh32(-1.5), -2.129279, epsilon));
107}111}
108112
109test "math.sinh64" {113test "math.sinh64" {
...@@ -113,6 +117,10 @@ test "math.sinh64" {...@@ -113,6 +117,10 @@ test "math.sinh64" {
113 expect(math.approxEq(f64, sinh64(0.2), 0.201336, epsilon));117 expect(math.approxEq(f64, sinh64(0.2), 0.201336, epsilon));
114 expect(math.approxEq(f64, sinh64(0.8923), 1.015512, epsilon));118 expect(math.approxEq(f64, sinh64(0.8923), 1.015512, epsilon));
115 expect(math.approxEq(f64, sinh64(1.5), 2.129279, epsilon));119 expect(math.approxEq(f64, sinh64(1.5), 2.129279, epsilon));
120 expect(math.approxEq(f64, sinh64(-0.0), -0.0, epsilon));
121 expect(math.approxEq(f64, sinh64(-0.2), -0.201336, epsilon));
122 expect(math.approxEq(f64, sinh64(-0.8923), -1.015512, epsilon));
123 expect(math.approxEq(f64, sinh64(-1.5), -2.129279, epsilon));
116}124}
117125
118test "math.sinh32.special" {126test "math.sinh32.special" {