From 866a9fdf192a5dcd54ae77ba797273e14899164a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 28 Jun 2023 12:19:45 +0100 Subject: [PATCH] Actually add math.hypot --- core/math/math.odin | 72 ++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/core/math/math.odin b/core/math/math.odin index 70ffc1a35..6f7a36bab 100644 --- a/core/math/math.odin +++ b/core/math/math.odin @@ -2160,51 +2160,57 @@ signbit :: proc{ @(require_results) hypot_f16 :: proc "contextless" (x, y: f16) -> (r: f16) { + p, q := abs(x), abs(y) switch { - case is_nan(x) || is_nan(y): - r = nan_f16() - case x == y: - r = x - case x == 0: - r = copy_sign_f16(1, y) - case (y > x) == (x > 0): - r = transmute(f16)(transmute(u16)x + 1) - case: - r = transmute(f16)(transmute(u16)x - 1) + case is_inf(p, 1) || is_inf(q, 1): + return inf_f16(1) + case is_nan(p) || is_nan(q): + return nan_f16() } - return + if p < q { + p, q = q, p + } + if p == 0 { + return 0 + } + q = q / p + return p * sqrt(1+q*q) } @(require_results) hypot_f32 :: proc "contextless" (x, y: f32) -> (r: f32) { + p, q := abs(x), abs(y) switch { - case is_nan(x) || is_nan(y): - r = nan_f32() - case x == y: - r = x - case x == 0: - r = copy_sign_f32(1, y) - case (y > x) == (x > 0): - r = transmute(f32)(transmute(u32)x + 1) - case: - r = transmute(f32)(transmute(u32)x - 1) + case is_inf(p, 1) || is_inf(q, 1): + return inf_f32(1) + case is_nan(p) || is_nan(q): + return nan_f32() } - return + if p < q { + p, q = q, p + } + if p == 0 { + return 0 + } + q = q / p + return p * sqrt(1+q*q) } @(require_results) hypot_f64 :: proc "contextless" (x, y: f64) -> (r: f64) { + p, q := abs(x), abs(y) switch { - case is_nan(x) || is_nan(y): - r = nan_f64() - case x == y: - r = x - case x == 0: - r = copy_sign_f64(1, y) - case (y > x) == (x > 0): - r = transmute(f64)(transmute(u64)x + 1) - case: - r = transmute(f64)(transmute(u64)x - 1) + case is_inf(p, 1) || is_inf(q, 1): + return inf_f64(1) + case is_nan(p) || is_nan(q): + return nan_f64() } - return + if p < q { + p, q = q, p + } + if p == 0 { + return 0 + } + q = q / p + return p * sqrt(1+q*q) } @(require_results) hypot_f16le :: proc "contextless" (x, y: f16le) -> (r: f16le) { return f16le(hypot_f16(f16(x), f16(y))) } @(require_results) hypot_f16be :: proc "contextless" (x, y: f16be) -> (r: f16be) { return f16be(hypot_f16(f16(x), f16(y))) }