| author | |
| committer | |
| log | 28c31a8429f513f2d0e04ff5193faa8147721b19 |
| tree | 597aadd1c16e028dcbfb7e95efae3ce9227248db |
| parent | d44c9bdbd9c6add603997a834506ddd165a70cd4 |
| signature | Signed by PGP key 4AEE18F83AFDEB23 |
* 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 tests2 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 { |
| 56 | 56 | ||
| 57 | fn cosh64(x: f64) f64 { | 57 | fn 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)); |
| 61 | 61 | ||
| 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 | } |
| 103 | 107 | ||
| 104 | test "math.cosh64" { | 108 | test "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 | } |
| 112 | 120 | ||
| 113 | test "math.cosh32.special" { | 121 | test "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 { |
| 62 | 62 | ||
| 63 | fn sinh64(x: f64) f64 { | 63 | fn 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)); |
| 67 | 67 | ||
| 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 | } |
| 108 | 112 | ||
| 109 | test "math.sinh64" { | 113 | test "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 | } |
| 117 | 125 | ||
| 118 | test "math.sinh32.special" { | 126 | test "math.sinh32.special" { |