mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 15:18:49 +00:00
Merge pull request #3203 from listeriaceae/master
port math.round from Golang
This commit is contained in:
+164
-31
@@ -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.
|
||||
|
||||
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_f32 :: proc "contextless" (x: f32) -> f32 {
|
||||
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_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)
|
||||
}
|
||||
@(require_results)
|
||||
round_f64le :: proc "contextless" (x: f64le) -> f64le {
|
||||
return ceil(x - 0.5) if x < 0 else floor(x + 0.5)
|
||||
}
|
||||
@(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)
|
||||
QNAN_F64 :: f64(0h7FF8_0000_0000_0001)
|
||||
|
||||
Reference in New Issue
Block a user