@@ -852,8 +852,20 @@ impl FloatCore for f16 {
852
852
Self :: powi( self , n: i32 ) -> Self ;
853
853
}
854
854
855
- // TODO:
856
- // use floor, ceil, round, trunc, abs and fract provided by libm
855
+ #[ cfg( all( not( feature = "std" ) , feature = "libm" ) ) ]
856
+ forward ! {
857
+ libm:: floorf16 as floor( self ) -> Self ;
858
+ libm:: ceilf16 as ceil( self ) -> Self ;
859
+ libm:: roundf16 as round( self ) -> Self ;
860
+ libm:: truncf16 as trunc( self ) -> Self ;
861
+ libm:: fabsf16 as abs( self ) -> Self ;
862
+ }
863
+
864
+ #[ cfg( all( not( feature = "std" ) , feature = "libm" ) ) ]
865
+ #[ inline]
866
+ fn fract ( self ) -> Self {
867
+ self - libm:: truncf16 ( self )
868
+ }
857
869
}
858
870
859
871
impl FloatCore for f32 {
@@ -1026,8 +1038,24 @@ impl FloatCore for f128 {
1026
1038
Self :: powi( self , n: i32 ) -> Self ;
1027
1039
}
1028
1040
1029
- // TODO:
1030
- // use floor, ceil, round, trunc, abs and fract provided by libm
1041
+ #[ cfg( all( not( feature = "std" ) , feature = "libm" ) ) ]
1042
+ forward ! {
1043
+ libm:: floorf128 as floor( self ) -> Self ;
1044
+ libm:: ceilf128 as ceil( self ) -> Self ;
1045
+ libm:: roundf128 as round( self ) -> Self ;
1046
+ libm:: truncf128 as trunc( self ) -> Self ;
1047
+ }
1048
+
1049
+ #[ cfg( all( not( feature = "std" ) , feature = "libm" ) ) ]
1050
+ forward ! {
1051
+ f128:: abs as abs( self ) -> Self ;
1052
+ }
1053
+
1054
+ #[ cfg( all( not( feature = "std" ) , feature = "libm" ) ) ]
1055
+ #[ inline]
1056
+ fn fract ( self ) -> Self {
1057
+ self - libm:: truncf128 ( self )
1058
+ }
1031
1059
}
1032
1060
1033
1061
// FIXME: these doctests aren't actually helpful, because they're using and
@@ -2232,6 +2260,63 @@ float_impl_std!(f64 integer_decode_f64);
2232
2260
#[ cfg( feature = "std" ) ]
2233
2261
float_impl_std ! ( f128 integer_decode_f128_truncated) ;
2234
2262
2263
+ #[ cfg( all( not( feature = "std" ) , feature = "libm" ) ) ]
2264
+ impl Float for f16 {
2265
+ float_impl_libm ! ( f16 integer_decode_f16) ;
2266
+
2267
+ #[ inline]
2268
+ #[ allow( deprecated) ]
2269
+ fn abs_sub ( self , other : Self ) -> Self {
2270
+ libm:: fdimf16 ( self , other)
2271
+ }
2272
+
2273
+ forward ! {
2274
+ libm:: floorf16 as floor( self ) -> Self ;
2275
+ libm:: ceilf16 as ceil( self ) -> Self ;
2276
+ libm:: roundf16 as round( self ) -> Self ;
2277
+ libm:: truncf16 as trunc( self ) -> Self ;
2278
+ }
2279
+
2280
+ cast_forward_cast ! {
2281
+ [ f32 ] libm:: fmaf as mul_add( self , a: Self , b: Self ) -> Self ;
2282
+ [ f32 ] libm:: powf as powf( self , n: Self ) -> Self ;
2283
+ [ f32 ] libm:: sqrtf as sqrt( self ) -> Self ;
2284
+ [ f32 ] libm:: expf as exp( self ) -> Self ;
2285
+ [ f32 ] libm:: exp2f as exp2( self ) -> Self ;
2286
+ [ f32 ] libm:: logf as ln( self ) -> Self ;
2287
+ [ f32 ] libm:: log2f as log2( self ) -> Self ;
2288
+ [ f32 ] libm:: log10f as log10( self ) -> Self ;
2289
+ [ f32 ] libm:: cbrtf as cbrt( self ) -> Self ;
2290
+ [ f32 ] libm:: hypotf as hypot( self , other: Self ) -> Self ;
2291
+ [ f32 ] libm:: sinf as sin( self ) -> Self ;
2292
+ [ f32 ] libm:: cosf as cos( self ) -> Self ;
2293
+ [ f32 ] libm:: tanf as tan( self ) -> Self ;
2294
+ [ f32 ] libm:: asinf as asin( self ) -> Self ;
2295
+ [ f32 ] libm:: acosf as acos( self ) -> Self ;
2296
+ [ f32 ] libm:: atanf as atan( self ) -> Self ;
2297
+ [ f32 ] libm:: atan2f as atan2( self , other: Self ) -> Self ;
2298
+ [ f32 ] libm:: expm1f as exp_m1( self ) -> Self ;
2299
+ [ f32 ] libm:: log1pf as ln_1p( self ) -> Self ;
2300
+ [ f32 ] libm:: sinhf as sinh( self ) -> Self ;
2301
+ [ f32 ] libm:: coshf as cosh( self ) -> Self ;
2302
+ [ f32 ] libm:: tanhf as tanh( self ) -> Self ;
2303
+ [ f32 ] libm:: asinhf as asinh( self ) -> Self ;
2304
+ [ f32 ] libm:: acoshf as acosh( self ) -> Self ;
2305
+ [ f32 ] libm:: atanhf as atanh( self ) -> Self ;
2306
+ }
2307
+
2308
+ forward ! {
2309
+ f16:: abs as abs( self ) -> Self ;
2310
+ f16:: copysign as copysign( self , other: Self ) -> Self ;
2311
+ }
2312
+
2313
+ #[ inline]
2314
+ fn sin_cos ( self ) -> ( Self , Self ) {
2315
+ let ( x, y) = libm:: sincosf ( self as f32 ) ;
2316
+ ( x as Self , y as Self )
2317
+ }
2318
+ }
2319
+
2235
2320
#[ cfg( all( not( feature = "std" ) , feature = "libm" ) ) ]
2236
2321
impl Float for f32 {
2237
2322
float_impl_libm ! ( f32 integer_decode_f32) ;
@@ -2324,6 +2409,63 @@ impl Float for f64 {
2324
2409
}
2325
2410
}
2326
2411
2412
+ #[ cfg( all( not( feature = "std" ) , feature = "libm" ) ) ]
2413
+ impl Float for f128 {
2414
+ float_impl_libm ! ( f128 integer_decode_f128_truncated) ;
2415
+
2416
+ #[ inline]
2417
+ #[ allow( deprecated) ]
2418
+ fn abs_sub ( self , other : Self ) -> Self {
2419
+ libm:: fdimf128 ( self , other)
2420
+ }
2421
+
2422
+ forward ! {
2423
+ libm:: floorf128 as floor( self ) -> Self ;
2424
+ libm:: ceilf128 as ceil( self ) -> Self ;
2425
+ libm:: roundf128 as round( self ) -> Self ;
2426
+ libm:: truncf128 as trunc( self ) -> Self ;
2427
+ }
2428
+
2429
+ cast_forward_cast ! {
2430
+ [ f64 ] libm:: pow as powf( self , n: Self ) -> Self ;
2431
+ [ f64 ] libm:: exp as exp( self ) -> Self ;
2432
+ [ f64 ] libm:: exp2 as exp2( self ) -> Self ;
2433
+ [ f64 ] libm:: log as ln( self ) -> Self ;
2434
+ [ f64 ] libm:: log2 as log2( self ) -> Self ;
2435
+ [ f64 ] libm:: log10 as log10( self ) -> Self ;
2436
+ [ f64 ] libm:: cbrt as cbrt( self ) -> Self ;
2437
+ [ f64 ] libm:: hypot as hypot( self , other: Self ) -> Self ;
2438
+ [ f64 ] libm:: sin as sin( self ) -> Self ;
2439
+ [ f64 ] libm:: cos as cos( self ) -> Self ;
2440
+ [ f64 ] libm:: tan as tan( self ) -> Self ;
2441
+ [ f64 ] libm:: asin as asin( self ) -> Self ;
2442
+ [ f64 ] libm:: acos as acos( self ) -> Self ;
2443
+ [ f64 ] libm:: atan as atan( self ) -> Self ;
2444
+ [ f64 ] libm:: atan2 as atan2( self , other: Self ) -> Self ;
2445
+ [ f64 ] libm:: expm1 as exp_m1( self ) -> Self ;
2446
+ [ f64 ] libm:: log1p as ln_1p( self ) -> Self ;
2447
+ [ f64 ] libm:: sinh as sinh( self ) -> Self ;
2448
+ [ f64 ] libm:: cosh as cosh( self ) -> Self ;
2449
+ [ f64 ] libm:: tanh as tanh( self ) -> Self ;
2450
+ [ f64 ] libm:: asinh as asinh( self ) -> Self ;
2451
+ [ f64 ] libm:: acosh as acosh( self ) -> Self ;
2452
+ [ f64 ] libm:: atanh as atanh( self ) -> Self ;
2453
+ }
2454
+
2455
+ forward ! {
2456
+ libm:: fmaf128 as mul_add( self , a: Self , b: Self ) -> Self ;
2457
+ libm:: sqrtf128 as sqrt( self ) -> Self ;
2458
+ f128:: abs as abs( self ) -> Self ;
2459
+ f128:: copysign as copysign( self , other: Self ) -> Self ;
2460
+ }
2461
+
2462
+ #[ inline]
2463
+ fn sin_cos ( self ) -> ( Self , Self ) {
2464
+ let ( x, y) = libm:: sincos ( self as f64 ) ;
2465
+ ( x as Self , y as Self )
2466
+ }
2467
+ }
2468
+
2327
2469
macro_rules! float_const_impl {
2328
2470
( $( #[ $doc: meta] $constant: ident, ) +) => (
2329
2471
#[ allow( non_snake_case) ]
0 commit comments