aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-03-01 13:36:12 +0000
committergingerBill <bill@gingerbill.org>2024-03-01 13:36:12 +0000
commitbc191d4f8462f5a9be7d289fc0aae5a2d2f97629 (patch)
tree557d1e4de344e9a9488ceeaf5b25b06c23a60db8 /core
parent5c20676c76ed888b230c80596f7ed20ee9b19183 (diff)
parent11b7be16405e31fad371881195c25943ad5a39b5 (diff)
Merge branch 'master' of https://github.com/odin-lang/Odin
Diffstat (limited to 'core')
-rw-r--r--core/math/math.odin195
1 files changed, 164 insertions, 31 deletions
diff --git a/core/math/math.odin b/core/math/math.odin
index 7fdbcba04..570c2d255 100644
--- a/core/math/math.odin
+++ b/core/math/math.odin
@@ -644,42 +644,175 @@ trunc :: proc{
}
@(require_results)
-round_f16 :: proc "contextless" (x: f16) -> f16 {
- return ceil(x - 0.5) if x < 0 else floor(x + 0.5)
-}
-@(require_results)
-round_f16le :: proc "contextless" (x: f16le) -> f16le {
- return ceil(x - 0.5) if x < 0 else floor(x + 0.5)
-}
-@(require_results)
-round_f16be :: proc "contextless" (x: f16be) -> f16be {
- return ceil(x - 0.5) if x < 0 else floor(x + 0.5)
-}
+round_f16 :: proc "contextless" (x: f16) -> f16 {
+ // origin: Go /src/math/floor.go
+ //
+ // Copyright (c) 2009 The Go Authors. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+ // met:
+ //
+ // * Redistributions of source code must retain the above copyright
+ // notice, this list of conditions and the following disclaimer.
+ // * Redistributions in binary form must reproduce the above
+ // copyright notice, this list of conditions and the following disclaimer
+ // in the documentation and/or other materials provided with the
+ // distribution.
+ // * Neither the name of Google Inc. nor the names of its
+ // contributors may be used to endorse or promote products derived from
+ // this software without specific prior written permission.
+ //
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-@(require_results)
-round_f32 :: proc "contextless" (x: f32) -> f32 {
- return ceil(x - 0.5) if x < 0 else floor(x + 0.5)
-}
-@(require_results)
-round_f32le :: proc "contextless" (x: f32le) -> f32le {
- return ceil(x - 0.5) if x < 0 else floor(x + 0.5)
-}
-@(require_results)
-round_f32be :: proc "contextless" (x: f32be) -> f32be {
- return ceil(x - 0.5) if x < 0 else floor(x + 0.5)
-}
-@(require_results)
-round_f64 :: proc "contextless" (x: f64) -> f64 {
- return ceil(x - 0.5) if x < 0 else floor(x + 0.5)
+ mask :: F16_MASK
+ shift :: F16_SHIFT
+ bias :: F16_BIAS
+
+ bits := transmute(u16)x
+ e := (bits >> shift) & mask
+
+ if e < bias {
+ bits &= 0x8000
+ if e == bias - 1 {
+ bits |= transmute(u16)f16(1)
+ }
+ } else if e < bias + shift {
+ half :: 1 << (shift - 1)
+ mantissa :: (1 << shift) - 1
+ e -= bias
+ bits += half >> e
+ bits &~= mantissa >> e
+ }
+
+ return transmute(f16)bits
}
+@(require_results) round_f16le :: proc "contextless" (x: f16le) -> f16le { return #force_inline f16le(round_f16(f16(x))) }
+@(require_results) round_f16be :: proc "contextless" (x: f16be) -> f16be { return #force_inline f16be(round_f16(f16(x))) }
+
@(require_results)
-round_f64le :: proc "contextless" (x: f64le) -> f64le {
- return ceil(x - 0.5) if x < 0 else floor(x + 0.5)
+round_f32 :: proc "contextless" (x: f32) -> f32 {
+ // origin: Go /src/math/floor.go
+ //
+ // Copyright (c) 2009 The Go Authors. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+ // met:
+ //
+ // * Redistributions of source code must retain the above copyright
+ // notice, this list of conditions and the following disclaimer.
+ // * Redistributions in binary form must reproduce the above
+ // copyright notice, this list of conditions and the following disclaimer
+ // in the documentation and/or other materials provided with the
+ // distribution.
+ // * Neither the name of Google Inc. nor the names of its
+ // contributors may be used to endorse or promote products derived from
+ // this software without specific prior written permission.
+ //
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ mask :: F32_MASK
+ shift :: F32_SHIFT
+ bias :: F32_BIAS
+
+ bits := transmute(u32)x
+ e := (bits >> shift) & mask
+
+ if e < bias {
+ bits &= 0x8000_0000
+ if e == bias - 1 {
+ bits |= transmute(u32)f32(1)
+ }
+ } else if e < bias + shift {
+ half :: 1 << (shift - 1)
+ mantissa :: (1 << shift) - 1
+ e -= bias
+ bits += half >> e
+ bits &~= mantissa >> e
+ }
+
+ return transmute(f32)bits
}
+@(require_results) round_f32le :: proc "contextless" (x: f32le) -> f32le { return #force_inline f32le(round_f32(f32(x))) }
+@(require_results) round_f32be :: proc "contextless" (x: f32be) -> f32be { return #force_inline f32be(round_f32(f32(x))) }
+
@(require_results)
-round_f64be :: proc "contextless" (x: f64be) -> f64be {
- return ceil(x - 0.5) if x < 0 else floor(x + 0.5)
+round_f64 :: proc "contextless" (x: f64) -> f64 {
+ // origin: Go /src/math/floor.go
+ //
+ // Copyright (c) 2009 The Go Authors. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+ // met:
+ //
+ // * Redistributions of source code must retain the above copyright
+ // notice, this list of conditions and the following disclaimer.
+ // * Redistributions in binary form must reproduce the above
+ // copyright notice, this list of conditions and the following disclaimer
+ // in the documentation and/or other materials provided with the
+ // distribution.
+ // * Neither the name of Google Inc. nor the names of its
+ // contributors may be used to endorse or promote products derived from
+ // this software without specific prior written permission.
+ //
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ mask :: F64_MASK
+ shift :: F64_SHIFT
+ bias :: F64_BIAS
+
+ bits := transmute(u64)x
+ e := (bits >> shift) & mask
+
+ if e < bias {
+ bits &= 0x8000_0000_0000_0000
+ if e == bias - 1 {
+ bits |= transmute(u64)f64(1)
+ }
+ } else if e < bias + shift {
+ half :: 1 << (shift - 1)
+ mantissa :: (1 << shift) - 1
+ e -= bias
+ bits += half >> e
+ bits &~= mantissa >> e
+ }
+
+ return transmute(f64)bits
}
+@(require_results) round_f64le :: proc "contextless" (x: f64le) -> f64le { return #force_inline f64le(round_f64(f64(x))) }
+@(require_results) round_f64be :: proc "contextless" (x: f64be) -> f64be { return #force_inline f64be(round_f64(f64(x))) }
round :: proc{
round_f16, round_f16le, round_f16be,
round_f32, round_f32le, round_f32be,
@@ -2353,4 +2486,4 @@ INF_F64 :: f64(0h7FF0_0000_0000_0000)
NEG_INF_F64 :: f64(0hFFF0_0000_0000_0000)
SNAN_F64 :: f64(0h7FF0_0000_0000_0001)
-QNAN_F64 :: f64(0h7FF8_0000_0000_0001) \ No newline at end of file
+QNAN_F64 :: f64(0h7FF8_0000_0000_0001)