File tree 5 files changed +65
-6
lines changed
5 files changed +65
-6
lines changed Original file line number Diff line number Diff line change @@ -34,10 +34,8 @@ pub fn _eq(a: u64, b: u64) -> bool {
34
34
///
35
35
/// This trait is sealed and cannot be implemented outside of `libm`.
36
36
pub trait F32Ext : private:: Sealed {
37
- #[ cfg( todo) ]
38
37
fn floor ( self ) -> Self ;
39
38
40
- #[ cfg( todo) ]
41
39
fn ceil ( self ) -> Self ;
42
40
43
41
fn round ( self ) -> Self ;
@@ -141,13 +139,11 @@ pub trait F32Ext: private::Sealed {
141
139
}
142
140
143
141
impl F32Ext for f32 {
144
- #[ cfg( todo) ]
145
142
#[ inline]
146
143
fn floor ( self ) -> Self {
147
144
floorf ( self )
148
145
}
149
146
150
- #[ cfg( todo) ]
151
147
#[ inline]
152
148
fn ceil ( self ) -> Self {
153
149
ceilf ( self )
Original file line number Diff line number Diff line change
1
+ use core:: f32;
2
+
3
+ pub fn ceilf ( x : f32 ) -> f32 {
4
+ let mut ui = x. to_bits ( ) ;
5
+ let e = ( ( ( ui >> 23 ) & 0xff ) - 0x7f ) as i32 ;
6
+
7
+ if e >= 23 {
8
+ return x;
9
+ }
10
+ if e >= 0 {
11
+ let m = 0x007fffff >> e;
12
+ if ( ui & m) == 0 {
13
+ return x;
14
+ }
15
+ force_eval ! ( x + f32 :: from_bits( 0x7b800000 ) ) ;
16
+ if ui >> 31 == 0 {
17
+ ui += m;
18
+ }
19
+ ui &= !m;
20
+ } else {
21
+ force_eval ! ( x + f32 :: from_bits( 0x7b800000 ) ) ;
22
+ if ui >> 31 != 0 {
23
+ return -0.0 ;
24
+ } else if ui << 1 != 0 {
25
+ return 1.0 ;
26
+ }
27
+ }
28
+ return f32:: from_bits ( ui) ;
29
+ }
Original file line number Diff line number Diff line change
1
+ use core:: f32;
2
+
3
+ #[ inline]
4
+ pub fn floorf ( x : f32 ) -> f32 {
5
+ let mut ui = x. to_bits ( ) ;
6
+ let e = ( ( ( ui >> 23 ) & 0xff ) - 0x7f ) as i32 ;
7
+
8
+ if e >= 23 {
9
+ return x;
10
+ }
11
+ if e >= 0 {
12
+ let m: u32 = 0x007fffff >> e;
13
+ if ( ui & m) == 0 {
14
+ return x;
15
+ }
16
+ force_eval ! ( x + f32 :: from_bits( 0x7b800000 ) ) ;
17
+ if ui >> 31 != 0 {
18
+ ui += m;
19
+ }
20
+ ui &= !m;
21
+ } else {
22
+ force_eval ! ( x + f32 :: from_bits( 0x7b800000 ) ) ;
23
+ if ui >> 31 == 0 {
24
+ ui = 0 ;
25
+ } else if ui << 1 != 0 {
26
+ return -1.0 ;
27
+ }
28
+ }
29
+ return f32:: from_bits ( ui) ;
30
+ }
Original file line number Diff line number Diff line change @@ -6,8 +6,10 @@ macro_rules! force_eval {
6
6
} ;
7
7
}
8
8
9
+ mod ceilf;
9
10
mod fabs;
10
11
mod fabsf;
12
+ mod floorf;
11
13
mod fmodf;
12
14
mod powf;
13
15
mod round;
@@ -27,8 +29,10 @@ mod hypotf;
27
29
//mod service;
28
30
29
31
pub use self :: {
32
+ ceilf:: ceilf,
30
33
fabs:: fabs,
31
34
fabsf:: fabsf,
35
+ floorf:: floorf,
32
36
fmodf:: fmodf,
33
37
powf:: powf,
34
38
round:: round,
Original file line number Diff line number Diff line change @@ -652,12 +652,12 @@ fn main() -> Result<(), Box<Error>> {
652
652
// With signature `fn(f32) -> f32`
653
653
f32_f32 ! {
654
654
// acosf,
655
- // floorf,
655
+ floorf,
656
656
truncf,
657
657
// asinf,
658
658
// atanf,
659
659
// cbrtf,
660
- // ceilf,
660
+ ceilf,
661
661
// cosf,
662
662
// coshf,
663
663
// exp2f,
You can’t perform that action at this time.
0 commit comments