| author | |
| committer | |
| log | c6eeae8a8c2314fd35b5baddb18f33b0122d319f |
| tree | 3a9aaeaadf5c220bc4f64ca2a08ea9e47aaa4217 |
| parent | 771047ae930f73de14c30ec972d5c9a71c48b271 |
| parent | 51509fe63bd94c2067bdc31962775ed3742b657f |
Reviewed-on: https://codeberg.org/ziglang/zig/pulls/31209
Reviewed-by: Andrew Kelley <andrew@ziglang.org>3 files changed, 627 insertions(+), 263 deletions(-)
lib/std/math/acos.zig+257-73| ... | ... | @@ -4,6 +4,12 @@ |
| 4 | 4 | // https://git.musl-libc.org/cgit/musl/tree/src/math/acosf.c |
| 5 | 5 | // https://git.musl-libc.org/cgit/musl/tree/src/math/acos.c |
| 6 | 6 | // https://git.musl-libc.org/cgit/musl/tree/src/math/acosl.c |
| 7 | // | |
| 8 | // Ported from ARM-software, which is licensed under the MIT license: | |
| 9 | // https://github.com/ARM-software/optimized-routines/blob/master/LICENSE | |
| 10 | // | |
| 11 | // https://github.com/ARM-software/optimized-routines/blob/master/math/aarch64/advsimd/acosf.c | |
| 12 | // https://github.com/ARM-software/optimized-routines/blob/master/math/aarch64/advsimd/acos.c | |
| 7 | 13 | |
| 8 | 14 | const std = @import("../std.zig"); |
| 9 | 15 | const math = std.math; |
| ... | ... | @@ -17,14 +23,22 @@ const native_endian = builtin.cpu.arch.endian(); |
| 17 | 23 | /// - acos(x) = nan if x < -1 or x > 1 |
| 18 | 24 | pub fn acos(x: anytype) @TypeOf(x) { |
| 19 | 25 | const T = @TypeOf(x); |
| 20 | return switch (T) { | |
| 21 | f16 => acosBinary16(x), | |
| 22 | f32 => acosBinary32(x), | |
| 23 | f64 => acosBinary64(x), | |
| 24 | f80 => acosExtended80(x), | |
| 25 | f128 => acosBinary128(x), | |
| 26 | else => @compileError("acos not implemented for " ++ @typeName(T)), | |
| 27 | }; | |
| 26 | switch (@typeInfo(T)) { | |
| 27 | .float => |info| switch (info.bits) { | |
| 28 | 16 => return acosBinary16(x), | |
| 29 | 32 => return acosBinary32(x), | |
| 30 | 64 => return acosBinary64(x), | |
| 31 | 80 => return acosExtended80(x), | |
| 32 | 128 => return acosBinary128(x), | |
| 33 | else => comptime unreachable, | |
| 34 | }, | |
| 35 | .vector => |info| switch (info.child) { | |
| 36 | f32 => return acosBinary32Vec(info.len, x), | |
| 37 | f64 => return acosBinary64Vec(info.len, x), | |
| 38 | else => @compileError("unimplemented"), | |
| 39 | }, | |
| 40 | else => comptime unreachable, | |
| 41 | } | |
| 28 | 42 | } |
| 29 | 43 | |
| 30 | 44 | fn approxBinary16(z: f32) f32 { |
| ... | ... | @@ -323,9 +337,9 @@ fn acosBinary128(x: f128) f128 { |
| 323 | 337 | } |
| 324 | 338 | |
| 325 | 339 | test "acosBinary16.special" { |
| 326 | try testing.expectApproxEqAbs(acosBinary16(0x0p+0), 0x1.92p0, math.floatEpsAt(f16, 0x1.92p0)); | |
| 327 | try testing.expectApproxEqAbs(acosBinary16(-0x1p+0), 0x1.92p1, math.floatEpsAt(f16, 0x1.92p1)); | |
| 328 | try testing.expectEqual(acosBinary16(0x1p+0), 0x0p+0); | |
| 340 | try testing.expectApproxEqAbs(0x1.92p0, acosBinary16(0x0p+0), math.floatEpsAt(f16, 0x1.92p0)); | |
| 341 | try testing.expectApproxEqAbs(0x1.92p1, acosBinary16(-0x1p+0), math.floatEpsAt(f16, 0x1.92p1)); | |
| 342 | try testing.expectEqual(0x0p+0, acosBinary16(0x1p+0)); | |
| 329 | 343 | try testing.expect(math.isNan(acosBinary16(0x1.004p0))); |
| 330 | 344 | try testing.expect(math.isNan(acosBinary16(-0x1.004p0))); |
| 331 | 345 | try testing.expect(math.isNan(acosBinary16(math.inf(f16)))); |
| ... | ... | @@ -334,22 +348,22 @@ test "acosBinary16.special" { |
| 334 | 348 | } |
| 335 | 349 | |
| 336 | 350 | test "acosBinary16" { |
| 337 | try testing.expectApproxEqAbs(acosBinary16(0x1.db4p-5), 0x1.834p0, math.floatEpsAt(f16, 0x1.834p0)); | |
| 338 | try testing.expectApproxEqAbs(acosBinary16(-0x1.068p-2), 0x1.d48p0, math.floatEpsAt(f16, 0x1.d48p0)); | |
| 339 | try testing.expectApproxEqAbs(acosBinary16(-0x1.2c4p-3), 0x1.b7cp0, math.floatEpsAt(f16, 0x1.b7cp0)); | |
| 340 | try testing.expectApproxEqAbs(acosBinary16(0x1.65p-3), 0x1.654p0, math.floatEpsAt(f16, 0x1.654p0)); | |
| 341 | try testing.expectApproxEqAbs(acosBinary16(0x1.dfcp-1), 0x1.6d8p-2, math.floatEpsAt(f16, 0x1.6d8p-2)); | |
| 342 | try testing.expectApproxEqAbs(acosBinary16(-0x1.764p-1), 0x1.32p1, math.floatEpsAt(f16, 0x1.32p1)); | |
| 343 | try testing.expectApproxEqAbs(acosBinary16(0x1.b18p-3), 0x1.5b8p0, math.floatEpsAt(f16, 0x1.5b8p0)); | |
| 344 | try testing.expectApproxEqAbs(acosBinary16(0x1.5acp-3), 0x1.668p0, math.floatEpsAt(f16, 0x1.668p0)); | |
| 345 | try testing.expectApproxEqAbs(acosBinary16(-0x1.18cp-1), 0x1.134p1, math.floatEpsAt(f16, 0x1.134p1)); | |
| 346 | try testing.expectApproxEqAbs(acosBinary16(-0x1.03p-1), 0x1.0dp1, math.floatEpsAt(f16, 0x1.0dp1)); | |
| 351 | try testing.expectApproxEqAbs(0x1.834p0, acosBinary16(0x1.db4p-5), math.floatEpsAt(f16, 0x1.834p0)); | |
| 352 | try testing.expectApproxEqAbs(0x1.d48p0, acosBinary16(-0x1.068p-2), math.floatEpsAt(f16, 0x1.d48p0)); | |
| 353 | try testing.expectApproxEqAbs(0x1.b7cp0, acosBinary16(-0x1.2c4p-3), math.floatEpsAt(f16, 0x1.b7cp0)); | |
| 354 | try testing.expectApproxEqAbs(0x1.654p0, acosBinary16(0x1.65p-3), math.floatEpsAt(f16, 0x1.654p0)); | |
| 355 | try testing.expectApproxEqAbs(0x1.6d8p-2, acosBinary16(0x1.dfcp-1), math.floatEpsAt(f16, 0x1.6d8p-2)); | |
| 356 | try testing.expectApproxEqAbs(0x1.32p1, acosBinary16(-0x1.764p-1), math.floatEpsAt(f16, 0x1.32p1)); | |
| 357 | try testing.expectApproxEqAbs(0x1.5b8p0, acosBinary16(0x1.b18p-3), math.floatEpsAt(f16, 0x1.5b8p0)); | |
| 358 | try testing.expectApproxEqAbs(0x1.668p0, acosBinary16(0x1.5acp-3), math.floatEpsAt(f16, 0x1.668p0)); | |
| 359 | try testing.expectApproxEqAbs(0x1.134p1, acosBinary16(-0x1.18cp-1), math.floatEpsAt(f16, 0x1.134p1)); | |
| 360 | try testing.expectApproxEqAbs(0x1.0dp1, acosBinary16(-0x1.03p-1), math.floatEpsAt(f16, 0x1.0dp1)); | |
| 347 | 361 | } |
| 348 | 362 | |
| 349 | 363 | test "acosBinary32.special" { |
| 350 | try testing.expectApproxEqAbs(acosBinary32(0x0p+0), 0x1.921fb6p+0, math.floatEpsAt(f32, 0x1.921fb6p+0)); | |
| 351 | try testing.expectApproxEqAbs(acosBinary32(-0x1p+0), 0x1.921fb6p+1, math.floatEpsAt(f32, 0x1.921fb6p+1)); | |
| 352 | try testing.expectEqual(acosBinary32(0x1p+0), 0x0p+0); | |
| 364 | try testing.expectApproxEqAbs(0x1.921fb6p+0, acosBinary32(0x0p+0), math.floatEpsAt(f32, 0x1.921fb6p+0)); | |
| 365 | try testing.expectApproxEqAbs(0x1.921fb6p+1, acosBinary32(-0x1p+0), math.floatEpsAt(f32, 0x1.921fb6p+1)); | |
| 366 | try testing.expectEqual(0x0p+0, acosBinary32(0x1p+0)); | |
| 353 | 367 | try testing.expect(math.isNan(acosBinary32(0x1.000002p+0))); |
| 354 | 368 | try testing.expect(math.isNan(acosBinary32(-0x1.000002p+0))); |
| 355 | 369 | try testing.expect(math.isNan(acosBinary32(math.inf(f32)))); |
| ... | ... | @@ -358,22 +372,22 @@ test "acosBinary32.special" { |
| 358 | 372 | } |
| 359 | 373 | |
| 360 | 374 | test "acosBinary32" { |
| 361 | try testing.expectApproxEqAbs(acosBinary32(-0x1.13284cp-2), 0x1.d7c4e6p+0, math.floatEpsAt(f32, 0x1.d7c4e6p+0)); | |
| 362 | try testing.expectApproxEqAbs(acosBinary32(0x1.6ca8ep-1), 0x1.8e6756p-1, math.floatEpsAt(f32, 0x1.8e6756p-1)); | |
| 363 | try testing.expectApproxEqAbs(acosBinary32(0x1.c2ca6p-1), 0x1.f9d74cp-2, math.floatEpsAt(f32, 0x1.f9d74cp-2)); | |
| 364 | try testing.expectApproxEqAbs(acosBinary32(-0x1.55f12p-1), 0x1.26abdcp+1, math.floatEpsAt(f32, 0x1.26abdcp+1)); | |
| 365 | try testing.expectApproxEqAbs(acosBinary32(-0x1.15679ep-2), 0x1.d85a44p+0, math.floatEpsAt(f32, 0x1.d85a44p+0)); | |
| 366 | try testing.expectApproxEqAbs(acosBinary32(-0x1.41e132p-5), 0x1.9c2f68p+0, math.floatEpsAt(f32, 0x1.9c2f68p+0)); | |
| 367 | try testing.expectApproxEqAbs(acosBinary32(0x1.281b0ep-1), 0x1.e881bp-1, math.floatEpsAt(f32, 0x1.e881bp-1)); | |
| 368 | try testing.expectApproxEqAbs(acosBinary32(0x1.b5ce34p-1), 0x1.1713f6p-1, math.floatEpsAt(f32, 0x1.1713f6p-1)); | |
| 369 | try testing.expectApproxEqAbs(acosBinary32(-0x1.583482p-3), 0x1.bd5accp+0, math.floatEpsAt(f32, 0x1.bd5accp+0)); | |
| 370 | try testing.expectApproxEqAbs(acosBinary32(-0x1.ea8224p-1), 0x1.6ce7d8p+1, math.floatEpsAt(f32, 0x1.6ce7d8p+1)); | |
| 375 | try testing.expectApproxEqAbs(0x1.d7c4e6p+0, acosBinary32(-0x1.13284cp-2), math.floatEpsAt(f32, 0x1.d7c4e6p+0)); | |
| 376 | try testing.expectApproxEqAbs(0x1.8e6756p-1, acosBinary32(0x1.6ca8ep-1), math.floatEpsAt(f32, 0x1.8e6756p-1)); | |
| 377 | try testing.expectApproxEqAbs(0x1.f9d74cp-2, acosBinary32(0x1.c2ca6p-1), math.floatEpsAt(f32, 0x1.f9d74cp-2)); | |
| 378 | try testing.expectApproxEqAbs(0x1.26abdcp+1, acosBinary32(-0x1.55f12p-1), math.floatEpsAt(f32, 0x1.26abdcp+1)); | |
| 379 | try testing.expectApproxEqAbs(0x1.d85a44p+0, acosBinary32(-0x1.15679ep-2), math.floatEpsAt(f32, 0x1.d85a44p+0)); | |
| 380 | try testing.expectApproxEqAbs(0x1.9c2f68p+0, acosBinary32(-0x1.41e132p-5), math.floatEpsAt(f32, 0x1.9c2f68p+0)); | |
| 381 | try testing.expectApproxEqAbs(0x1.e881bp-1, acosBinary32(0x1.281b0ep-1), math.floatEpsAt(f32, 0x1.e881bp-1)); | |
| 382 | try testing.expectApproxEqAbs(0x1.1713f6p-1, acosBinary32(0x1.b5ce34p-1), math.floatEpsAt(f32, 0x1.1713f6p-1)); | |
| 383 | try testing.expectApproxEqAbs(0x1.bd5accp+0, acosBinary32(-0x1.583482p-3), math.floatEpsAt(f32, 0x1.bd5accp+0)); | |
| 384 | try testing.expectApproxEqAbs(0x1.6ce7d8p+1, acosBinary32(-0x1.ea8224p-1), math.floatEpsAt(f32, 0x1.6ce7d8p+1)); | |
| 371 | 385 | } |
| 372 | 386 | |
| 373 | 387 | test "acosBinary64.special" { |
| 374 | try testing.expectApproxEqAbs(acosBinary64(0x0p+0), 0x1.921fb54442d18p+0, math.floatEpsAt(f64, 0x1.921fb54442d18p+0)); | |
| 375 | try testing.expectApproxEqAbs(acosBinary64(-0x1p+0), 0x1.921fb54442d18p+1, math.floatEpsAt(f64, 0x1.921fb54442d18p+1)); | |
| 376 | try testing.expectEqual(acosBinary64(0x1p+0), 0x0p+0); | |
| 388 | try testing.expectApproxEqAbs(0x1.921fb54442d18p+0, acosBinary64(0x0p+0), math.floatEpsAt(f64, 0x1.921fb54442d18p+0)); | |
| 389 | try testing.expectApproxEqAbs(0x1.921fb54442d18p+1, acosBinary64(-0x1p+0), math.floatEpsAt(f64, 0x1.921fb54442d18p+1)); | |
| 390 | try testing.expectEqual(0x0p+0, acosBinary64(0x1p+0)); | |
| 377 | 391 | try testing.expect(math.isNan(acosBinary64(0x1.0000000000001p+0))); |
| 378 | 392 | try testing.expect(math.isNan(acosBinary64(-0x1.0000000000001p+0))); |
| 379 | 393 | try testing.expect(math.isNan(acosBinary64(math.inf(f64)))); |
| ... | ... | @@ -382,22 +396,22 @@ test "acosBinary64.special" { |
| 382 | 396 | } |
| 383 | 397 | |
| 384 | 398 | test "acosBinary64" { |
| 385 | try testing.expectApproxEqAbs(acosBinary64(-0x1.13284b2b5006dp-2), 0x1.d7c4e61020905p+0, math.floatEpsAt(f64, 0x1.d7c4e61020905p+0)); | |
| 386 | try testing.expectApproxEqAbs(acosBinary64(0x1.6ca8dfb825911p-1), 0x1.8e6756e27c366p-1, math.floatEpsAt(f64, 0x1.8e6756e27c366p-1)); | |
| 387 | try testing.expectApproxEqAbs(acosBinary64(0x1.c2ca609de7505p-1), 0x1.f9d748eaf956p-2, math.floatEpsAt(f64, 0x1.f9d748eaf956p-2)); | |
| 388 | try testing.expectApproxEqAbs(acosBinary64(-0x1.55f11fba96889p-1), 0x1.26abdc68d07aap+1, math.floatEpsAt(f64, 0x1.26abdc68d07aap+1)); | |
| 389 | try testing.expectApproxEqAbs(acosBinary64(-0x1.15679e27084ddp-2), 0x1.d85a44ea44fe4p+0, math.floatEpsAt(f64, 0x1.d85a44ea44fe4p+0)); | |
| 390 | try testing.expectApproxEqAbs(acosBinary64(-0x1.41e131b093c41p-5), 0x1.9c2f688eee8abp+0, math.floatEpsAt(f64, 0x1.9c2f688eee8abp+0)); | |
| 391 | try testing.expectApproxEqAbs(acosBinary64(0x1.281b0d18455f5p-1), 0x1.e881b1d4eb2a1p-1, math.floatEpsAt(f64, 0x1.e881b1d4eb2a1p-1)); | |
| 392 | try testing.expectApproxEqAbs(acosBinary64(0x1.b5ce34a51b239p-1), 0x1.1713f567a87efp-1, math.floatEpsAt(f64, 0x1.1713f567a87efp-1)); | |
| 393 | try testing.expectApproxEqAbs(acosBinary64(-0x1.583481079de4dp-3), 0x1.bd5acbe8fcc59p+0, math.floatEpsAt(f64, 0x1.bd5acbe8fcc59p+0)); | |
| 394 | try testing.expectApproxEqAbs(acosBinary64(-0x1.ea8223103b871p-1), 0x1.6ce7d66f628e5p+1, math.floatEpsAt(f64, 0x1.6ce7d66f628e5p+1)); | |
| 399 | try testing.expectApproxEqAbs(0x1.d7c4e61020905p+0, acosBinary64(-0x1.13284b2b5006dp-2), math.floatEpsAt(f64, 0x1.d7c4e61020905p+0)); | |
| 400 | try testing.expectApproxEqAbs(0x1.8e6756e27c366p-1, acosBinary64(0x1.6ca8dfb825911p-1), math.floatEpsAt(f64, 0x1.8e6756e27c366p-1)); | |
| 401 | try testing.expectApproxEqAbs(0x1.f9d748eaf956p-2, acosBinary64(0x1.c2ca609de7505p-1), math.floatEpsAt(f64, 0x1.f9d748eaf956p-2)); | |
| 402 | try testing.expectApproxEqAbs(0x1.26abdc68d07aap+1, acosBinary64(-0x1.55f11fba96889p-1), math.floatEpsAt(f64, 0x1.26abdc68d07aap+1)); | |
| 403 | try testing.expectApproxEqAbs(0x1.d85a44ea44fe4p+0, acosBinary64(-0x1.15679e27084ddp-2), math.floatEpsAt(f64, 0x1.d85a44ea44fe4p+0)); | |
| 404 | try testing.expectApproxEqAbs(0x1.9c2f688eee8abp+0, acosBinary64(-0x1.41e131b093c41p-5), math.floatEpsAt(f64, 0x1.9c2f688eee8abp+0)); | |
| 405 | try testing.expectApproxEqAbs(0x1.e881b1d4eb2a1p-1, acosBinary64(0x1.281b0d18455f5p-1), math.floatEpsAt(f64, 0x1.e881b1d4eb2a1p-1)); | |
| 406 | try testing.expectApproxEqAbs(0x1.1713f567a87efp-1, acosBinary64(0x1.b5ce34a51b239p-1), math.floatEpsAt(f64, 0x1.1713f567a87efp-1)); | |
| 407 | try testing.expectApproxEqAbs(0x1.bd5acbe8fcc59p+0, acosBinary64(-0x1.583481079de4dp-3), math.floatEpsAt(f64, 0x1.bd5acbe8fcc59p+0)); | |
| 408 | try testing.expectApproxEqAbs(0x1.6ce7d66f628e5p+1, acosBinary64(-0x1.ea8223103b871p-1), math.floatEpsAt(f64, 0x1.6ce7d66f628e5p+1)); | |
| 395 | 409 | } |
| 396 | 410 | |
| 397 | 411 | test "acosExtended80.special" { |
| 398 | try testing.expectApproxEqAbs(acosExtended80(0x0p+0), 0x1.921fb54442d1846ap+0, math.floatEpsAt(f80, 0x1.921fb54442d1846ap+0)); | |
| 399 | try testing.expectApproxEqAbs(acosExtended80(-0x1p+0), 0x1.921fb54442d1846ap+1, math.floatEpsAt(f80, 0x1.921fb54442d1846ap+1)); | |
| 400 | try testing.expectEqual(acosExtended80(0x1p+0), 0x0p+0); | |
| 412 | try testing.expectApproxEqAbs(0x1.921fb54442d1846ap+0, acosExtended80(0x0p+0), math.floatEpsAt(f80, 0x1.921fb54442d1846ap+0)); | |
| 413 | try testing.expectApproxEqAbs(0x1.921fb54442d1846ap+1, acosExtended80(-0x1p+0), math.floatEpsAt(f80, 0x1.921fb54442d1846ap+1)); | |
| 414 | try testing.expectEqual(0x0p+0, acosExtended80(0x1p+0)); | |
| 401 | 415 | try testing.expect(math.isNan(acosExtended80(0x1.0000000000000002p+0))); |
| 402 | 416 | try testing.expect(math.isNan(acosExtended80(-0x1.0000000000000002p+0))); |
| 403 | 417 | try testing.expect(math.isNan(acosExtended80(math.inf(f80)))); |
| ... | ... | @@ -406,22 +420,22 @@ test "acosExtended80.special" { |
| 406 | 420 | } |
| 407 | 421 | |
| 408 | 422 | test "acosExtended80" { |
| 409 | try testing.expectApproxEqAbs(acosExtended80(0x1.72068a321edc8804p-1), 0x1.86b349040d28f794p-1, math.floatEpsAt(f80, 0x1.86b349040d28f794p-1)); | |
| 410 | try testing.expectApproxEqAbs(acosExtended80(-0x1.06d0a467d22977ecp-2), 0x1.d4923ade73ec379cp0, math.floatEpsAt(f80, 0x1.d4923ade73ec379cp0)); | |
| 411 | try testing.expectApproxEqAbs(acosExtended80(0x1.77d21385faa9798ap-3), 0x1.62e0e8898c6d04f2p0, math.floatEpsAt(f80, 0x1.62e0e8898c6d04f2p0)); | |
| 412 | try testing.expectApproxEqAbs(acosExtended80(-0x1.73ee3e8bc2a44dbep-1), 0x1.3123cbcd5dc4bd58p1, math.floatEpsAt(f80, 0x1.3123cbcd5dc4bd58p1)); | |
| 413 | try testing.expectApproxEqAbs(acosExtended80(0x1.0a2dd1f6ffcf668ap-1), 0x1.062a6d562df2d316p0, math.floatEpsAt(f80, 0x1.062a6d562df2d316p0)); | |
| 414 | try testing.expectApproxEqAbs(acosExtended80(0x1.8e835c490a3aff9ep-3), 0x1.5ffd68b520aa55fap0, math.floatEpsAt(f80, 0x1.5ffd68b520aa55fap0)); | |
| 415 | try testing.expectApproxEqAbs(acosExtended80(0x1.add20cdc1565064cp-3), 0x1.5bfe6cabda700684p0, math.floatEpsAt(f80, 0x1.5bfe6cabda700684p0)); | |
| 416 | try testing.expectApproxEqAbs(acosExtended80(0x1.21986d43727fca72p-8), 0x1.90fe1c993b571924p0, math.floatEpsAt(f80, 0x1.90fe1c993b571924p0)); | |
| 417 | try testing.expectApproxEqAbs(acosExtended80(0x1.d61e0b3fae6a0564p-2), 0x1.18044ccc626e7f9ep0, math.floatEpsAt(f80, 0x1.18044ccc626e7f9ep0)); | |
| 418 | try testing.expectApproxEqAbs(acosExtended80(-0x1.171e7c4a41883ccap-4), 0x1.a39513b6c16532b4p0, math.floatEpsAt(f80, 0x1.a39513b6c16532b4p0)); | |
| 423 | try testing.expectApproxEqAbs(0x1.86b349040d28f794p-1, acosExtended80(0x1.72068a321edc8804p-1), math.floatEpsAt(f80, 0x1.86b349040d28f794p-1)); | |
| 424 | try testing.expectApproxEqAbs(0x1.d4923ade73ec379cp0, acosExtended80(-0x1.06d0a467d22977ecp-2), math.floatEpsAt(f80, 0x1.d4923ade73ec379cp0)); | |
| 425 | try testing.expectApproxEqAbs(0x1.62e0e8898c6d04f2p0, acosExtended80(0x1.77d21385faa9798ap-3), math.floatEpsAt(f80, 0x1.62e0e8898c6d04f2p0)); | |
| 426 | try testing.expectApproxEqAbs(0x1.3123cbcd5dc4bd58p1, acosExtended80(-0x1.73ee3e8bc2a44dbep-1), math.floatEpsAt(f80, 0x1.3123cbcd5dc4bd58p1)); | |
| 427 | try testing.expectApproxEqAbs(0x1.062a6d562df2d316p0, acosExtended80(0x1.0a2dd1f6ffcf668ap-1), math.floatEpsAt(f80, 0x1.062a6d562df2d316p0)); | |
| 428 | try testing.expectApproxEqAbs(0x1.5ffd68b520aa55fap0, acosExtended80(0x1.8e835c490a3aff9ep-3), math.floatEpsAt(f80, 0x1.5ffd68b520aa55fap0)); | |
| 429 | try testing.expectApproxEqAbs(0x1.5bfe6cabda700684p0, acosExtended80(0x1.add20cdc1565064cp-3), math.floatEpsAt(f80, 0x1.5bfe6cabda700684p0)); | |
| 430 | try testing.expectApproxEqAbs(0x1.90fe1c993b571924p0, acosExtended80(0x1.21986d43727fca72p-8), math.floatEpsAt(f80, 0x1.90fe1c993b571924p0)); | |
| 431 | try testing.expectApproxEqAbs(0x1.18044ccc626e7f9ep0, acosExtended80(0x1.d61e0b3fae6a0564p-2), math.floatEpsAt(f80, 0x1.18044ccc626e7f9ep0)); | |
| 432 | try testing.expectApproxEqAbs(0x1.a39513b6c16532b4p0, acosExtended80(-0x1.171e7c4a41883ccap-4), math.floatEpsAt(f80, 0x1.a39513b6c16532b4p0)); | |
| 419 | 433 | } |
| 420 | 434 | |
| 421 | 435 | test "acosBinary128.special" { |
| 422 | try testing.expectApproxEqAbs(acosBinary128(0x0p+0), 0x1.921fb54442d18469898cc51701b8p0, math.floatEpsAt(f128, 0x1.921fb54442d18469898cc51701b8p0)); | |
| 423 | try testing.expectApproxEqAbs(acosBinary128(-0x1p+0), 0x1.921fb54442d18469898cc51701b8p1, math.floatEpsAt(f128, 0x1.921fb54442d18469898cc51701b8p1)); | |
| 424 | try testing.expectEqual(acosBinary128(0x1p+0), 0x0p+0); | |
| 436 | try testing.expectApproxEqAbs(0x1.921fb54442d18469898cc51701b8p0, acosBinary128(0x0p+0), math.floatEpsAt(f128, 0x1.921fb54442d18469898cc51701b8p0)); | |
| 437 | try testing.expectApproxEqAbs(0x1.921fb54442d18469898cc51701b8p1, acosBinary128(-0x1p+0), math.floatEpsAt(f128, 0x1.921fb54442d18469898cc51701b8p1)); | |
| 438 | try testing.expectEqual(0x0p+0, acosBinary128(0x1p+0)); | |
| 425 | 439 | try testing.expect(math.isNan(acosBinary128(0x1.0000000000000000000000000001p0))); |
| 426 | 440 | try testing.expect(math.isNan(acosBinary128(-0x1.0000000000000000000000000001p0))); |
| 427 | 441 | try testing.expect(math.isNan(acosBinary128(math.inf(f128)))); |
| ... | ... | @@ -430,14 +444,184 @@ test "acosBinary128.special" { |
| 430 | 444 | } |
| 431 | 445 | |
| 432 | 446 | test "acosBinary128" { |
| 433 | try testing.expectApproxEqAbs(acosBinary128(-0x1.511bdb99a3c4373bedf834ef4f68p-1), 0x1.250e9a58f049eeafa99db4360c88p1, math.floatEpsAt(f128, 0x1.250e9a58f049eeafa99db4360c88p1)); | |
| 434 | try testing.expectApproxEqAbs(acosBinary128(-0x1.5879cc3ad6dfd2a52e9891c69808p-1), 0x1.2786664b1c676c99437b68590004p1, math.floatEpsAt(f128, 0x1.2786664b1c676c99437b68590004p1)); | |
| 435 | try testing.expectApproxEqAbs(acosBinary128(0x1.3f988ba64a7eb97a751c5f0b3077p-1), 0x1.cb190cd361c7c03a09c470b4caebp-1, math.floatEpsAt(f128, 0x1.cb190cd361c7c03a09c470b4caebp-1)); | |
| 436 | try testing.expectApproxEqAbs(acosBinary128(-0x1.3f2d96c7768e4c4fa02315727959p-1), 0x1.1f373be697880111758f582b1a96p1, math.floatEpsAt(f128, 0x1.1f373be697880111758f582b1a96p1)); | |
| 437 | try testing.expectApproxEqAbs(acosBinary128(0x1.fad303c2e28c1f4d8f9fd0e5686fp-2), 0x1.0d92fd2a0a6ca3e4853c1de9ea6ap0, math.floatEpsAt(f128, 0x1.0d92fd2a0a6ca3e4853c1de9ea6ap0)); | |
| 438 | try testing.expectApproxEqAbs(acosBinary128(0x1.ddde322bd1a2ee50c5ba30c9c617p-2), 0x1.15d4b306e16fbf9ea4f29e82b154p0, math.floatEpsAt(f128, 0x1.15d4b306e16fbf9ea4f29e82b154p0)); | |
| 439 | try testing.expectApproxEqAbs(acosBinary128(-0x1.b02f6adefcbeb1d48666b827ff17p-1), 0x1.49b0a0355a5539052388e8a6dc11p1, math.floatEpsAt(f128, 0x1.49b0a0355a5539052388e8a6dc11p1)); | |
| 440 | try testing.expectApproxEqAbs(acosBinary128(0x1.c8581cce7cd3f6efab0fc60d9b7dp-2), 0x1.1be0b757f4cef022f5d2422b9c78p0, math.floatEpsAt(f128, 0x1.1be0b757f4cef022f5d2422b9c78p0)); | |
| 441 | try testing.expectApproxEqAbs(acosBinary128(-0x1.bf887b8c4e33cbef59993056f3dep-1), 0x1.513270e671db2d840f20b0186c2cp1, math.floatEpsAt(f128, 0x1.513270e671db2d840f20b0186c2cp1)); | |
| 442 | try testing.expectApproxEqAbs(acosBinary128(0x1.0c0f600ab6f9c84c6102942044cep-3), 0x1.70851a509f0e8bfbe780aa8f29f9p0, math.floatEpsAt(f128, 0x1.70851a509f0e8bfbe780aa8f29f9p0)); | |
| 447 | try testing.expectApproxEqAbs(0x1.250e9a58f049eeafa99db4360c88p1, acosBinary128(-0x1.511bdb99a3c4373bedf834ef4f68p-1), math.floatEpsAt(f128, 0x1.250e9a58f049eeafa99db4360c88p1)); | |
| 448 | try testing.expectApproxEqAbs(0x1.2786664b1c676c99437b68590004p1, acosBinary128(-0x1.5879cc3ad6dfd2a52e9891c69808p-1), math.floatEpsAt(f128, 0x1.2786664b1c676c99437b68590004p1)); | |
| 449 | try testing.expectApproxEqAbs(0x1.cb190cd361c7c03a09c470b4caebp-1, acosBinary128(0x1.3f988ba64a7eb97a751c5f0b3077p-1), math.floatEpsAt(f128, 0x1.cb190cd361c7c03a09c470b4caebp-1)); | |
| 450 | try testing.expectApproxEqAbs(0x1.1f373be697880111758f582b1a96p1, acosBinary128(-0x1.3f2d96c7768e4c4fa02315727959p-1), math.floatEpsAt(f128, 0x1.1f373be697880111758f582b1a96p1)); | |
| 451 | try testing.expectApproxEqAbs(0x1.0d92fd2a0a6ca3e4853c1de9ea6ap0, acosBinary128(0x1.fad303c2e28c1f4d8f9fd0e5686fp-2), math.floatEpsAt(f128, 0x1.0d92fd2a0a6ca3e4853c1de9ea6ap0)); | |
| 452 | try testing.expectApproxEqAbs(0x1.15d4b306e16fbf9ea4f29e82b154p0, acosBinary128(0x1.ddde322bd1a2ee50c5ba30c9c617p-2), math.floatEpsAt(f128, 0x1.15d4b306e16fbf9ea4f29e82b154p0)); | |
| 453 | try testing.expectApproxEqAbs(0x1.49b0a0355a5539052388e8a6dc11p1, acosBinary128(-0x1.b02f6adefcbeb1d48666b827ff17p-1), math.floatEpsAt(f128, 0x1.49b0a0355a5539052388e8a6dc11p1)); | |
| 454 | try testing.expectApproxEqAbs(0x1.1be0b757f4cef022f5d2422b9c78p0, acosBinary128(0x1.c8581cce7cd3f6efab0fc60d9b7dp-2), math.floatEpsAt(f128, 0x1.1be0b757f4cef022f5d2422b9c78p0)); | |
| 455 | try testing.expectApproxEqAbs(0x1.513270e671db2d840f20b0186c2cp1, acosBinary128(-0x1.bf887b8c4e33cbef59993056f3dep-1), math.floatEpsAt(f128, 0x1.513270e671db2d840f20b0186c2cp1)); | |
| 456 | try testing.expectApproxEqAbs(0x1.70851a509f0e8bfbe780aa8f29f9p0, acosBinary128(0x1.0c0f600ab6f9c84c6102942044cep-3), math.floatEpsAt(f128, 0x1.70851a509f0e8bfbe780aa8f29f9p0)); | |
| 457 | } | |
| 458 | ||
| 459 | fn acosBinary32Vec(comptime vec_len: comptime_int, x: @Vector(vec_len, f32)) @TypeOf(x) { | |
| 460 | const pi: @Vector(vec_len, f32) = @splat(math.pi); | |
| 461 | const pi_over_2: @Vector(vec_len, f32) = @splat(math.pi / 2.0); | |
| 462 | const zero: @Vector(vec_len, f32) = @splat(0.0); | |
| 463 | const half: @Vector(vec_len, f32) = @splat(0.5); | |
| 464 | const neg_one: @Vector(vec_len, f32) = @splat(-1.0); | |
| 465 | const two: @Vector(vec_len, f32) = @splat(2.0); | |
| 466 | const c0: @Vector(vec_len, f32) = @splat(0x1.55555ep-3); | |
| 467 | const c1: @Vector(vec_len, f32) = @splat(0x1.33261ap-4); | |
| 468 | const c2: @Vector(vec_len, f32) = @splat(0x1.70d7dcp-5); | |
| 469 | const c3: @Vector(vec_len, f32) = @splat(0x1.b059dp-6); | |
| 470 | const c4: @Vector(vec_len, f32) = @splat(0x1.3af7d8p-5); | |
| 471 | ||
| 472 | const ax = @abs(x); | |
| 473 | const ax_lt_half = ax < half; | |
| 474 | const is_neg = x < zero; | |
| 475 | const z2 = @select(f32, ax_lt_half, x * x, @mulAdd(@Vector(vec_len, f32), -half, ax, half)); | |
| 476 | const z = @select(f32, ax_lt_half, ax, @sqrt(z2)); | |
| 477 | const z3 = z2 * z; | |
| 478 | const p3_4 = @mulAdd(@Vector(vec_len, f32), z2, c4, c3); | |
| 479 | const p2_4 = @mulAdd(@Vector(vec_len, f32), z2, p3_4, c2); | |
| 480 | const p1_4 = @mulAdd(@Vector(vec_len, f32), z2, p2_4, c1); | |
| 481 | const p0_4 = @mulAdd(@Vector(vec_len, f32), z2, p1_4, c0); | |
| 482 | const p = @mulAdd(@Vector(vec_len, f32), z3, p0_4, z); | |
| 483 | const mul = @select(f32, ax_lt_half, neg_one, two); | |
| 484 | const add = @select(f32, ax_lt_half, pi_over_2, @select(f32, is_neg, pi, zero)); | |
| 485 | return @mulAdd(@Vector(vec_len, f32), mul, @select(f32, is_neg, -p, p), add); | |
| 486 | } | |
| 487 | ||
| 488 | fn acosBinary64Vec(comptime vec_len: comptime_int, x: @Vector(vec_len, f64)) @TypeOf(x) { | |
| 489 | const pi: @Vector(vec_len, f64) = @splat(math.pi); | |
| 490 | const pi_over_2: @Vector(vec_len, f64) = @splat(math.pi / 2.0); | |
| 491 | const zero: @Vector(vec_len, f64) = @splat(0.0); | |
| 492 | const half: @Vector(vec_len, f64) = @splat(0.5); | |
| 493 | const neg_one: @Vector(vec_len, f64) = @splat(-1.0); | |
| 494 | const two: @Vector(vec_len, f64) = @splat(2.0); | |
| 495 | const c0: @Vector(vec_len, f64) = @splat(0x1.555555555554ep-3); | |
| 496 | const c1: @Vector(vec_len, f64) = @splat(0x1.3333333337233p-4); | |
| 497 | const c2: @Vector(vec_len, f64) = @splat(0x1.6db6db67f6d9fp-5); | |
| 498 | const c3: @Vector(vec_len, f64) = @splat(0x1.f1c71fbd29fbbp-6); | |
| 499 | const c4: @Vector(vec_len, f64) = @splat(0x1.6e8b264d467d6p-6); | |
| 500 | const c5: @Vector(vec_len, f64) = @splat(0x1.1c5997c357e9dp-6); | |
| 501 | const c6: @Vector(vec_len, f64) = @splat(0x1.c86a22cd9389dp-7); | |
| 502 | const c7: @Vector(vec_len, f64) = @splat(0x1.856073c22ebbep-7); | |
| 503 | const c8: @Vector(vec_len, f64) = @splat(0x1.fd1151acb6bedp-8); | |
| 504 | const c9: @Vector(vec_len, f64) = @splat(0x1.087182f799c1dp-6); | |
| 505 | const c10: @Vector(vec_len, f64) = @splat(-0x1.6602748120927p-7); | |
| 506 | const c11: @Vector(vec_len, f64) = @splat(0x1.cfa0dd1f9478p-6); | |
| 507 | ||
| 508 | const ax = @abs(x); | |
| 509 | const ax_lt_half = ax < half; | |
| 510 | const is_neg = x < zero; | |
| 511 | const z2 = @select(f64, ax_lt_half, x * x, @mulAdd(@Vector(vec_len, f64), -half, ax, half)); | |
| 512 | const z = @select(f64, ax_lt_half, ax, @sqrt(z2)); | |
| 513 | const z3 = z2 * z; | |
| 514 | const z4 = z2 * z2; | |
| 515 | const z8 = z4 * z4; | |
| 516 | const p0_1 = @mulAdd(@Vector(vec_len, f64), z2, c1, c0); | |
| 517 | const p2_3 = @mulAdd(@Vector(vec_len, f64), z2, c3, c2); | |
| 518 | const p0_3 = @mulAdd(@Vector(vec_len, f64), z4, p2_3, p0_1); | |
| 519 | const p4_5 = @mulAdd(@Vector(vec_len, f64), z2, c5, c4); | |
| 520 | const p6_7 = @mulAdd(@Vector(vec_len, f64), z2, c7, c6); | |
| 521 | const p4_7 = @mulAdd(@Vector(vec_len, f64), z4, p6_7, p4_5); | |
| 522 | const p8_9 = @mulAdd(@Vector(vec_len, f64), z2, c9, c8); | |
| 523 | const p10_11 = @mulAdd(@Vector(vec_len, f64), z2, c11, c10); | |
| 524 | const p8_11 = @mulAdd(@Vector(vec_len, f64), z4, p10_11, p8_9); | |
| 525 | const p4_11 = @mulAdd(@Vector(vec_len, f64), z8, p8_11, p4_7); | |
| 526 | const p0_11 = @mulAdd(@Vector(vec_len, f64), z8, p4_11, p0_3); | |
| 527 | const p = @mulAdd(@Vector(vec_len, f64), z3, p0_11, z); | |
| 528 | const mul = @select(f64, ax_lt_half, neg_one, two); | |
| 529 | const add = @select(f64, ax_lt_half, pi_over_2, @select(f64, is_neg, pi, zero)); | |
| 530 | return @mulAdd(@Vector(vec_len, f64), mul, @select(f64, is_neg, -p, p), add); | |
| 531 | } | |
| 532 | ||
| 533 | test "acosBinary32Vec.special" { | |
| 534 | const input: @Vector(8, f32) = .{ | |
| 535 | 0x0p+0, | |
| 536 | -0x1p+0, | |
| 537 | 0x1p+0, | |
| 538 | 0x1.000002p+0, | |
| 539 | -0x1.000002p+0, | |
| 540 | math.inf(f32), | |
| 541 | -math.inf(f32), | |
| 542 | math.nan(f32), | |
| 543 | }; | |
| 544 | const output = acosBinary32Vec(8, input); | |
| 545 | try testing.expectApproxEqAbs(0x1.921fb6p+0, output[0], math.floatEpsAt(f32, 0x1.921fb6p+0)); | |
| 546 | try testing.expectApproxEqAbs(0x1.921fb6p+1, output[1], math.floatEpsAt(f32, 0x1.921fb6p+1)); | |
| 547 | try testing.expectEqual(0x0p+0, output[2]); | |
| 548 | try testing.expect(math.isNan(output[3])); | |
| 549 | try testing.expect(math.isNan(output[4])); | |
| 550 | try testing.expect(math.isNan(output[5])); | |
| 551 | try testing.expect(math.isNan(output[6])); | |
| 552 | try testing.expect(math.isNan(output[7])); | |
| 553 | } | |
| 554 | ||
| 555 | test "acosBinary32Vec" { | |
| 556 | const input: @Vector(10, f32) = .{ | |
| 557 | -0x1.13284cp-2, | |
| 558 | 0x1.6ca8ep-1, | |
| 559 | 0x1.c2ca6p-1, | |
| 560 | -0x1.55f12p-1, | |
| 561 | -0x1.15679ep-2, | |
| 562 | -0x1.41e132p-5, | |
| 563 | 0x1.281b0ep-1, | |
| 564 | 0x1.b5ce34p-1, | |
| 565 | -0x1.583482p-3, | |
| 566 | -0x1.ea8224p-1, | |
| 567 | }; | |
| 568 | const output = acosBinary32Vec(10, input); | |
| 569 | try testing.expectApproxEqAbs(0x1.d7c4e6p+0, output[0], math.floatEpsAt(f32, 0x1.d7c4e6p+0)); | |
| 570 | try testing.expectApproxEqAbs(0x1.8e6756p-1, output[1], math.floatEpsAt(f32, 0x1.8e6756p-1)); | |
| 571 | try testing.expectApproxEqAbs(0x1.f9d74cp-2, output[2], math.floatEpsAt(f32, 0x1.f9d74cp-2)); | |
| 572 | try testing.expectApproxEqAbs(0x1.26abdcp+1, output[3], math.floatEpsAt(f32, 0x1.26abdcp+1)); | |
| 573 | try testing.expectApproxEqAbs(0x1.d85a44p+0, output[4], math.floatEpsAt(f32, 0x1.d85a44p+0)); | |
| 574 | try testing.expectApproxEqAbs(0x1.9c2f68p+0, output[5], math.floatEpsAt(f32, 0x1.9c2f68p+0)); | |
| 575 | try testing.expectApproxEqAbs(0x1.e881bp-1, output[6], math.floatEpsAt(f32, 0x1.e881bp-1)); | |
| 576 | try testing.expectApproxEqAbs(0x1.1713f6p-1, output[7], math.floatEpsAt(f32, 0x1.1713f6p-1)); | |
| 577 | try testing.expectApproxEqAbs(0x1.bd5accp+0, output[8], math.floatEpsAt(f32, 0x1.bd5accp+0)); | |
| 578 | try testing.expectApproxEqAbs(0x1.6ce7d8p+1, output[9], math.floatEpsAt(f32, 0x1.6ce7d8p+1)); | |
| 579 | } | |
| 580 | ||
| 581 | test "acosBinary64Vec.special" { | |
| 582 | const input: @Vector(8, f64) = .{ | |
| 583 | 0x0p+0, | |
| 584 | -0x1p+0, | |
| 585 | 0x1p+0, | |
| 586 | 0x1.0000000000001p+0, | |
| 587 | -0x1.0000000000001p+0, | |
| 588 | math.inf(f64), | |
| 589 | -math.inf(f64), | |
| 590 | math.nan(f64), | |
| 591 | }; | |
| 592 | const output = acosBinary64Vec(8, input); | |
| 593 | try testing.expectApproxEqAbs(0x1.921fb54442d18p+0, output[0], math.floatEpsAt(f64, 0x1.921fb54442d18p+0)); | |
| 594 | try testing.expectApproxEqAbs(0x1.921fb54442d18p+1, output[1], math.floatEpsAt(f64, 0x1.921fb54442d18p+1)); | |
| 595 | try testing.expectEqual(0x0p+0, output[2]); | |
| 596 | try testing.expect(math.isNan(output[3])); | |
| 597 | try testing.expect(math.isNan(output[4])); | |
| 598 | try testing.expect(math.isNan(output[5])); | |
| 599 | try testing.expect(math.isNan(output[6])); | |
| 600 | try testing.expect(math.isNan(output[7])); | |
| 601 | } | |
| 602 | ||
| 603 | test "acosBinary64Vec" { | |
| 604 | const input: @Vector(10, f64) = .{ | |
| 605 | -0x1.13284b2b5006dp-2, | |
| 606 | 0x1.6ca8dfb825911p-1, | |
| 607 | 0x1.c2ca609de7505p-1, | |
| 608 | -0x1.55f11fba96889p-1, | |
| 609 | -0x1.15679e27084ddp-2, | |
| 610 | -0x1.41e131b093c41p-5, | |
| 611 | 0x1.281b0d18455f5p-1, | |
| 612 | 0x1.b5ce34a51b239p-1, | |
| 613 | -0x1.583481079de4dp-3, | |
| 614 | -0x1.ea8223103b871p-1, | |
| 615 | }; | |
| 616 | const output = acosBinary64Vec(10, input); | |
| 617 | try testing.expectApproxEqAbs(0x1.d7c4e61020905p+0, output[0], math.floatEpsAt(f64, 0x1.d7c4e61020905p+0)); | |
| 618 | try testing.expectApproxEqAbs(0x1.8e6756e27c366p-1, output[1], math.floatEpsAt(f64, 0x1.8e6756e27c366p-1)); | |
| 619 | try testing.expectApproxEqAbs(0x1.f9d748eaf956p-2, output[2], math.floatEpsAt(f64, 0x1.f9d748eaf956p-2)); | |
| 620 | try testing.expectApproxEqAbs(0x1.26abdc68d07aap+1, output[3], math.floatEpsAt(f64, 0x1.26abdc68d07aap+1)); | |
| 621 | try testing.expectApproxEqAbs(0x1.d85a44ea44fe4p+0, output[4], math.floatEpsAt(f64, 0x1.d85a44ea44fe4p+0)); | |
| 622 | try testing.expectApproxEqAbs(0x1.9c2f688eee8abp+0, output[5], math.floatEpsAt(f64, 0x1.9c2f688eee8abp+0)); | |
| 623 | try testing.expectApproxEqAbs(0x1.e881b1d4eb2a1p-1, output[6], math.floatEpsAt(f64, 0x1.e881b1d4eb2a1p-1)); | |
| 624 | try testing.expectApproxEqAbs(0x1.1713f567a87efp-1, output[7], math.floatEpsAt(f64, 0x1.1713f567a87efp-1)); | |
| 625 | try testing.expectApproxEqAbs(0x1.bd5acbe8fcc59p+0, output[8], math.floatEpsAt(f64, 0x1.bd5acbe8fcc59p+0)); | |
| 626 | try testing.expectApproxEqAbs(0x1.6ce7d66f628e5p+1, output[9], math.floatEpsAt(f64, 0x1.6ce7d66f628e5p+1)); | |
| 443 | 627 | } |
lib/std/math/asin.zig+258-78| ... | ... | @@ -4,6 +4,12 @@ |
| 4 | 4 | // https://git.musl-libc.org/cgit/musl/tree/src/math/asinf.c |
| 5 | 5 | // https://git.musl-libc.org/cgit/musl/tree/src/math/asin.c |
| 6 | 6 | // https://git.musl-libc.org/cgit/musl/tree/src/math/asinl.c |
| 7 | // | |
| 8 | // Ported from ARM-software, which is licensed under the MIT license: | |
| 9 | // https://github.com/ARM-software/optimized-routines/blob/master/LICENSE | |
| 10 | // | |
| 11 | // https://github.com/ARM-software/optimized-routines/blob/master/math/aarch64/advsimd/asinf.c | |
| 12 | // https://github.com/ARM-software/optimized-routines/blob/master/math/aarch64/advsimd/asin.c | |
| 7 | 13 | |
| 8 | 14 | const std = @import("../std.zig"); |
| 9 | 15 | const math = std.math; |
| ... | ... | @@ -19,14 +25,22 @@ const native_endian = builtin.cpu.arch.endian(); |
| 19 | 25 | /// - asin(x) = nan if x < -1 or x > 1 |
| 20 | 26 | pub fn asin(x: anytype) @TypeOf(x) { |
| 21 | 27 | const T = @TypeOf(x); |
| 22 | return switch (T) { | |
| 23 | f16 => asinBinary16(x), | |
| 24 | f32 => asinBinary32(x), | |
| 25 | f64 => asinBinary64(x), | |
| 26 | f80 => asinExtended80(x), | |
| 27 | f128 => asinBinary128(x), | |
| 28 | else => @compileError("asin not implemented for " ++ @typeName(T)), | |
| 29 | }; | |
| 28 | switch (@typeInfo(T)) { | |
| 29 | .float => |info| switch (info.bits) { | |
| 30 | 16 => return asinBinary16(x), | |
| 31 | 32 => return asinBinary32(x), | |
| 32 | 64 => return asinBinary64(x), | |
| 33 | 80 => return asinExtended80(x), | |
| 34 | 128 => return asinBinary128(x), | |
| 35 | else => comptime unreachable, | |
| 36 | }, | |
| 37 | .vector => |info| switch (info.child) { | |
| 38 | f32 => return asinBinary32Vec(info.len, x), | |
| 39 | f64 => return asinBinary64Vec(info.len, x), | |
| 40 | else => @compileError("unimplemented"), | |
| 41 | }, | |
| 42 | else => comptime unreachable, | |
| 43 | } | |
| 30 | 44 | } |
| 31 | 45 | |
| 32 | 46 | fn approxBinary16(z: f32) f32 { |
| ... | ... | @@ -312,10 +326,10 @@ fn asinBinary128(x: f128) f128 { |
| 312 | 326 | } |
| 313 | 327 | |
| 314 | 328 | test "asinBinary16.special" { |
| 315 | try testing.expectApproxEqAbs(asinBinary16(0x1p+0), 0x1.92p0, math.floatEpsAt(f16, 0x1.92p0)); | |
| 316 | try testing.expectApproxEqAbs(asinBinary16(-0x1p+0), -0x1.92p0, math.floatEpsAt(f16, -0x1.92p0)); | |
| 317 | try testing.expectEqual(asinBinary16(0x0p+0), 0x0p+0); | |
| 318 | try testing.expectEqual(asinBinary16(-0x0p+0), 0x0p+0); | |
| 329 | try testing.expectApproxEqAbs(0x1.92p0, asinBinary16(0x1p+0), math.floatEpsAt(f16, 0x1.92p0)); | |
| 330 | try testing.expectApproxEqAbs(-0x1.92p0, asinBinary16(-0x1p+0), math.floatEpsAt(f16, -0x1.92p0)); | |
| 331 | try testing.expectEqual(0x0p+0, asinBinary16(0x0p+0)); | |
| 332 | try testing.expectEqual(0x0p+0, asinBinary16(-0x0p+0)); | |
| 319 | 333 | try testing.expect(math.isNan(asinBinary16(0x1.004p0))); |
| 320 | 334 | try testing.expect(math.isNan(asinBinary16(-0x1.004p0))); |
| 321 | 335 | try testing.expect(math.isNan(asinBinary16(math.inf(f16)))); |
| ... | ... | @@ -324,23 +338,23 @@ test "asinBinary16.special" { |
| 324 | 338 | } |
| 325 | 339 | |
| 326 | 340 | test "asinBinary16" { |
| 327 | try testing.expectApproxEqAbs(asinBinary16(-0x1.e4cp-6), -0x1.e4cp-6, math.floatEpsAt(f16, -0x1.e4cp-6)); | |
| 328 | try testing.expectApproxEqAbs(asinBinary16(0x1.d68p-1), 0x1.2a8p0, math.floatEpsAt(f16, 0x1.2a8p0)); | |
| 329 | try testing.expectApproxEqAbs(asinBinary16(-0x1.a4cp-1), -0x1.eep-1, math.floatEpsAt(f16, -0x1.eep-1)); | |
| 330 | try testing.expectApproxEqAbs(asinBinary16(-0x1.0a4p-2), -0x1.0d4p-2, math.floatEpsAt(f16, -0x1.0d4p-2)); | |
| 331 | try testing.expectApproxEqAbs(asinBinary16(0x1.28cp-1), 0x1.3c8p-1, math.floatEpsAt(f16, 0x1.3c8p-1)); | |
| 332 | try testing.expectApproxEqAbs(asinBinary16(0x1.284p-3), 0x1.298p-3, math.floatEpsAt(f16, 0x1.298p-3)); | |
| 333 | try testing.expectApproxEqAbs(asinBinary16(-0x1.574p-1), -0x1.784p-1, math.floatEpsAt(f16, -0x1.784p-1)); | |
| 334 | try testing.expectApproxEqAbs(asinBinary16(-0x1.4ccp-1), -0x1.6a4p-1, math.floatEpsAt(f16, -0x1.6a4p-1)); | |
| 335 | try testing.expectApproxEqAbs(asinBinary16(0x1.a18p-1), 0x1.e84p-1, math.floatEpsAt(f16, 0x1.e84p-1)); | |
| 336 | try testing.expectApproxEqAbs(asinBinary16(0x1.7a8p-2), 0x1.83cp-2, math.floatEpsAt(f16, 0x1.83cp-2)); | |
| 341 | try testing.expectApproxEqAbs(-0x1.e4cp-6, asinBinary16(-0x1.e4cp-6), math.floatEpsAt(f16, -0x1.e4cp-6)); | |
| 342 | try testing.expectApproxEqAbs(0x1.2a8p0, asinBinary16(0x1.d68p-1), math.floatEpsAt(f16, 0x1.2a8p0)); | |
| 343 | try testing.expectApproxEqAbs(-0x1.eep-1, asinBinary16(-0x1.a4cp-1), math.floatEpsAt(f16, -0x1.eep-1)); | |
| 344 | try testing.expectApproxEqAbs(-0x1.0d4p-2, asinBinary16(-0x1.0a4p-2), math.floatEpsAt(f16, -0x1.0d4p-2)); | |
| 345 | try testing.expectApproxEqAbs(0x1.3c8p-1, asinBinary16(0x1.28cp-1), math.floatEpsAt(f16, 0x1.3c8p-1)); | |
| 346 | try testing.expectApproxEqAbs(0x1.298p-3, asinBinary16(0x1.284p-3), math.floatEpsAt(f16, 0x1.298p-3)); | |
| 347 | try testing.expectApproxEqAbs(-0x1.784p-1, asinBinary16(-0x1.574p-1), math.floatEpsAt(f16, -0x1.784p-1)); | |
| 348 | try testing.expectApproxEqAbs(-0x1.6a4p-1, asinBinary16(-0x1.4ccp-1), math.floatEpsAt(f16, -0x1.6a4p-1)); | |
| 349 | try testing.expectApproxEqAbs(0x1.e84p-1, asinBinary16(0x1.a18p-1), math.floatEpsAt(f16, 0x1.e84p-1)); | |
| 350 | try testing.expectApproxEqAbs(0x1.83cp-2, asinBinary16(0x1.7a8p-2), math.floatEpsAt(f16, 0x1.83cp-2)); | |
| 337 | 351 | } |
| 338 | 352 | |
| 339 | 353 | test "asinBinary32.special" { |
| 340 | try testing.expectApproxEqAbs(asinBinary32(0x1p+0), 0x1.921fb6p+0, math.floatEpsAt(f32, 0x1.921fb6p+0)); | |
| 341 | try testing.expectApproxEqAbs(asinBinary32(-0x1p+0), -0x1.921fb6p+0, math.floatEpsAt(f32, -0x1.921fb6p+0)); | |
| 342 | try testing.expectEqual(asinBinary32(0x0p+0), 0x0p+0); | |
| 343 | try testing.expectEqual(asinBinary32(-0x0p+0), 0x0p+0); | |
| 354 | try testing.expectApproxEqAbs(0x1.921fb6p+0, asinBinary32(0x1p+0), math.floatEpsAt(f32, 0x1.921fb6p+0)); | |
| 355 | try testing.expectApproxEqAbs(-0x1.921fb6p+0, asinBinary32(-0x1p+0), math.floatEpsAt(f32, -0x1.921fb6p+0)); | |
| 356 | try testing.expectEqual(0x0p+0, asinBinary32(0x0p+0)); | |
| 357 | try testing.expectEqual(0x0p+0, asinBinary32(-0x0p+0)); | |
| 344 | 358 | try testing.expect(math.isNan(asinBinary32(0x1.000002p+0))); |
| 345 | 359 | try testing.expect(math.isNan(asinBinary32(-0x1.000002p+0))); |
| 346 | 360 | try testing.expect(math.isNan(asinBinary32(math.inf(f32)))); |
| ... | ... | @@ -349,23 +363,23 @@ test "asinBinary32.special" { |
| 349 | 363 | } |
| 350 | 364 | |
| 351 | 365 | test "asinBinary32" { |
| 352 | try testing.expectApproxEqAbs(asinBinary32(-0x1.4c2906p-4), -0x1.4c868p-4, math.floatEpsAt(f32, -0x1.4c868p-4)); | |
| 353 | try testing.expectApproxEqAbs(asinBinary32(0x1.05fcfap-1), 0x1.130648p-1, math.floatEpsAt(f32, 0x1.130648p-1)); | |
| 354 | try testing.expectApproxEqAbs(asinBinary32(0x1.fab976p-2), 0x1.090abcp-1, math.floatEpsAt(f32, 0x1.090abcp-1)); | |
| 355 | try testing.expectApproxEqAbs(asinBinary32(0x1.8b4b8cp-1), 0x1.c39fa2p-1, math.floatEpsAt(f32, 0x1.c39fa2p-1)); | |
| 356 | try testing.expectApproxEqAbs(asinBinary32(0x1.7117c2p-1), 0x1.9c332p-1, math.floatEpsAt(f32, 0x1.9c332p-1)); | |
| 357 | try testing.expectApproxEqAbs(asinBinary32(0x1.e5e112p-5), 0x1.e62a1cp-5, math.floatEpsAt(f32, 0x1.e62a1cp-5)); | |
| 358 | try testing.expectApproxEqAbs(asinBinary32(-0x1.07673p-2), -0x1.0a65dep-2, math.floatEpsAt(f32, -0x1.0a65dep-2)); | |
| 359 | try testing.expectApproxEqAbs(asinBinary32(-0x1.2108dep-2), -0x1.25046p-2, math.floatEpsAt(f32, -0x1.25046p-2)); | |
| 360 | try testing.expectApproxEqAbs(asinBinary32(-0x1.4e6e6cp-1), -0x1.6c6f0cp-1, math.floatEpsAt(f32, -0x1.6c6f0cp-1)); | |
| 361 | try testing.expectApproxEqAbs(asinBinary32(0x1.22a16ap-1), 0x1.350f7ap-1, math.floatEpsAt(f32, 0x1.350f7ap-1)); | |
| 366 | try testing.expectApproxEqAbs(-0x1.4c868p-4, asinBinary32(-0x1.4c2906p-4), math.floatEpsAt(f32, -0x1.4c868p-4)); | |
| 367 | try testing.expectApproxEqAbs(0x1.130648p-1, asinBinary32(0x1.05fcfap-1), math.floatEpsAt(f32, 0x1.130648p-1)); | |
| 368 | try testing.expectApproxEqAbs(0x1.090abcp-1, asinBinary32(0x1.fab976p-2), math.floatEpsAt(f32, 0x1.090abcp-1)); | |
| 369 | try testing.expectApproxEqAbs(0x1.c39fa2p-1, asinBinary32(0x1.8b4b8cp-1), math.floatEpsAt(f32, 0x1.c39fa2p-1)); | |
| 370 | try testing.expectApproxEqAbs(0x1.9c332p-1, asinBinary32(0x1.7117c2p-1), math.floatEpsAt(f32, 0x1.9c332p-1)); | |
| 371 | try testing.expectApproxEqAbs(0x1.e62a1cp-5, asinBinary32(0x1.e5e112p-5), math.floatEpsAt(f32, 0x1.e62a1cp-5)); | |
| 372 | try testing.expectApproxEqAbs(-0x1.0a65dep-2, asinBinary32(-0x1.07673p-2), math.floatEpsAt(f32, -0x1.0a65dep-2)); | |
| 373 | try testing.expectApproxEqAbs(-0x1.25046p-2, asinBinary32(-0x1.2108dep-2), math.floatEpsAt(f32, -0x1.25046p-2)); | |
| 374 | try testing.expectApproxEqAbs(-0x1.6c6f0cp-1, asinBinary32(-0x1.4e6e6cp-1), math.floatEpsAt(f32, -0x1.6c6f0cp-1)); | |
| 375 | try testing.expectApproxEqAbs(0x1.350f7ap-1, asinBinary32(0x1.22a16ap-1), math.floatEpsAt(f32, 0x1.350f7ap-1)); | |
| 362 | 376 | } |
| 363 | 377 | |
| 364 | 378 | test "asinBinary64.special" { |
| 365 | try testing.expectApproxEqAbs(asinBinary64(0x1p+0), 0x1.921fb54442d18p+0, math.floatEpsAt(f64, 0x1.921fb54442d18p+0)); | |
| 366 | try testing.expectApproxEqAbs(asinBinary64(-0x1p+0), -0x1.921fb54442d18p+0, math.floatEpsAt(f64, -0x1.921fb54442d18p+0)); | |
| 367 | try testing.expectEqual(asinBinary64(0x0p+0), 0x0p+0); | |
| 368 | try testing.expectEqual(asinBinary64(-0x0p+0), 0x0p+0); | |
| 379 | try testing.expectApproxEqAbs(0x1.921fb54442d18p+0, asinBinary64(0x1p+0), math.floatEpsAt(f64, 0x1.921fb54442d18p+0)); | |
| 380 | try testing.expectApproxEqAbs(-0x1.921fb54442d18p+0, asinBinary64(-0x1p+0), math.floatEpsAt(f64, -0x1.921fb54442d18p+0)); | |
| 381 | try testing.expectEqual(0x0p+0, asinBinary64(0x0p+0)); | |
| 382 | try testing.expectEqual(0x0p+0, asinBinary64(-0x0p+0)); | |
| 369 | 383 | try testing.expect(math.isNan(asinBinary64(0x1.000002p+0))); |
| 370 | 384 | try testing.expect(math.isNan(asinBinary64(-0x1.000002p+0))); |
| 371 | 385 | try testing.expect(math.isNan(asinBinary64(math.inf(f64)))); |
| ... | ... | @@ -374,23 +388,23 @@ test "asinBinary64.special" { |
| 374 | 388 | } |
| 375 | 389 | |
| 376 | 390 | test "asinBinary64" { |
| 377 | try testing.expectApproxEqAbs(asinBinary64(0x1.e674fba3e40d5p-2), 0x1.fae86c5941692p-2, math.floatEpsAt(f64, 0x1.fae86c5941692p-2)); | |
| 378 | try testing.expectApproxEqAbs(asinBinary64(-0x1.30fd0566fd979p-1), -0x1.46b6ad730c93ap-1, math.floatEpsAt(f64, -0x1.46b6ad730c93ap-1)); | |
| 379 | try testing.expectApproxEqAbs(asinBinary64(0x1.6444a25abfeaap-2), 0x1.6be0be8074eep-2, math.floatEpsAt(f64, 0x1.6be0be8074eep-2)); | |
| 380 | try testing.expectApproxEqAbs(asinBinary64(0x1.40a53228d1a13p-1), 0x1.5a7e98f53f717p-1, math.floatEpsAt(f64, 0x1.5a7e98f53f717p-1)); | |
| 381 | try testing.expectApproxEqAbs(asinBinary64(-0x1.ccc6d64845cfdp-1), -0x1.1ea2602d14e8p0, math.floatEpsAt(f64, -0x1.1ea2602d14e8p0)); | |
| 382 | try testing.expectApproxEqAbs(asinBinary64(-0x1.94bd91b7fc74bp-1), -0x1.d2c2634193158p-1, math.floatEpsAt(f64, -0x1.d2c2634193158p-1)); | |
| 383 | try testing.expectApproxEqAbs(asinBinary64(-0x1.8d741b5797fccp-2), -0x1.982d5f1895d2p-2, math.floatEpsAt(f64, -0x1.982d5f1895d2p-2)); | |
| 384 | try testing.expectApproxEqAbs(asinBinary64(-0x1.3e8e7e15881c5p-3), -0x1.3fdaf7dfdc864p-3, math.floatEpsAt(f64, -0x1.3fdaf7dfdc864p-3)); | |
| 385 | try testing.expectApproxEqAbs(asinBinary64(-0x1.88222d8ab8ca9p-2), -0x1.9269540735b7bp-2, math.floatEpsAt(f64, -0x1.9269540735b7bp-2)); | |
| 386 | try testing.expectApproxEqAbs(asinBinary64(-0x1.41c0e9babcbd2p-2), -0x1.474c4c6625527p-2, math.floatEpsAt(f64, -0x1.474c4c6625527p-2)); | |
| 391 | try testing.expectApproxEqAbs(0x1.fae86c5941692p-2, asinBinary64(0x1.e674fba3e40d5p-2), math.floatEpsAt(f64, 0x1.fae86c5941692p-2)); | |
| 392 | try testing.expectApproxEqAbs(-0x1.46b6ad730c93ap-1, asinBinary64(-0x1.30fd0566fd979p-1), math.floatEpsAt(f64, -0x1.46b6ad730c93ap-1)); | |
| 393 | try testing.expectApproxEqAbs(0x1.6be0be8074eep-2, asinBinary64(0x1.6444a25abfeaap-2), math.floatEpsAt(f64, 0x1.6be0be8074eep-2)); | |
| 394 | try testing.expectApproxEqAbs(0x1.5a7e98f53f717p-1, asinBinary64(0x1.40a53228d1a13p-1), math.floatEpsAt(f64, 0x1.5a7e98f53f717p-1)); | |
| 395 | try testing.expectApproxEqAbs(-0x1.1ea2602d14e8p0, asinBinary64(-0x1.ccc6d64845cfdp-1), math.floatEpsAt(f64, -0x1.1ea2602d14e8p0)); | |
| 396 | try testing.expectApproxEqAbs(-0x1.d2c2634193158p-1, asinBinary64(-0x1.94bd91b7fc74bp-1), math.floatEpsAt(f64, -0x1.d2c2634193158p-1)); | |
| 397 | try testing.expectApproxEqAbs(-0x1.982d5f1895d2p-2, asinBinary64(-0x1.8d741b5797fccp-2), math.floatEpsAt(f64, -0x1.982d5f1895d2p-2)); | |
| 398 | try testing.expectApproxEqAbs(-0x1.3fdaf7dfdc864p-3, asinBinary64(-0x1.3e8e7e15881c5p-3), math.floatEpsAt(f64, -0x1.3fdaf7dfdc864p-3)); | |
| 399 | try testing.expectApproxEqAbs(-0x1.9269540735b7bp-2, asinBinary64(-0x1.88222d8ab8ca9p-2), math.floatEpsAt(f64, -0x1.9269540735b7bp-2)); | |
| 400 | try testing.expectApproxEqAbs(-0x1.474c4c6625527p-2, asinBinary64(-0x1.41c0e9babcbd2p-2), math.floatEpsAt(f64, -0x1.474c4c6625527p-2)); | |
| 387 | 401 | } |
| 388 | 402 | |
| 389 | 403 | test "asinExtended80.special" { |
| 390 | try testing.expectApproxEqAbs(asinExtended80(0x1p+0), 0x1.921fb54442d1846ap+0, math.floatEpsAt(f80, 0x1.921fb54442d1846ap+0)); | |
| 391 | try testing.expectApproxEqAbs(asinExtended80(-0x1p+0), -0x1.921fb54442d1846ap+0, math.floatEpsAt(f80, -0x1.921fb54442d1846ap+0)); | |
| 392 | try testing.expectEqual(asinExtended80(0x0p+0), 0x0p+0); | |
| 393 | try testing.expectEqual(asinExtended80(-0x0p+0), 0x0p+0); | |
| 404 | try testing.expectApproxEqAbs(0x1.921fb54442d1846ap+0, asinExtended80(0x1p+0), math.floatEpsAt(f80, 0x1.921fb54442d1846ap+0)); | |
| 405 | try testing.expectApproxEqAbs(-0x1.921fb54442d1846ap+0, asinExtended80(-0x1p+0), math.floatEpsAt(f80, -0x1.921fb54442d1846ap+0)); | |
| 406 | try testing.expectEqual(0x0p+0, asinExtended80(0x0p+0)); | |
| 407 | try testing.expectEqual(0x0p+0, asinExtended80(-0x0p+0)); | |
| 394 | 408 | try testing.expect(math.isNan(asinExtended80(0x1.0000000000000002p+0))); |
| 395 | 409 | try testing.expect(math.isNan(asinExtended80(-0x1.0000000000000002p+0))); |
| 396 | 410 | try testing.expect(math.isNan(asinExtended80(math.inf(f80)))); |
| ... | ... | @@ -399,23 +413,23 @@ test "asinExtended80.special" { |
| 399 | 413 | } |
| 400 | 414 | |
| 401 | 415 | test "asinExtended80" { |
| 402 | try testing.expectApproxEqAbs(asinExtended80(0x1.63cf98bc52ce0da8p-9), 0x1.63cfb560149daa9p-9, math.floatEpsAt(f80, 0x1.63cfb560149daa9p-9)); | |
| 403 | try testing.expectApproxEqAbs(asinExtended80(-0x1.0473756f7ae930dp-1), -0x1.113cbacd8cd1b96cp-1, math.floatEpsAt(f80, -0x1.113cbacd8cd1b96cp-1)); | |
| 404 | try testing.expectApproxEqAbs(asinExtended80(-0x1.2310057e005cc288p-2), -0x1.2721b231d197b064p-2, math.floatEpsAt(f80, -0x1.2721b231d197b064p-2)); | |
| 405 | try testing.expectApproxEqAbs(asinExtended80(0x1.f13b03bd685d96eap-1), 0x1.547c408c5d2b05aap0, math.floatEpsAt(f80, 0x1.547c408c5d2b05aap0)); | |
| 406 | try testing.expectApproxEqAbs(asinExtended80(-0x1.d5c507e3ef84041cp-1), -0x1.296b76bfadbb5cecp0, math.floatEpsAt(f80, -0x1.296b76bfadbb5cecp0)); | |
| 407 | try testing.expectApproxEqAbs(asinExtended80(0x1.8222cbc9147153d8p-1), 0x1.b572da8729a84f2ap-1, math.floatEpsAt(f80, 0x1.b572da8729a84f2ap-1)); | |
| 408 | try testing.expectApproxEqAbs(asinExtended80(-0x1.42c9e6b4a088a246p-11), -0x1.42c9e80ac0524dap-11, math.floatEpsAt(f80, -0x1.42c9e80ac0524dap-11)); | |
| 409 | try testing.expectApproxEqAbs(asinExtended80(-0x1.8f78d49deadb521cp-3), -0x1.920ca86aef6c3028p-3, math.floatEpsAt(f80, -0x1.920ca86aef6c3028p-3)); | |
| 410 | try testing.expectApproxEqAbs(asinExtended80(-0x1.ab98792783515774p-2), -0x1.b91cb4f7204d92fp-2, math.floatEpsAt(f80, -0x1.b91cb4f7204d92fp-2)); | |
| 411 | try testing.expectApproxEqAbs(asinExtended80(-0x1.104fe30cef6800aap-1), -0x1.1f20815fdc4c5304p-1, math.floatEpsAt(f80, -0x1.1f20815fdc4c5304p-1)); | |
| 416 | try testing.expectApproxEqAbs(0x1.63cfb560149daa9p-9, asinExtended80(0x1.63cf98bc52ce0da8p-9), math.floatEpsAt(f80, 0x1.63cfb560149daa9p-9)); | |
| 417 | try testing.expectApproxEqAbs(-0x1.113cbacd8cd1b96cp-1, asinExtended80(-0x1.0473756f7ae930dp-1), math.floatEpsAt(f80, -0x1.113cbacd8cd1b96cp-1)); | |
| 418 | try testing.expectApproxEqAbs(-0x1.2721b231d197b064p-2, asinExtended80(-0x1.2310057e005cc288p-2), math.floatEpsAt(f80, -0x1.2721b231d197b064p-2)); | |
| 419 | try testing.expectApproxEqAbs(0x1.547c408c5d2b05aap0, asinExtended80(0x1.f13b03bd685d96eap-1), math.floatEpsAt(f80, 0x1.547c408c5d2b05aap0)); | |
| 420 | try testing.expectApproxEqAbs(-0x1.296b76bfadbb5cecp0, asinExtended80(-0x1.d5c507e3ef84041cp-1), math.floatEpsAt(f80, -0x1.296b76bfadbb5cecp0)); | |
| 421 | try testing.expectApproxEqAbs(0x1.b572da8729a84f2ap-1, asinExtended80(0x1.8222cbc9147153d8p-1), math.floatEpsAt(f80, 0x1.b572da8729a84f2ap-1)); | |
| 422 | try testing.expectApproxEqAbs(-0x1.42c9e80ac0524dap-11, asinExtended80(-0x1.42c9e6b4a088a246p-11), math.floatEpsAt(f80, -0x1.42c9e80ac0524dap-11)); | |
| 423 | try testing.expectApproxEqAbs(-0x1.920ca86aef6c3028p-3, asinExtended80(-0x1.8f78d49deadb521cp-3), math.floatEpsAt(f80, -0x1.920ca86aef6c3028p-3)); | |
| 424 | try testing.expectApproxEqAbs(-0x1.b91cb4f7204d92fp-2, asinExtended80(-0x1.ab98792783515774p-2), math.floatEpsAt(f80, -0x1.b91cb4f7204d92fp-2)); | |
| 425 | try testing.expectApproxEqAbs(-0x1.1f20815fdc4c5304p-1, asinExtended80(-0x1.104fe30cef6800aap-1), math.floatEpsAt(f80, -0x1.1f20815fdc4c5304p-1)); | |
| 412 | 426 | } |
| 413 | 427 | |
| 414 | 428 | test "asinBinary128.special" { |
| 415 | try testing.expectApproxEqAbs(asinBinary128(0x1p+0), 0x1.921fb54442d18469898cc51701b8p0, math.floatEpsAt(f128, 0x1.921fb54442d18469898cc51701b8p0)); | |
| 416 | try testing.expectApproxEqAbs(asinBinary128(-0x1p+0), -0x1.921fb54442d18469898cc51701b8p0, math.floatEpsAt(f128, -0x1.921fb54442d18469898cc51701b8p0)); | |
| 417 | try testing.expectEqual(asinBinary128(0x0p+0), 0x0p+0); | |
| 418 | try testing.expectEqual(asinBinary128(-0x0p+0), 0x0p+0); | |
| 429 | try testing.expectApproxEqAbs(0x1.921fb54442d18469898cc51701b8p0, asinBinary128(0x1p+0), math.floatEpsAt(f128, 0x1.921fb54442d18469898cc51701b8p0)); | |
| 430 | try testing.expectApproxEqAbs(-0x1.921fb54442d18469898cc51701b8p0, asinBinary128(-0x1p+0), math.floatEpsAt(f128, -0x1.921fb54442d18469898cc51701b8p0)); | |
| 431 | try testing.expectEqual(0x0p+0, asinBinary128(0x0p+0)); | |
| 432 | try testing.expectEqual(0x0p+0, asinBinary128(-0x0p+0)); | |
| 419 | 433 | try testing.expect(math.isNan(asinBinary128(0x1.0000000000000000000000000001p0))); |
| 420 | 434 | try testing.expect(math.isNan(asinBinary128(-0x1.0000000000000000000000000001p0))); |
| 421 | 435 | try testing.expect(math.isNan(asinBinary128(math.inf(f128)))); |
| ... | ... | @@ -424,14 +438,180 @@ test "asinBinary128.special" { |
| 424 | 438 | } |
| 425 | 439 | |
| 426 | 440 | test "asinBinary128" { |
| 427 | try testing.expectApproxEqAbs(asinBinary128(0x1.85868ce287ca0196b01c25fec5ffp-3), 0x1.87e9c740d7837f8e8fa667988fbep-3, math.floatEpsAt(f128, 0x1.87e9c740d7837f8e8fa667988fbep-3)); | |
| 428 | try testing.expectApproxEqAbs(asinBinary128(0x1.8718d6d30b4daed08d04ef59f478p-1), 0x1.bd11a474e864213b48e0f005f1f4p-1, math.floatEpsAt(f128, 0x1.bd11a474e864213b48e0f005f1f4p-1)); | |
| 429 | try testing.expectApproxEqAbs(asinBinary128(0x1.11a67640cd7f0ba5d5e362f3abfap-1), 0x1.20b56f8b42649fe72d1f8d68a378p-1, math.floatEpsAt(f128, 0x1.20b56f8b42649fe72d1f8d68a378p-1)); | |
| 430 | try testing.expectApproxEqAbs(asinBinary128(-0x1.bd13bf14a9dce22188e52650daa7p-1), -0x1.0dc3a7ddb9736e5ad699bf338566p0, math.floatEpsAt(f128, -0x1.0dc3a7ddb9736e5ad699bf338566p0)); | |
| 431 | try testing.expectApproxEqAbs(asinBinary128(-0x1.dee0bc217fc462af57c484eefa71p-2), -0x1.f250716038f70fa50a5826c03802p-2, math.floatEpsAt(f128, -0x1.f250716038f70fa50a5826c03802p-2)); | |
| 432 | try testing.expectApproxEqAbs(asinBinary128(-0x1.ea7df9139371c10b9d6fd2bbccd3p-1), -0x1.47a8b4cdd327f90056722feddbabp0, math.floatEpsAt(f128, -0x1.47a8b4cdd327f90056722feddbabp0)); | |
| 433 | try testing.expectApproxEqAbs(asinBinary128(0x1.04aaea6de3b5a616460702f26dfcp-2), 0x1.079178d52be662dec67e2cd7f6e9p-2, math.floatEpsAt(f128, 0x1.079178d52be662dec67e2cd7f6e9p-2)); | |
| 434 | try testing.expectApproxEqAbs(asinBinary128(-0x1.c7ea85e6b61be666435a7d99444cp-1), -0x1.192df5a8d71702cf1e27014887b2p0, math.floatEpsAt(f128, -0x1.192df5a8d71702cf1e27014887b2p0)); | |
| 435 | try testing.expectApproxEqAbs(asinBinary128(-0x1.6e210214e40edf6c8479998189d1p-1), -0x1.97f1092fd94ac0fdfddae2e1222bp-1, math.floatEpsAt(f128, -0x1.97f1092fd94ac0fdfddae2e1222bp-1)); | |
| 436 | try testing.expectApproxEqAbs(asinBinary128(-0x1.95061bf93ed6986a45d20f0e1064p-3), -0x1.97b62bc5ae6512093828828325e1p-3, math.floatEpsAt(f128, -0x1.97b62bc5ae6512093828828325e1p-3)); | |
| 441 | try testing.expectApproxEqAbs(0x1.87e9c740d7837f8e8fa667988fbep-3, asinBinary128(0x1.85868ce287ca0196b01c25fec5ffp-3), math.floatEpsAt(f128, 0x1.87e9c740d7837f8e8fa667988fbep-3)); | |
| 442 | try testing.expectApproxEqAbs(0x1.bd11a474e864213b48e0f005f1f4p-1, asinBinary128(0x1.8718d6d30b4daed08d04ef59f478p-1), math.floatEpsAt(f128, 0x1.bd11a474e864213b48e0f005f1f4p-1)); | |
| 443 | try testing.expectApproxEqAbs(0x1.20b56f8b42649fe72d1f8d68a378p-1, asinBinary128(0x1.11a67640cd7f0ba5d5e362f3abfap-1), math.floatEpsAt(f128, 0x1.20b56f8b42649fe72d1f8d68a378p-1)); | |
| 444 | try testing.expectApproxEqAbs(-0x1.0dc3a7ddb9736e5ad699bf338566p0, asinBinary128(-0x1.bd13bf14a9dce22188e52650daa7p-1), math.floatEpsAt(f128, -0x1.0dc3a7ddb9736e5ad699bf338566p0)); | |
| 445 | try testing.expectApproxEqAbs(-0x1.f250716038f70fa50a5826c03802p-2, asinBinary128(-0x1.dee0bc217fc462af57c484eefa71p-2), math.floatEpsAt(f128, -0x1.f250716038f70fa50a5826c03802p-2)); | |
| 446 | try testing.expectApproxEqAbs(-0x1.47a8b4cdd327f90056722feddbabp0, asinBinary128(-0x1.ea7df9139371c10b9d6fd2bbccd3p-1), math.floatEpsAt(f128, -0x1.47a8b4cdd327f90056722feddbabp0)); | |
| 447 | try testing.expectApproxEqAbs(0x1.079178d52be662dec67e2cd7f6e9p-2, asinBinary128(0x1.04aaea6de3b5a616460702f26dfcp-2), math.floatEpsAt(f128, 0x1.079178d52be662dec67e2cd7f6e9p-2)); | |
| 448 | try testing.expectApproxEqAbs(-0x1.192df5a8d71702cf1e27014887b2p0, asinBinary128(-0x1.c7ea85e6b61be666435a7d99444cp-1), math.floatEpsAt(f128, -0x1.192df5a8d71702cf1e27014887b2p0)); | |
| 449 | try testing.expectApproxEqAbs(-0x1.97f1092fd94ac0fdfddae2e1222bp-1, asinBinary128(-0x1.6e210214e40edf6c8479998189d1p-1), math.floatEpsAt(f128, -0x1.97f1092fd94ac0fdfddae2e1222bp-1)); | |
| 450 | try testing.expectApproxEqAbs(-0x1.97b62bc5ae6512093828828325e1p-3, asinBinary128(-0x1.95061bf93ed6986a45d20f0e1064p-3), math.floatEpsAt(f128, -0x1.97b62bc5ae6512093828828325e1p-3)); | |
| 451 | } | |
| 452 | ||
| 453 | fn asinBinary32Vec(comptime vec_len: comptime_int, x: @Vector(vec_len, f32)) @TypeOf(x) { | |
| 454 | const pi_over_2: @Vector(vec_len, f32) = @splat(math.pi / 2.0); | |
| 455 | const zero: @Vector(vec_len, f32) = @splat(0.0); | |
| 456 | const half: @Vector(vec_len, f32) = @splat(0.5); | |
| 457 | const neg_two: @Vector(vec_len, f32) = @splat(-2.0); | |
| 458 | const c0: @Vector(vec_len, f32) = @splat(0x1.55555ep-3); | |
| 459 | const c1: @Vector(vec_len, f32) = @splat(0x1.33261ap-4); | |
| 460 | const c2: @Vector(vec_len, f32) = @splat(0x1.70d7dcp-5); | |
| 461 | const c3: @Vector(vec_len, f32) = @splat(0x1.b059dp-6); | |
| 462 | const c4: @Vector(vec_len, f32) = @splat(0x1.3af7d8p-5); | |
| 463 | ||
| 464 | const ax = @abs(x); | |
| 465 | const ax_lt_half = ax < half; | |
| 466 | const z2 = @select(f32, ax_lt_half, x * x, @mulAdd(@Vector(vec_len, f32), -half, ax, half)); | |
| 467 | const z = @select(f32, ax_lt_half, ax, @sqrt(z2)); | |
| 468 | const z3 = z2 * z; | |
| 469 | const p3_4 = @mulAdd(@Vector(vec_len, f32), z2, c4, c3); | |
| 470 | const p2_4 = @mulAdd(@Vector(vec_len, f32), z2, p3_4, c2); | |
| 471 | const p1_4 = @mulAdd(@Vector(vec_len, f32), z2, p2_4, c1); | |
| 472 | const p0_4 = @mulAdd(@Vector(vec_len, f32), z2, p1_4, c0); | |
| 473 | const p = @mulAdd(@Vector(vec_len, f32), z3, p0_4, z); | |
| 474 | const y = @select(f32, ax_lt_half, p, @mulAdd(@Vector(vec_len, f32), p, neg_two, pi_over_2)); | |
| 475 | return @select(f32, x < zero, -y, y); | |
| 476 | } | |
| 477 | ||
| 478 | fn asinBinary64Vec(comptime vec_len: comptime_int, x: @Vector(vec_len, f64)) @TypeOf(x) { | |
| 479 | const pi_over_2: @Vector(vec_len, f64) = @splat(math.pi / 2.0); | |
| 480 | const zero: @Vector(vec_len, f64) = @splat(0.0); | |
| 481 | const half: @Vector(vec_len, f64) = @splat(0.5); | |
| 482 | const neg_two: @Vector(vec_len, f64) = @splat(-2.0); | |
| 483 | const c0: @Vector(vec_len, f64) = @splat(0x1.555555555554ep-3); | |
| 484 | const c1: @Vector(vec_len, f64) = @splat(0x1.3333333337233p-4); | |
| 485 | const c2: @Vector(vec_len, f64) = @splat(0x1.6db6db67f6d9fp-5); | |
| 486 | const c3: @Vector(vec_len, f64) = @splat(0x1.f1c71fbd29fbbp-6); | |
| 487 | const c4: @Vector(vec_len, f64) = @splat(0x1.6e8b264d467d6p-6); | |
| 488 | const c5: @Vector(vec_len, f64) = @splat(0x1.1c5997c357e9dp-6); | |
| 489 | const c6: @Vector(vec_len, f64) = @splat(0x1.c86a22cd9389dp-7); | |
| 490 | const c7: @Vector(vec_len, f64) = @splat(0x1.856073c22ebbep-7); | |
| 491 | const c8: @Vector(vec_len, f64) = @splat(0x1.fd1151acb6bedp-8); | |
| 492 | const c9: @Vector(vec_len, f64) = @splat(0x1.087182f799c1dp-6); | |
| 493 | const c10: @Vector(vec_len, f64) = @splat(-0x1.6602748120927p-7); | |
| 494 | const c11: @Vector(vec_len, f64) = @splat(0x1.cfa0dd1f9478p-6); | |
| 495 | ||
| 496 | const ax = @abs(x); | |
| 497 | const ax_lt_half = ax < half; | |
| 498 | const z2 = @select(f64, ax_lt_half, x * x, @mulAdd(@Vector(vec_len, f64), -half, ax, half)); | |
| 499 | const z = @select(f64, ax_lt_half, ax, @sqrt(z2)); | |
| 500 | const z3 = z2 * z; | |
| 501 | const z4 = z2 * z2; | |
| 502 | const z8 = z4 * z4; | |
| 503 | const p0_1 = @mulAdd(@Vector(vec_len, f64), z2, c1, c0); | |
| 504 | const p2_3 = @mulAdd(@Vector(vec_len, f64), z2, c3, c2); | |
| 505 | const p0_3 = @mulAdd(@Vector(vec_len, f64), z4, p2_3, p0_1); | |
| 506 | const p4_5 = @mulAdd(@Vector(vec_len, f64), z2, c5, c4); | |
| 507 | const p6_7 = @mulAdd(@Vector(vec_len, f64), z2, c7, c6); | |
| 508 | const p4_7 = @mulAdd(@Vector(vec_len, f64), z4, p6_7, p4_5); | |
| 509 | const p8_9 = @mulAdd(@Vector(vec_len, f64), z2, c9, c8); | |
| 510 | const p10_11 = @mulAdd(@Vector(vec_len, f64), z2, c11, c10); | |
| 511 | const p8_11 = @mulAdd(@Vector(vec_len, f64), z4, p10_11, p8_9); | |
| 512 | const p4_11 = @mulAdd(@Vector(vec_len, f64), z8, p8_11, p4_7); | |
| 513 | const p0_11 = @mulAdd(@Vector(vec_len, f64), z8, p4_11, p0_3); | |
| 514 | const p = @mulAdd(@Vector(vec_len, f64), z3, p0_11, z); | |
| 515 | const y = @select(f64, ax_lt_half, p, @mulAdd(@Vector(vec_len, f64), p, neg_two, pi_over_2)); | |
| 516 | return @select(f64, x < zero, -y, y); | |
| 517 | } | |
| 518 | ||
| 519 | test "asinBinary32Vec.special" { | |
| 520 | const input: @Vector(9, f32) = .{ | |
| 521 | 0x1p+0, | |
| 522 | -0x1p+0, | |
| 523 | 0x0p+0, | |
| 524 | -0x0p+0, | |
| 525 | 0x1.000002p+0, | |
| 526 | -0x1.000002p+0, | |
| 527 | math.inf(f32), | |
| 528 | -math.inf(f32), | |
| 529 | math.nan(f32), | |
| 530 | }; | |
| 531 | const output = asinBinary32Vec(9, input); | |
| 532 | try testing.expectApproxEqAbs(0x1.921fb6p+0, output[0], math.floatEpsAt(f32, 0x1.921fb6p+0)); | |
| 533 | try testing.expectApproxEqAbs(-0x1.921fb6p+0, output[1], math.floatEpsAt(f32, -0x1.921fb6p+0)); | |
| 534 | try testing.expectEqual(0x0p+0, output[2]); | |
| 535 | try testing.expectEqual(0x0p+0, output[3]); | |
| 536 | try testing.expect(math.isNan(output[4])); | |
| 537 | try testing.expect(math.isNan(output[5])); | |
| 538 | try testing.expect(math.isNan(output[6])); | |
| 539 | try testing.expect(math.isNan(output[7])); | |
| 540 | try testing.expect(math.isNan(output[8])); | |
| 541 | } | |
| 542 | ||
| 543 | test "asinBinary32Vec" { | |
| 544 | const input: @Vector(10, f32) = .{ | |
| 545 | -0x1.4c2906p-4, | |
| 546 | 0x1.05fcfap-1, | |
| 547 | 0x1.fab976p-2, | |
| 548 | 0x1.8b4b8cp-1, | |
| 549 | 0x1.7117c2p-1, | |
| 550 | 0x1.e5e112p-5, | |
| 551 | -0x1.07673p-2, | |
| 552 | -0x1.2108dep-2, | |
| 553 | -0x1.4e6e6cp-1, | |
| 554 | 0x1.22a16ap-1, | |
| 555 | }; | |
| 556 | const output = asinBinary32Vec(10, input); | |
| 557 | try testing.expectApproxEqAbs(-0x1.4c868p-4, output[0], math.floatEpsAt(f32, -0x1.4c868p-4)); | |
| 558 | try testing.expectApproxEqAbs(0x1.130648p-1, output[1], math.floatEpsAt(f32, 0x1.130648p-1)); | |
| 559 | try testing.expectApproxEqAbs(0x1.090abcp-1, output[2], math.floatEpsAt(f32, 0x1.090abcp-1)); | |
| 560 | try testing.expectApproxEqAbs(0x1.c39fa2p-1, output[3], math.floatEpsAt(f32, 0x1.c39fa2p-1)); | |
| 561 | try testing.expectApproxEqAbs(0x1.9c332p-1, output[4], math.floatEpsAt(f32, 0x1.9c332p-1)); | |
| 562 | try testing.expectApproxEqAbs(0x1.e62a1cp-5, output[5], math.floatEpsAt(f32, 0x1.e62a1cp-5)); | |
| 563 | try testing.expectApproxEqAbs(-0x1.0a65dep-2, output[6], math.floatEpsAt(f32, -0x1.0a65dep-2)); | |
| 564 | try testing.expectApproxEqAbs(-0x1.25046p-2, output[7], math.floatEpsAt(f32, -0x1.25046p-2)); | |
| 565 | try testing.expectApproxEqAbs(-0x1.6c6f0cp-1, output[8], math.floatEpsAt(f32, -0x1.6c6f0cp-1)); | |
| 566 | try testing.expectApproxEqAbs(0x1.350f7ap-1, output[9], math.floatEpsAt(f32, 0x1.350f7ap-1)); | |
| 567 | } | |
| 568 | ||
| 569 | test "asinBinary64Vec.special" { | |
| 570 | const input: @Vector(9, f64) = .{ | |
| 571 | 0x1p+0, | |
| 572 | -0x1p+0, | |
| 573 | 0x0p+0, | |
| 574 | -0x0p+0, | |
| 575 | 0x1.000002p+0, | |
| 576 | -0x1.000002p+0, | |
| 577 | math.inf(f64), | |
| 578 | -math.inf(f64), | |
| 579 | math.nan(f64), | |
| 580 | }; | |
| 581 | const output = asinBinary64Vec(9, input); | |
| 582 | try testing.expectApproxEqAbs(0x1.921fb54442d18p+0, output[0], math.floatEpsAt(f64, 0x1.921fb54442d18p+0)); | |
| 583 | try testing.expectApproxEqAbs(-0x1.921fb54442d18p+0, output[1], math.floatEpsAt(f64, -0x1.921fb54442d18p+0)); | |
| 584 | try testing.expectEqual(0x0p+0, output[2]); | |
| 585 | try testing.expectEqual(0x0p+0, output[3]); | |
| 586 | try testing.expect(math.isNan(output[4])); | |
| 587 | try testing.expect(math.isNan(output[5])); | |
| 588 | try testing.expect(math.isNan(output[6])); | |
| 589 | try testing.expect(math.isNan(output[7])); | |
| 590 | try testing.expect(math.isNan(output[8])); | |
| 591 | } | |
| 592 | ||
| 593 | test "asinBinary64Vec" { | |
| 594 | const input: @Vector(10, f64) = .{ | |
| 595 | 0x1.e674fba3e40d5p-2, | |
| 596 | -0x1.30fd0566fd979p-1, | |
| 597 | 0x1.6444a25abfeaap-2, | |
| 598 | 0x1.40a53228d1a13p-1, | |
| 599 | -0x1.ccc6d64845cfdp-1, | |
| 600 | -0x1.94bd91b7fc74bp-1, | |
| 601 | -0x1.8d741b5797fccp-2, | |
| 602 | -0x1.3e8e7e15881c5p-3, | |
| 603 | -0x1.88222d8ab8ca9p-2, | |
| 604 | -0x1.41c0e9babcbd2p-2, | |
| 605 | }; | |
| 606 | const output = asinBinary64Vec(10, input); | |
| 607 | try testing.expectApproxEqAbs(0x1.fae86c5941692p-2, output[0], math.floatEpsAt(f64, 0x1.fae86c5941692p-2)); | |
| 608 | try testing.expectApproxEqAbs(-0x1.46b6ad730c93ap-1, output[1], math.floatEpsAt(f64, -0x1.46b6ad730c93ap-1)); | |
| 609 | try testing.expectApproxEqAbs(0x1.6be0be8074eep-2, output[2], math.floatEpsAt(f64, 0x1.6be0be8074eep-2)); | |
| 610 | try testing.expectApproxEqAbs(0x1.5a7e98f53f717p-1, output[3], math.floatEpsAt(f64, 0x1.5a7e98f53f717p-1)); | |
| 611 | try testing.expectApproxEqAbs(-0x1.1ea2602d14e8p0, output[4], math.floatEpsAt(f64, -0x1.1ea2602d14e8p0)); | |
| 612 | try testing.expectApproxEqAbs(-0x1.d2c2634193158p-1, output[5], math.floatEpsAt(f64, -0x1.d2c2634193158p-1)); | |
| 613 | try testing.expectApproxEqAbs(-0x1.982d5f1895d2p-2, output[6], math.floatEpsAt(f64, -0x1.982d5f1895d2p-2)); | |
| 614 | try testing.expectApproxEqAbs(-0x1.3fdaf7dfdc864p-3, output[7], math.floatEpsAt(f64, -0x1.3fdaf7dfdc864p-3)); | |
| 615 | try testing.expectApproxEqAbs(-0x1.9269540735b7bp-2, output[8], math.floatEpsAt(f64, -0x1.9269540735b7bp-2)); | |
| 616 | try testing.expectApproxEqAbs(-0x1.474c4c6625527p-2, output[9], math.floatEpsAt(f64, -0x1.474c4c6625527p-2)); | |
| 437 | 617 | } |
lib/std/math/atan.zig+112-112| ... | ... | @@ -480,118 +480,118 @@ fn atanBinary128(x: f128) f128 { |
| 480 | 480 | } |
| 481 | 481 | |
| 482 | 482 | test "atanBinary16.special" { |
| 483 | try testing.expectEqual(atanBinary16(0x0p+0), 0x0p+0); | |
| 484 | try testing.expectEqual(atanBinary16(-0x0p+0), -0x0p+0); | |
| 485 | try testing.expectApproxEqAbs(atanBinary16(0x1p+0), 0x1.92p-1, math.floatEpsAt(f16, 0x1.92p-1)); | |
| 486 | try testing.expectApproxEqAbs(atanBinary16(-0x1p+0), -0x1.92p-1, math.floatEpsAt(f16, -0x1.92p-1)); | |
| 487 | try testing.expectApproxEqAbs(atanBinary16(math.inf(f16)), 0x1.92p0, math.floatEpsAt(f16, 0x1.92p0)); | |
| 488 | try testing.expectApproxEqAbs(atanBinary16(-math.inf(f16)), -0x1.92p0, math.floatEpsAt(f16, -0x1.92p0)); | |
| 483 | try testing.expectEqual(0x0p+0, atanBinary16(0x0p+0)); | |
| 484 | try testing.expectEqual(-0x0p+0, atanBinary16(-0x0p+0)); | |
| 485 | try testing.expectApproxEqAbs(0x1.92p-1, atanBinary16(0x1p+0), math.floatEpsAt(f16, 0x1.92p-1)); | |
| 486 | try testing.expectApproxEqAbs(-0x1.92p-1, atanBinary16(-0x1p+0), math.floatEpsAt(f16, -0x1.92p-1)); | |
| 487 | try testing.expectApproxEqAbs(0x1.92p0, atanBinary16(math.inf(f16)), math.floatEpsAt(f16, 0x1.92p0)); | |
| 488 | try testing.expectApproxEqAbs(-0x1.92p0, atanBinary16(-math.inf(f16)), math.floatEpsAt(f16, -0x1.92p0)); | |
| 489 | 489 | try testing.expect(math.isNan(atanBinary16(math.nan(f16)))); |
| 490 | 490 | } |
| 491 | 491 | |
| 492 | 492 | test "atanBinary16" { |
| 493 | try testing.expectApproxEqAbs(atanBinary16(-0x1.864p-2), -0x1.74cp-2, math.floatEpsAt(f16, -0x1.74cp-2)); | |
| 494 | try testing.expectApproxEqAbs(atanBinary16(-0x1.59cp1), -0x1.374p0, math.floatEpsAt(f16, -0x1.374p0)); | |
| 495 | try testing.expectApproxEqAbs(atanBinary16(-0x1.d2cp0), -0x1.11cp0, math.floatEpsAt(f16, -0x1.11cp0)); | |
| 496 | try testing.expectApproxEqAbs(atanBinary16(-0x1.5f4p-1), -0x1.33cp-1, math.floatEpsAt(f16, -0x1.33cp-1)); | |
| 497 | try testing.expectApproxEqAbs(atanBinary16(0x1.588p1), 0x1.37p0, math.floatEpsAt(f16, 0x1.37p0)); | |
| 498 | try testing.expectApproxEqAbs(atanBinary16(-0x1.b14p-2), -0x1.99cp-2, math.floatEpsAt(f16, -0x1.99cp-2)); | |
| 499 | try testing.expectApproxEqAbs(atanBinary16(0x1.3ccp1), 0x1.2fcp0, math.floatEpsAt(f16, 0x1.2fcp0)); | |
| 500 | try testing.expectApproxEqAbs(atanBinary16(-0x1.0ecp-2), -0x1.08cp-2, math.floatEpsAt(f16, -0x1.08cp-2)); | |
| 501 | try testing.expectApproxEqAbs(atanBinary16(0x1.298p1), 0x1.2ap0, math.floatEpsAt(f16, 0x1.2ap0)); | |
| 502 | try testing.expectApproxEqAbs(atanBinary16(-0x1.028p1), -0x1.1c8p0, math.floatEpsAt(f16, -0x1.1c8p0)); | |
| 493 | try testing.expectApproxEqAbs(-0x1.74cp-2, atanBinary16(-0x1.864p-2), math.floatEpsAt(f16, -0x1.74cp-2)); | |
| 494 | try testing.expectApproxEqAbs(-0x1.374p0, atanBinary16(-0x1.59cp1), math.floatEpsAt(f16, -0x1.374p0)); | |
| 495 | try testing.expectApproxEqAbs(-0x1.11cp0, atanBinary16(-0x1.d2cp0), math.floatEpsAt(f16, -0x1.11cp0)); | |
| 496 | try testing.expectApproxEqAbs(-0x1.33cp-1, atanBinary16(-0x1.5f4p-1), math.floatEpsAt(f16, -0x1.33cp-1)); | |
| 497 | try testing.expectApproxEqAbs(0x1.37p0, atanBinary16(0x1.588p1), math.floatEpsAt(f16, 0x1.37p0)); | |
| 498 | try testing.expectApproxEqAbs(-0x1.99cp-2, atanBinary16(-0x1.b14p-2), math.floatEpsAt(f16, -0x1.99cp-2)); | |
| 499 | try testing.expectApproxEqAbs(0x1.2fcp0, atanBinary16(0x1.3ccp1), math.floatEpsAt(f16, 0x1.2fcp0)); | |
| 500 | try testing.expectApproxEqAbs(-0x1.08cp-2, atanBinary16(-0x1.0ecp-2), math.floatEpsAt(f16, -0x1.08cp-2)); | |
| 501 | try testing.expectApproxEqAbs(0x1.2ap0, atanBinary16(0x1.298p1), math.floatEpsAt(f16, 0x1.2ap0)); | |
| 502 | try testing.expectApproxEqAbs(-0x1.1c8p0, atanBinary16(-0x1.028p1), math.floatEpsAt(f16, -0x1.1c8p0)); | |
| 503 | 503 | } |
| 504 | 504 | |
| 505 | 505 | test "atanBinary32.special" { |
| 506 | try testing.expectEqual(atanBinary32(0x0p+0), 0x0p+0); | |
| 507 | try testing.expectEqual(atanBinary32(-0x0p+0), -0x0p+0); | |
| 508 | try testing.expectApproxEqAbs(atanBinary32(0x1p+0), 0x1.921fb6p-1, math.floatEpsAt(f32, 0x1.921fb6p-1)); | |
| 509 | try testing.expectApproxEqAbs(atanBinary32(-0x1p+0), -0x1.921fb6p-1, math.floatEpsAt(f32, -0x1.921fb6p-1)); | |
| 510 | try testing.expectApproxEqAbs(atanBinary32(math.inf(f32)), 0x1.921fb6p+0, math.floatEpsAt(f32, 0x1.921fb6p+0)); | |
| 511 | try testing.expectApproxEqAbs(atanBinary32(-math.inf(f32)), -0x1.921fb6p+0, math.floatEpsAt(f32, -0x1.921fb6p+0)); | |
| 506 | try testing.expectEqual(0x0p+0, atanBinary32(0x0p+0)); | |
| 507 | try testing.expectEqual(-0x0p+0, atanBinary32(-0x0p+0)); | |
| 508 | try testing.expectApproxEqAbs(0x1.921fb6p-1, atanBinary32(0x1p+0), math.floatEpsAt(f32, 0x1.921fb6p-1)); | |
| 509 | try testing.expectApproxEqAbs(-0x1.921fb6p-1, atanBinary32(-0x1p+0), math.floatEpsAt(f32, -0x1.921fb6p-1)); | |
| 510 | try testing.expectApproxEqAbs(0x1.921fb6p+0, atanBinary32(math.inf(f32)), math.floatEpsAt(f32, 0x1.921fb6p+0)); | |
| 511 | try testing.expectApproxEqAbs(-0x1.921fb6p+0, atanBinary32(-math.inf(f32)), math.floatEpsAt(f32, -0x1.921fb6p+0)); | |
| 512 | 512 | try testing.expect(math.isNan(atanBinary32(math.nan(f32)))); |
| 513 | 513 | } |
| 514 | 514 | |
| 515 | 515 | test "atanBinary32" { |
| 516 | try testing.expectApproxEqAbs(atanBinary32(-0x1.8629dp-2), -0x1.74c62p-2, math.floatEpsAt(f32, -0x1.74c62p-2)); | |
| 517 | try testing.expectApproxEqAbs(atanBinary32(-0x1.59d42ep1), -0x1.375fd8p0, math.floatEpsAt(f32, -0x1.375fd8p0)); | |
| 518 | try testing.expectApproxEqAbs(atanBinary32(-0x1.d2dbe2p0), -0x1.11b8aep0, math.floatEpsAt(f32, -0x1.11b8aep0)); | |
| 519 | try testing.expectApproxEqAbs(atanBinary32(-0x1.5f314ep-1), -0x1.33d28cp-1, math.floatEpsAt(f32, -0x1.33d28cp-1)); | |
| 520 | try testing.expectApproxEqAbs(atanBinary32(0x1.5869bp1), 0x1.37082ep0, math.floatEpsAt(f32, 0x1.37082ep0)); | |
| 521 | try testing.expectApproxEqAbs(atanBinary32(-0x1.b13a06p-2), -0x1.99d7cap-2, math.floatEpsAt(f32, -0x1.99d7cap-2)); | |
| 522 | try testing.expectApproxEqAbs(atanBinary32(0x1.3cb0f2p1), 0x1.2fcb12p0, math.floatEpsAt(f32, 0x1.2fcb12p0)); | |
| 523 | try testing.expectApproxEqAbs(atanBinary32(-0x1.0ed746p-2), -0x1.08c71ap-2, math.floatEpsAt(f32, -0x1.08c71ap-2)); | |
| 524 | try testing.expectApproxEqAbs(atanBinary32(0x1.299d54p1), 0x1.2a24e2p0, math.floatEpsAt(f32, 0x1.2a24e2p0)); | |
| 525 | try testing.expectApproxEqAbs(atanBinary32(-0x1.0264fcp1), -0x1.1c6178p0, math.floatEpsAt(f32, -0x1.1c6178p0)); | |
| 516 | try testing.expectApproxEqAbs(-0x1.74c62p-2, atanBinary32(-0x1.8629dp-2), math.floatEpsAt(f32, -0x1.74c62p-2)); | |
| 517 | try testing.expectApproxEqAbs(-0x1.375fd8p0, atanBinary32(-0x1.59d42ep1), math.floatEpsAt(f32, -0x1.375fd8p0)); | |
| 518 | try testing.expectApproxEqAbs(-0x1.11b8aep0, atanBinary32(-0x1.d2dbe2p0), math.floatEpsAt(f32, -0x1.11b8aep0)); | |
| 519 | try testing.expectApproxEqAbs(-0x1.33d28cp-1, atanBinary32(-0x1.5f314ep-1), math.floatEpsAt(f32, -0x1.33d28cp-1)); | |
| 520 | try testing.expectApproxEqAbs(0x1.37082ep0, atanBinary32(0x1.5869bp1), math.floatEpsAt(f32, 0x1.37082ep0)); | |
| 521 | try testing.expectApproxEqAbs(-0x1.99d7cap-2, atanBinary32(-0x1.b13a06p-2), math.floatEpsAt(f32, -0x1.99d7cap-2)); | |
| 522 | try testing.expectApproxEqAbs(0x1.2fcb12p0, atanBinary32(0x1.3cb0f2p1), math.floatEpsAt(f32, 0x1.2fcb12p0)); | |
| 523 | try testing.expectApproxEqAbs(-0x1.08c71ap-2, atanBinary32(-0x1.0ed746p-2), math.floatEpsAt(f32, -0x1.08c71ap-2)); | |
| 524 | try testing.expectApproxEqAbs(0x1.2a24e2p0, atanBinary32(0x1.299d54p1), math.floatEpsAt(f32, 0x1.2a24e2p0)); | |
| 525 | try testing.expectApproxEqAbs(-0x1.1c6178p0, atanBinary32(-0x1.0264fcp1), math.floatEpsAt(f32, -0x1.1c6178p0)); | |
| 526 | 526 | } |
| 527 | 527 | |
| 528 | 528 | test "atanBinary64.special" { |
| 529 | try testing.expectEqual(atanBinary64(0x0p+0), 0x0p+0); | |
| 530 | try testing.expectEqual(atanBinary64(-0x0p+0), -0x0p+0); | |
| 531 | try testing.expectApproxEqAbs(atanBinary64(0x1p+0), 0x1.921fb54442d18p-1, math.floatEpsAt(f64, 0x1.921fb54442d18p-1)); | |
| 532 | try testing.expectApproxEqAbs(atanBinary64(-0x1p+0), -0x1.921fb54442d18p-1, math.floatEpsAt(f64, -0x1.921fb54442d18p-1)); | |
| 533 | try testing.expectApproxEqAbs(atanBinary64(math.inf(f64)), 0x1.921fb54442d18p+0, math.floatEpsAt(f64, 0x1.921fb54442d18p+0)); | |
| 534 | try testing.expectApproxEqAbs(atanBinary64(-math.inf(f64)), -0x1.921fb54442d18p+0, math.floatEpsAt(f64, -0x1.921fb54442d18p+0)); | |
| 529 | try testing.expectEqual(0x0p+0, atanBinary64(0x0p+0)); | |
| 530 | try testing.expectEqual(-0x0p+0, atanBinary64(-0x0p+0)); | |
| 531 | try testing.expectApproxEqAbs(0x1.921fb54442d18p-1, atanBinary64(0x1p+0), math.floatEpsAt(f64, 0x1.921fb54442d18p-1)); | |
| 532 | try testing.expectApproxEqAbs(-0x1.921fb54442d18p-1, atanBinary64(-0x1p+0), math.floatEpsAt(f64, -0x1.921fb54442d18p-1)); | |
| 533 | try testing.expectApproxEqAbs(0x1.921fb54442d18p+0, atanBinary64(math.inf(f64)), math.floatEpsAt(f64, 0x1.921fb54442d18p+0)); | |
| 534 | try testing.expectApproxEqAbs(-0x1.921fb54442d18p+0, atanBinary64(-math.inf(f64)), math.floatEpsAt(f64, -0x1.921fb54442d18p+0)); | |
| 535 | 535 | try testing.expect(math.isNan(atanBinary64(math.nan(f64)))); |
| 536 | 536 | } |
| 537 | 537 | |
| 538 | 538 | test "atanBinary64" { |
| 539 | try testing.expectApproxEqAbs(atanBinary64(-0x1.8629d0244cdccp-2), -0x1.74c61f4377016p-2, math.floatEpsAt(f64, -0x1.74c61f4377016p-2)); | |
| 540 | try testing.expectApproxEqAbs(atanBinary64(-0x1.59d42d4659937p1), -0x1.375fd7987cc2p0, math.floatEpsAt(f64, -0x1.375fd7987cc2p0)); | |
| 541 | try testing.expectApproxEqAbs(atanBinary64(-0x1.d2dbe23d04f06p0), -0x1.11b8adeba5616p0, math.floatEpsAt(f64, -0x1.11b8adeba5616p0)); | |
| 542 | try testing.expectApproxEqAbs(atanBinary64(-0x1.5f314e72398e8p-1), -0x1.33d28ca762539p-1, math.floatEpsAt(f64, -0x1.33d28ca762539p-1)); | |
| 543 | try testing.expectApproxEqAbs(atanBinary64(0x1.5869af37b7d08p1), 0x1.37082ce2dd03p0, math.floatEpsAt(f64, 0x1.37082ce2dd03p0)); | |
| 544 | try testing.expectApproxEqAbs(atanBinary64(-0x1.b13a05a662618p-2), -0x1.99d7cac66dd44p-2, math.floatEpsAt(f64, -0x1.99d7cac66dd44p-2)); | |
| 545 | try testing.expectApproxEqAbs(atanBinary64(0x1.3cb0f12f39d8ap1), 0x1.2fcb120468e8ep0, math.floatEpsAt(f64, 0x1.2fcb120468e8ep0)); | |
| 546 | try testing.expectApproxEqAbs(atanBinary64(-0x1.0ed746b39cbb7p-2), -0x1.08c71aa0e509p-2, math.floatEpsAt(f64, -0x1.08c71aa0e509p-2)); | |
| 547 | try testing.expectApproxEqAbs(atanBinary64(0x1.299d54ac7d6bp1), 0x1.2a24e22d861dfp0, math.floatEpsAt(f64, 0x1.2a24e22d861dfp0)); | |
| 548 | try testing.expectApproxEqAbs(atanBinary64(-0x1.0264fb9f3d50ep1), -0x1.1c617825f9751p0, math.floatEpsAt(f64, -0x1.1c617825f9751p0)); | |
| 539 | try testing.expectApproxEqAbs(-0x1.74c61f4377016p-2, atanBinary64(-0x1.8629d0244cdccp-2), math.floatEpsAt(f64, -0x1.74c61f4377016p-2)); | |
| 540 | try testing.expectApproxEqAbs(-0x1.375fd7987cc2p0, atanBinary64(-0x1.59d42d4659937p1), math.floatEpsAt(f64, -0x1.375fd7987cc2p0)); | |
| 541 | try testing.expectApproxEqAbs(-0x1.11b8adeba5616p0, atanBinary64(-0x1.d2dbe23d04f06p0), math.floatEpsAt(f64, -0x1.11b8adeba5616p0)); | |
| 542 | try testing.expectApproxEqAbs(-0x1.33d28ca762539p-1, atanBinary64(-0x1.5f314e72398e8p-1), math.floatEpsAt(f64, -0x1.33d28ca762539p-1)); | |
| 543 | try testing.expectApproxEqAbs(0x1.37082ce2dd03p0, atanBinary64(0x1.5869af37b7d08p1), math.floatEpsAt(f64, 0x1.37082ce2dd03p0)); | |
| 544 | try testing.expectApproxEqAbs(-0x1.99d7cac66dd44p-2, atanBinary64(-0x1.b13a05a662618p-2), math.floatEpsAt(f64, -0x1.99d7cac66dd44p-2)); | |
| 545 | try testing.expectApproxEqAbs(0x1.2fcb120468e8ep0, atanBinary64(0x1.3cb0f12f39d8ap1), math.floatEpsAt(f64, 0x1.2fcb120468e8ep0)); | |
| 546 | try testing.expectApproxEqAbs(-0x1.08c71aa0e509p-2, atanBinary64(-0x1.0ed746b39cbb7p-2), math.floatEpsAt(f64, -0x1.08c71aa0e509p-2)); | |
| 547 | try testing.expectApproxEqAbs(0x1.2a24e22d861dfp0, atanBinary64(0x1.299d54ac7d6bp1), math.floatEpsAt(f64, 0x1.2a24e22d861dfp0)); | |
| 548 | try testing.expectApproxEqAbs(-0x1.1c617825f9751p0, atanBinary64(-0x1.0264fb9f3d50ep1), math.floatEpsAt(f64, -0x1.1c617825f9751p0)); | |
| 549 | 549 | } |
| 550 | 550 | |
| 551 | 551 | test "atanExtended80.special" { |
| 552 | try testing.expectEqual(atanExtended80(0x0p+0), 0x0p+0); | |
| 553 | try testing.expectEqual(atanExtended80(-0x0p+0), -0x0p+0); | |
| 554 | try testing.expectApproxEqAbs(atanExtended80(0x1p+0), 0x1.921fb54442d1846ap-1, math.floatEpsAt(f80, 0x1.921fb54442d1846ap-1)); | |
| 555 | try testing.expectApproxEqAbs(atanExtended80(-0x1p+0), -0x1.921fb54442d1846ap-1, math.floatEpsAt(f80, -0x1.921fb54442d1846ap-1)); | |
| 556 | try testing.expectApproxEqAbs(atanExtended80(math.inf(f80)), 0x1.921fb54442d1846ap0, math.floatEpsAt(f80, 0x1.921fb54442d1846ap0)); | |
| 557 | try testing.expectApproxEqAbs(atanExtended80(-math.inf(f80)), -0x1.921fb54442d1846ap0, math.floatEpsAt(f80, -0x1.921fb54442d1846ap0)); | |
| 552 | try testing.expectEqual(0x0p+0, atanExtended80(0x0p+0)); | |
| 553 | try testing.expectEqual(-0x0p+0, atanExtended80(-0x0p+0)); | |
| 554 | try testing.expectApproxEqAbs(0x1.921fb54442d1846ap-1, atanExtended80(0x1p+0), math.floatEpsAt(f80, 0x1.921fb54442d1846ap-1)); | |
| 555 | try testing.expectApproxEqAbs(-0x1.921fb54442d1846ap-1, atanExtended80(-0x1p+0), math.floatEpsAt(f80, -0x1.921fb54442d1846ap-1)); | |
| 556 | try testing.expectApproxEqAbs(0x1.921fb54442d1846ap0, atanExtended80(math.inf(f80)), math.floatEpsAt(f80, 0x1.921fb54442d1846ap0)); | |
| 557 | try testing.expectApproxEqAbs(-0x1.921fb54442d1846ap0, atanExtended80(-math.inf(f80)), math.floatEpsAt(f80, -0x1.921fb54442d1846ap0)); | |
| 558 | 558 | try testing.expect(math.isNan(atanExtended80(math.nan(f80)))); |
| 559 | 559 | } |
| 560 | 560 | |
| 561 | 561 | test "atanExtended80" { |
| 562 | try testing.expectApproxEqAbs(atanExtended80(-0x1.8629d0244cdcbed8p-2), -0x1.74c61f437701661p-2, math.floatEpsAt(f80, -0x1.74c61f437701661p-2)); | |
| 563 | try testing.expectApproxEqAbs(atanExtended80(-0x1.59d42d4659936d9ep1), -0x1.375fd7987cc1fd02p0, math.floatEpsAt(f80, -0x1.375fd7987cc1fd02p0)); | |
| 564 | try testing.expectApproxEqAbs(atanExtended80(-0x1.d2dbe23d04f067b4p0), -0x1.11b8adeba5615e04p0, math.floatEpsAt(f80, -0x1.11b8adeba5615e04p0)); | |
| 565 | try testing.expectApproxEqAbs(atanExtended80(-0x1.5f314e72398e7dbcp-1), -0x1.33d28ca76253964cp-1, math.floatEpsAt(f80, -0x1.33d28ca76253964cp-1)); | |
| 566 | try testing.expectApproxEqAbs(atanExtended80(0x1.5869af37b7d078cap1), 0x1.37082ce2dd03010cp0, math.floatEpsAt(f80, 0x1.37082ce2dd03010cp0)); | |
| 567 | try testing.expectApproxEqAbs(atanExtended80(-0x1.b13a05a66261821ap-2), -0x1.99d7cac66dd4438p-2, math.floatEpsAt(f80, -0x1.99d7cac66dd4438p-2)); | |
| 568 | try testing.expectApproxEqAbs(atanExtended80(0x1.3cb0f12f39d899cp1), 0x1.2fcb120468e8d9ecp0, math.floatEpsAt(f80, 0x1.2fcb120468e8d9ecp0)); | |
| 569 | try testing.expectApproxEqAbs(atanExtended80(-0x1.0ed746b39cbb7614p-2), -0x1.08c71aa0e5090998p-2, math.floatEpsAt(f80, -0x1.08c71aa0e5090998p-2)); | |
| 570 | try testing.expectApproxEqAbs(atanExtended80(0x1.299d54ac7d6afc52p1), 0x1.2a24e22d861debfep0, math.floatEpsAt(f80, 0x1.2a24e22d861debfep0)); | |
| 571 | try testing.expectApproxEqAbs(atanExtended80(-0x1.0264fb9f3d50e4fp1), -0x1.1c617825f97512b8p0, math.floatEpsAt(f80, -0x1.1c617825f97512b8p0)); | |
| 562 | try testing.expectApproxEqAbs(-0x1.74c61f437701661p-2, atanExtended80(-0x1.8629d0244cdcbed8p-2), math.floatEpsAt(f80, -0x1.74c61f437701661p-2)); | |
| 563 | try testing.expectApproxEqAbs(-0x1.375fd7987cc1fd02p0, atanExtended80(-0x1.59d42d4659936d9ep1), math.floatEpsAt(f80, -0x1.375fd7987cc1fd02p0)); | |
| 564 | try testing.expectApproxEqAbs(-0x1.11b8adeba5615e04p0, atanExtended80(-0x1.d2dbe23d04f067b4p0), math.floatEpsAt(f80, -0x1.11b8adeba5615e04p0)); | |
| 565 | try testing.expectApproxEqAbs(-0x1.33d28ca76253964cp-1, atanExtended80(-0x1.5f314e72398e7dbcp-1), math.floatEpsAt(f80, -0x1.33d28ca76253964cp-1)); | |
| 566 | try testing.expectApproxEqAbs(0x1.37082ce2dd03010cp0, atanExtended80(0x1.5869af37b7d078cap1), math.floatEpsAt(f80, 0x1.37082ce2dd03010cp0)); | |
| 567 | try testing.expectApproxEqAbs(-0x1.99d7cac66dd4438p-2, atanExtended80(-0x1.b13a05a66261821ap-2), math.floatEpsAt(f80, -0x1.99d7cac66dd4438p-2)); | |
| 568 | try testing.expectApproxEqAbs(0x1.2fcb120468e8d9ecp0, atanExtended80(0x1.3cb0f12f39d899cp1), math.floatEpsAt(f80, 0x1.2fcb120468e8d9ecp0)); | |
| 569 | try testing.expectApproxEqAbs(-0x1.08c71aa0e5090998p-2, atanExtended80(-0x1.0ed746b39cbb7614p-2), math.floatEpsAt(f80, -0x1.08c71aa0e5090998p-2)); | |
| 570 | try testing.expectApproxEqAbs(0x1.2a24e22d861debfep0, atanExtended80(0x1.299d54ac7d6afc52p1), math.floatEpsAt(f80, 0x1.2a24e22d861debfep0)); | |
| 571 | try testing.expectApproxEqAbs(-0x1.1c617825f97512b8p0, atanExtended80(-0x1.0264fb9f3d50e4fp1), math.floatEpsAt(f80, -0x1.1c617825f97512b8p0)); | |
| 572 | 572 | } |
| 573 | 573 | |
| 574 | 574 | test "atanBinary128.special" { |
| 575 | try testing.expectEqual(atanBinary128(0x0p+0), 0x0p+0); | |
| 576 | try testing.expectEqual(atanBinary128(-0x0p+0), -0x0p+0); | |
| 577 | try testing.expectApproxEqAbs(atanBinary128(0x1p+0), 0x1.921fb54442d18469898cc51701b8p-1, math.floatEpsAt(f128, 0x1.921fb54442d18469898cc51701b8p-1)); | |
| 578 | try testing.expectApproxEqAbs(atanBinary128(-0x1p+0), -0x1.921fb54442d18469898cc51701b8p-1, math.floatEpsAt(f128, -0x1.921fb54442d18469898cc51701b8p-1)); | |
| 579 | try testing.expectApproxEqAbs(atanBinary128(math.inf(f128)), 0x1.921fb54442d18469898cc51701b8p0, math.floatEpsAt(f128, 0x1.921fb54442d18469898cc51701b8p0)); | |
| 580 | try testing.expectApproxEqAbs(atanBinary128(-math.inf(f128)), -0x1.921fb54442d18469898cc51701b8p0, math.floatEpsAt(f128, -0x1.921fb54442d18469898cc51701b8p0)); | |
| 575 | try testing.expectEqual(0x0p+0, atanBinary128(0x0p+0)); | |
| 576 | try testing.expectEqual(-0x0p+0, atanBinary128(-0x0p+0)); | |
| 577 | try testing.expectApproxEqAbs(0x1.921fb54442d18469898cc51701b8p-1, atanBinary128(0x1p+0), math.floatEpsAt(f128, 0x1.921fb54442d18469898cc51701b8p-1)); | |
| 578 | try testing.expectApproxEqAbs(-0x1.921fb54442d18469898cc51701b8p-1, atanBinary128(-0x1p+0), math.floatEpsAt(f128, -0x1.921fb54442d18469898cc51701b8p-1)); | |
| 579 | try testing.expectApproxEqAbs(0x1.921fb54442d18469898cc51701b8p0, atanBinary128(math.inf(f128)), math.floatEpsAt(f128, 0x1.921fb54442d18469898cc51701b8p0)); | |
| 580 | try testing.expectApproxEqAbs(-0x1.921fb54442d18469898cc51701b8p0, atanBinary128(-math.inf(f128)), math.floatEpsAt(f128, -0x1.921fb54442d18469898cc51701b8p0)); | |
| 581 | 581 | try testing.expect(math.isNan(atanBinary128(math.nan(f128)))); |
| 582 | 582 | } |
| 583 | 583 | |
| 584 | 584 | test "atanBinary128" { |
| 585 | try testing.expectApproxEqAbs(atanBinary128(-0x1.8629d0244cdcbed71792ccdec26dp-2), -0x1.74c61f437701660ff76989d23707p-2, math.floatEpsAt(f128, -0x1.74c61f437701660ff76989d23707p-2)); | |
| 586 | try testing.expectApproxEqAbs(atanBinary128(-0x1.59d42d4659936d9e22b5dea4faefp1), -0x1.375fd7987cc1fd0119cf0cc5b708p0, math.floatEpsAt(f128, -0x1.375fd7987cc1fd0119cf0cc5b708p0)); | |
| 587 | try testing.expectApproxEqAbs(atanBinary128(-0x1.d2dbe23d04f067b42da3f8efdf57p0), -0x1.11b8adeba5615e0370722b511231p0, math.floatEpsAt(f128, -0x1.11b8adeba5615e0370722b511231p0)); | |
| 588 | try testing.expectApproxEqAbs(atanBinary128(-0x1.5f314e72398e7dbbe70fb072983ep-1), -0x1.33d28ca76253964cb5d3581cdd88p-1, math.floatEpsAt(f128, -0x1.33d28ca76253964cb5d3581cdd88p-1)); | |
| 589 | try testing.expectApproxEqAbs(atanBinary128(0x1.5869af37b7d078caa3456c44aecep1), 0x1.37082ce2dd03010bbea814dc5882p0, math.floatEpsAt(f128, 0x1.37082ce2dd03010bbea814dc5882p0)); | |
| 590 | try testing.expectApproxEqAbs(atanBinary128(-0x1.b13a05a66261821a364ad8c6c999p-2), -0x1.99d7cac66dd4438077284b491a91p-2, math.floatEpsAt(f128, -0x1.99d7cac66dd4438077284b491a91p-2)); | |
| 591 | try testing.expectApproxEqAbs(atanBinary128(0x1.3cb0f12f39d899c0d963ac413297p1), 0x1.2fcb120468e8d9ebdb74702314c8p0, math.floatEpsAt(f128, 0x1.2fcb120468e8d9ebdb74702314c8p0)); | |
| 592 | try testing.expectApproxEqAbs(atanBinary128(-0x1.0ed746b39cbb7614d8735e8315a8p-2), -0x1.08c71aa0e5090998206fbbe2090fp-2, math.floatEpsAt(f128, -0x1.08c71aa0e5090998206fbbe2090fp-2)); | |
| 593 | try testing.expectApproxEqAbs(atanBinary128(0x1.299d54ac7d6afc5154643b601519p1), 0x1.2a24e22d861debfd6f974500567fp0, math.floatEpsAt(f128, 0x1.2a24e22d861debfd6f974500567fp0)); | |
| 594 | try testing.expectApproxEqAbs(atanBinary128(-0x1.0264fb9f3d50e4f0f966f0686064p1), -0x1.1c617825f97512b7f38656ab12cdp0, math.floatEpsAt(f128, -0x1.1c617825f97512b7f38656ab12cdp0)); | |
| 585 | try testing.expectApproxEqAbs(-0x1.74c61f437701660ff76989d23707p-2, atanBinary128(-0x1.8629d0244cdcbed71792ccdec26dp-2), math.floatEpsAt(f128, -0x1.74c61f437701660ff76989d23707p-2)); | |
| 586 | try testing.expectApproxEqAbs(-0x1.375fd7987cc1fd0119cf0cc5b708p0, atanBinary128(-0x1.59d42d4659936d9e22b5dea4faefp1), math.floatEpsAt(f128, -0x1.375fd7987cc1fd0119cf0cc5b708p0)); | |
| 587 | try testing.expectApproxEqAbs(-0x1.11b8adeba5615e0370722b511231p0, atanBinary128(-0x1.d2dbe23d04f067b42da3f8efdf57p0), math.floatEpsAt(f128, -0x1.11b8adeba5615e0370722b511231p0)); | |
| 588 | try testing.expectApproxEqAbs(-0x1.33d28ca76253964cb5d3581cdd88p-1, atanBinary128(-0x1.5f314e72398e7dbbe70fb072983ep-1), math.floatEpsAt(f128, -0x1.33d28ca76253964cb5d3581cdd88p-1)); | |
| 589 | try testing.expectApproxEqAbs(0x1.37082ce2dd03010bbea814dc5882p0, atanBinary128(0x1.5869af37b7d078caa3456c44aecep1), math.floatEpsAt(f128, 0x1.37082ce2dd03010bbea814dc5882p0)); | |
| 590 | try testing.expectApproxEqAbs(-0x1.99d7cac66dd4438077284b491a91p-2, atanBinary128(-0x1.b13a05a66261821a364ad8c6c999p-2), math.floatEpsAt(f128, -0x1.99d7cac66dd4438077284b491a91p-2)); | |
| 591 | try testing.expectApproxEqAbs(0x1.2fcb120468e8d9ebdb74702314c8p0, atanBinary128(0x1.3cb0f12f39d899c0d963ac413297p1), math.floatEpsAt(f128, 0x1.2fcb120468e8d9ebdb74702314c8p0)); | |
| 592 | try testing.expectApproxEqAbs(-0x1.08c71aa0e5090998206fbbe2090fp-2, atanBinary128(-0x1.0ed746b39cbb7614d8735e8315a8p-2), math.floatEpsAt(f128, -0x1.08c71aa0e5090998206fbbe2090fp-2)); | |
| 593 | try testing.expectApproxEqAbs(0x1.2a24e22d861debfd6f974500567fp0, atanBinary128(0x1.299d54ac7d6afc5154643b601519p1), math.floatEpsAt(f128, 0x1.2a24e22d861debfd6f974500567fp0)); | |
| 594 | try testing.expectApproxEqAbs(-0x1.1c617825f97512b7f38656ab12cdp0, atanBinary128(-0x1.0264fb9f3d50e4f0f966f0686064p1), math.floatEpsAt(f128, -0x1.1c617825f97512b7f38656ab12cdp0)); | |
| 595 | 595 | } |
| 596 | 596 | |
| 597 | 597 | fn atanBinary32Vec(comptime vec_len: comptime_int, x: @Vector(vec_len, f32)) @TypeOf(x) { |
| ... | ... | @@ -696,12 +696,12 @@ test "atanBinary32Vec.special" { |
| 696 | 696 | math.nan(f32), |
| 697 | 697 | }; |
| 698 | 698 | const output = atanBinary32Vec(7, input); |
| 699 | try testing.expectEqual(output[0], 0x0p+0); | |
| 700 | try testing.expectEqual(output[1], -0x0p+0); | |
| 701 | try testing.expectApproxEqAbs(output[2], 0x1.921fb6p-1, math.floatEpsAt(f32, 0x1.921fb6p-1)); | |
| 702 | try testing.expectApproxEqAbs(output[3], -0x1.921fb6p-1, math.floatEpsAt(f32, -0x1.921fb6p-1)); | |
| 703 | try testing.expectApproxEqAbs(output[4], 0x1.921fb6p+0, math.floatEpsAt(f32, 0x1.921fb6p+0)); | |
| 704 | try testing.expectApproxEqAbs(output[5], -0x1.921fb6p+0, math.floatEpsAt(f32, -0x1.921fb6p+0)); | |
| 699 | try testing.expectEqual(0x0p+0, output[0]); | |
| 700 | try testing.expectEqual(-0x0p+0, output[1]); | |
| 701 | try testing.expectApproxEqAbs(0x1.921fb6p-1, output[2], math.floatEpsAt(f32, 0x1.921fb6p-1)); | |
| 702 | try testing.expectApproxEqAbs(-0x1.921fb6p-1, output[3], math.floatEpsAt(f32, -0x1.921fb6p-1)); | |
| 703 | try testing.expectApproxEqAbs(0x1.921fb6p+0, output[4], math.floatEpsAt(f32, 0x1.921fb6p+0)); | |
| 704 | try testing.expectApproxEqAbs(-0x1.921fb6p+0, output[5], math.floatEpsAt(f32, -0x1.921fb6p+0)); | |
| 705 | 705 | try testing.expect(math.isNan(output[6])); |
| 706 | 706 | } |
| 707 | 707 | |
| ... | ... | @@ -719,16 +719,16 @@ test "atanBinary32Vec" { |
| 719 | 719 | -0x1.0264fcp1, |
| 720 | 720 | }; |
| 721 | 721 | const output = atanBinary32Vec(10, input); |
| 722 | try testing.expectApproxEqAbs(output[0], -0x1.74c62p-2, math.floatEpsAt(f32, -0x1.74c62p-2)); | |
| 723 | try testing.expectApproxEqAbs(output[1], -0x1.375fd8p0, math.floatEpsAt(f32, -0x1.375fd8p0)); | |
| 724 | try testing.expectApproxEqAbs(output[2], -0x1.11b8aep0, math.floatEpsAt(f32, -0x1.11b8aep0)); | |
| 725 | try testing.expectApproxEqAbs(output[3], -0x1.33d28cp-1, math.floatEpsAt(f32, -0x1.33d28cp-1)); | |
| 726 | try testing.expectApproxEqAbs(output[4], 0x1.37082ep0, math.floatEpsAt(f32, 0x1.37082ep0)); | |
| 727 | try testing.expectApproxEqAbs(output[5], -0x1.99d7cap-2, math.floatEpsAt(f32, -0x1.99d7cap-2)); | |
| 728 | try testing.expectApproxEqAbs(output[6], 0x1.2fcb12p0, math.floatEpsAt(f32, 0x1.2fcb12p0)); | |
| 729 | try testing.expectApproxEqAbs(output[7], -0x1.08c71ap-2, math.floatEpsAt(f32, -0x1.08c71ap-2)); | |
| 730 | try testing.expectApproxEqAbs(output[8], 0x1.2a24e2p0, math.floatEpsAt(f32, 0x1.2a24e2p0)); | |
| 731 | try testing.expectApproxEqAbs(output[9], -0x1.1c6178p0, math.floatEpsAt(f32, -0x1.1c6178p0)); | |
| 722 | try testing.expectApproxEqAbs(-0x1.74c62p-2, output[0], math.floatEpsAt(f32, -0x1.74c62p-2)); | |
| 723 | try testing.expectApproxEqAbs(-0x1.375fd8p0, output[1], math.floatEpsAt(f32, -0x1.375fd8p0)); | |
| 724 | try testing.expectApproxEqAbs(-0x1.11b8aep0, output[2], math.floatEpsAt(f32, -0x1.11b8aep0)); | |
| 725 | try testing.expectApproxEqAbs(-0x1.33d28cp-1, output[3], math.floatEpsAt(f32, -0x1.33d28cp-1)); | |
| 726 | try testing.expectApproxEqAbs(0x1.37082ep0, output[4], math.floatEpsAt(f32, 0x1.37082ep0)); | |
| 727 | try testing.expectApproxEqAbs(-0x1.99d7cap-2, output[5], math.floatEpsAt(f32, -0x1.99d7cap-2)); | |
| 728 | try testing.expectApproxEqAbs(0x1.2fcb12p0, output[6], math.floatEpsAt(f32, 0x1.2fcb12p0)); | |
| 729 | try testing.expectApproxEqAbs(-0x1.08c71ap-2, output[7], math.floatEpsAt(f32, -0x1.08c71ap-2)); | |
| 730 | try testing.expectApproxEqAbs(0x1.2a24e2p0, output[8], math.floatEpsAt(f32, 0x1.2a24e2p0)); | |
| 731 | try testing.expectApproxEqAbs(-0x1.1c6178p0, output[9], math.floatEpsAt(f32, -0x1.1c6178p0)); | |
| 732 | 732 | } |
| 733 | 733 | |
| 734 | 734 | test "atanBinary64Vec.special" { |
| ... | ... | @@ -742,12 +742,12 @@ test "atanBinary64Vec.special" { |
| 742 | 742 | math.nan(f64), |
| 743 | 743 | }; |
| 744 | 744 | const output = atanBinary64Vec(7, input); |
| 745 | try testing.expectEqual(output[0], 0x0p+0); | |
| 746 | try testing.expectEqual(output[1], -0x0p+0); | |
| 747 | try testing.expectApproxEqAbs(output[2], 0x1.921fb54442d18p-1, math.floatEpsAt(f64, 0x1.921fb54442d18p-1)); | |
| 748 | try testing.expectApproxEqAbs(output[3], -0x1.921fb54442d18p-1, math.floatEpsAt(f64, -0x1.921fb54442d18p-1)); | |
| 749 | try testing.expectApproxEqAbs(output[4], 0x1.921fb54442d18p+0, math.floatEpsAt(f64, 0x1.921fb54442d18p+0)); | |
| 750 | try testing.expectApproxEqAbs(output[5], -0x1.921fb54442d18p+0, math.floatEpsAt(f64, -0x1.921fb54442d18p+0)); | |
| 745 | try testing.expectEqual(0x0p+0, output[0]); | |
| 746 | try testing.expectEqual(-0x0p+0, output[1]); | |
| 747 | try testing.expectApproxEqAbs(0x1.921fb54442d18p-1, output[2], math.floatEpsAt(f64, 0x1.921fb54442d18p-1)); | |
| 748 | try testing.expectApproxEqAbs(-0x1.921fb54442d18p-1, output[3], math.floatEpsAt(f64, -0x1.921fb54442d18p-1)); | |
| 749 | try testing.expectApproxEqAbs(0x1.921fb54442d18p+0, output[4], math.floatEpsAt(f64, 0x1.921fb54442d18p+0)); | |
| 750 | try testing.expectApproxEqAbs(-0x1.921fb54442d18p+0, output[5], math.floatEpsAt(f64, -0x1.921fb54442d18p+0)); | |
| 751 | 751 | try testing.expect(math.isNan(output[6])); |
| 752 | 752 | } |
| 753 | 753 | |
| ... | ... | @@ -765,14 +765,14 @@ test "atanBinary64Vec" { |
| 765 | 765 | -0x1.0264fb9f3d50ep1, |
| 766 | 766 | }; |
| 767 | 767 | const output = atanBinary64Vec(10, input); |
| 768 | try testing.expectApproxEqAbs(output[0], -0x1.74c61f4377016p-2, math.floatEpsAt(f64, -0x1.74c61f4377016p-2)); | |
| 769 | try testing.expectApproxEqAbs(output[1], -0x1.375fd7987cc2p0, math.floatEpsAt(f64, -0x1.375fd7987cc2p0)); | |
| 770 | try testing.expectApproxEqAbs(output[2], -0x1.11b8adeba5616p0, math.floatEpsAt(f64, -0x1.11b8adeba5616p0)); | |
| 771 | try testing.expectApproxEqAbs(output[3], -0x1.33d28ca762539p-1, math.floatEpsAt(f64, -0x1.33d28ca762539p-1)); | |
| 772 | try testing.expectApproxEqAbs(output[4], 0x1.37082ce2dd03p0, math.floatEpsAt(f64, 0x1.37082ce2dd03p0)); | |
| 773 | try testing.expectApproxEqAbs(output[5], -0x1.99d7cac66dd44p-2, math.floatEpsAt(f64, -0x1.99d7cac66dd44p-2)); | |
| 774 | try testing.expectApproxEqAbs(output[6], 0x1.2fcb120468e8ep0, math.floatEpsAt(f64, 0x1.2fcb120468e8ep0)); | |
| 775 | try testing.expectApproxEqAbs(output[7], -0x1.08c71aa0e509p-2, math.floatEpsAt(f64, -0x1.08c71aa0e509p-2)); | |
| 776 | try testing.expectApproxEqAbs(output[8], 0x1.2a24e22d861dfp0, math.floatEpsAt(f64, 0x1.2a24e22d861dfp0)); | |
| 777 | try testing.expectApproxEqAbs(output[9], -0x1.1c617825f9751p0, math.floatEpsAt(f64, -0x1.1c617825f9751p0)); | |
| 768 | try testing.expectApproxEqAbs(-0x1.74c61f4377016p-2, output[0], math.floatEpsAt(f64, -0x1.74c61f4377016p-2)); | |
| 769 | try testing.expectApproxEqAbs(-0x1.375fd7987cc2p0, output[1], math.floatEpsAt(f64, -0x1.375fd7987cc2p0)); | |
| 770 | try testing.expectApproxEqAbs(-0x1.11b8adeba5616p0, output[2], math.floatEpsAt(f64, -0x1.11b8adeba5616p0)); | |
| 771 | try testing.expectApproxEqAbs(-0x1.33d28ca762539p-1, output[3], math.floatEpsAt(f64, -0x1.33d28ca762539p-1)); | |
| 772 | try testing.expectApproxEqAbs(0x1.37082ce2dd03p0, output[4], math.floatEpsAt(f64, 0x1.37082ce2dd03p0)); | |
| 773 | try testing.expectApproxEqAbs(-0x1.99d7cac66dd44p-2, output[5], math.floatEpsAt(f64, -0x1.99d7cac66dd44p-2)); | |
| 774 | try testing.expectApproxEqAbs(0x1.2fcb120468e8ep0, output[6], math.floatEpsAt(f64, 0x1.2fcb120468e8ep0)); | |
| 775 | try testing.expectApproxEqAbs(-0x1.08c71aa0e509p-2, output[7], math.floatEpsAt(f64, -0x1.08c71aa0e509p-2)); | |
| 776 | try testing.expectApproxEqAbs(0x1.2a24e22d861dfp0, output[8], math.floatEpsAt(f64, 0x1.2a24e22d861dfp0)); | |
| 777 | try testing.expectApproxEqAbs(-0x1.1c617825f9751p0, output[9], math.floatEpsAt(f64, -0x1.1c617825f9751p0)); | |
| 778 | 778 | } |