Skip to content
This repository was archived by the owner on Apr 28, 2025. It is now read-only.

Commit e2ac6ef

Browse files
committed
Add roundf16 and roundf128
1 parent 9c68f74 commit e2ac6ef

File tree

11 files changed

+78
-2
lines changed

11 files changed

+78
-2
lines changed

crates/libm-macros/src/shared.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const ALL_OPERATIONS_NESTED: &[(FloatTy, Signature, Option<Signature>, &[&str])]
99
FloatTy::F16,
1010
Signature { args: &[Ty::F16], returns: &[Ty::F16] },
1111
None,
12-
&["ceilf16", "fabsf16", "floorf16", "rintf16", "sqrtf16", "truncf16"],
12+
&["ceilf16", "fabsf16", "floorf16", "rintf16", "roundf16", "sqrtf16", "truncf16"],
1313
),
1414
(
1515
// `fn(f32) -> f32`
@@ -40,7 +40,7 @@ const ALL_OPERATIONS_NESTED: &[(FloatTy, Signature, Option<Signature>, &[&str])]
4040
FloatTy::F128,
4141
Signature { args: &[Ty::F128], returns: &[Ty::F128] },
4242
None,
43-
&["ceilf128", "fabsf128", "floorf128", "rintf128", "sqrtf128", "truncf128"],
43+
&["ceilf128", "fabsf128", "floorf128", "rintf128", "roundf128", "sqrtf128", "truncf128"],
4444
),
4545
(
4646
// `(f16, f16) -> f16`

crates/libm-test/benches/random.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ libm_macros::for_each_function! {
129129
| floorf16
130130
| rintf128
131131
| rintf16
132+
| roundf128
133+
| roundf16
132134
| sqrtf128
133135
| sqrtf16
134136
| truncf128

crates/libm-test/src/mpfloat.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ libm_macros::for_each_function! {
175175
rintf16,
176176
round,
177177
roundf,
178+
roundf128,
179+
roundf16,
178180
scalbn,
179181
scalbnf,
180182
sincos,sincosf,
@@ -247,6 +249,7 @@ impl_no_round! {
247249
fabsf16 => abs_mut;
248250
floorf16 => floor_mut;
249251
rintf16 => round_even_mut; // FIXME: respect rounding mode
252+
roundf16 => round_mut;
250253
truncf16 => trunc_mut;
251254
}
252255

@@ -256,6 +259,7 @@ impl_no_round! {
256259
fabsf128 => abs_mut;
257260
floorf128 => floor_mut;
258261
rintf128 => round_even_mut; // FIXME: respect rounding mode
262+
roundf128 => round_mut;
259263
truncf128 => trunc_mut;
260264
}
261265

crates/libm-test/tests/compare_built_musl.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ libm_macros::for_each_function! {
9191
floorf16,
9292
rintf128,
9393
rintf16,
94+
roundf128,
95+
roundf16,
9496
sqrtf128,
9597
sqrtf16,
9698
truncf128,

crates/util/src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ fn do_eval(basis: &str, op: &str, inputs: &[&str]) {
9898
| floorf16
9999
| rintf128
100100
| rintf16
101+
| roundf128
102+
| roundf16
101103
| sqrtf128
102104
| sqrtf16
103105
| truncf128

etc/function-definitions.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,20 @@
697697
],
698698
"type": "f32"
699699
},
700+
"roundf128": {
701+
"sources": [
702+
"src/math/generic/round.rs",
703+
"src/math/roundf128.rs"
704+
],
705+
"type": "f128"
706+
},
707+
"roundf16": {
708+
"sources": [
709+
"src/math/generic/round.rs",
710+
"src/math/roundf16.rs"
711+
],
712+
"type": "f16"
713+
},
700714
"scalbn": {
701715
"sources": [
702716
"src/libm_helper.rs",

etc/function-list.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ rintf128
101101
rintf16
102102
round
103103
roundf
104+
roundf128
105+
roundf16
104106
scalbn
105107
scalbnf
106108
sin

src/math/generic/round.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,24 @@ pub fn round<F: Float>(x: F) -> F {
1212
mod tests {
1313
use super::*;
1414

15+
#[test]
16+
#[cfg(f16_enabled)]
17+
fn zeroes_f16() {
18+
assert_biteq!(round(0.0_f16), 0.0_f16);
19+
assert_biteq!(round(-0.0_f16), -0.0_f16);
20+
}
21+
22+
#[test]
23+
#[cfg(f16_enabled)]
24+
fn sanity_check_f16() {
25+
assert_eq!(round(-1.0_f16), -1.0);
26+
assert_eq!(round(2.8_f16), 3.0);
27+
assert_eq!(round(-0.5_f16), -1.0);
28+
assert_eq!(round(0.5_f16), 1.0);
29+
assert_eq!(round(-1.5_f16), -2.0);
30+
assert_eq!(round(1.5_f16), 2.0);
31+
}
32+
1533
#[test]
1634
fn zeroes_f32() {
1735
assert_biteq!(round(0.0_f32), 0.0_f32);
@@ -43,4 +61,22 @@ mod tests {
4361
assert_eq!(round(-1.5_f64), -2.0);
4462
assert_eq!(round(1.5_f64), 2.0);
4563
}
64+
65+
#[test]
66+
#[cfg(f128_enabled)]
67+
fn zeroes_f128() {
68+
assert_biteq!(round(0.0_f128), 0.0_f128);
69+
assert_biteq!(round(-0.0_f128), -0.0_f128);
70+
}
71+
72+
#[test]
73+
#[cfg(f128_enabled)]
74+
fn sanity_check_f128() {
75+
assert_eq!(round(-1.0_f128), -1.0);
76+
assert_eq!(round(2.8_f128), 3.0);
77+
assert_eq!(round(-0.5_f128), -1.0);
78+
assert_eq!(round(0.5_f128), 1.0);
79+
assert_eq!(round(-1.5_f128), -2.0);
80+
assert_eq!(round(1.5_f128), 2.0);
81+
}
4682
}

src/math/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ cfg_if! {
347347
mod fdimf16;
348348
mod floorf16;
349349
mod rintf16;
350+
mod roundf16;
350351
mod sqrtf16;
351352
mod truncf16;
352353

@@ -356,6 +357,7 @@ cfg_if! {
356357
pub use self::fdimf16::fdimf16;
357358
pub use self::floorf16::floorf16;
358359
pub use self::rintf16::rintf16;
360+
pub use self::roundf16::roundf16;
359361
pub use self::sqrtf16::sqrtf16;
360362
pub use self::truncf16::truncf16;
361363
}
@@ -369,6 +371,7 @@ cfg_if! {
369371
mod fdimf128;
370372
mod floorf128;
371373
mod rintf128;
374+
mod roundf128;
372375
mod sqrtf128;
373376
mod truncf128;
374377

@@ -378,6 +381,7 @@ cfg_if! {
378381
pub use self::fdimf128::fdimf128;
379382
pub use self::floorf128::floorf128;
380383
pub use self::rintf128::rintf128;
384+
pub use self::roundf128::roundf128;
381385
pub use self::sqrtf128::sqrtf128;
382386
pub use self::truncf128::truncf128;
383387
}

src/math/roundf128.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/// Round `x` to the nearest integer, breaking ties away from zero.
2+
#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
3+
pub fn roundf128(x: f128) -> f128 {
4+
super::generic::round(x)
5+
}

0 commit comments

Comments
 (0)