@@ -153,8 +153,12 @@ libm_macros::for_each_function! {
153
153
fmodf16,
154
154
frexp,
155
155
frexpf,
156
+ frexpf128,
157
+ frexpf16,
156
158
ilogb,
157
159
ilogbf,
160
+ ilogbf128,
161
+ ilogbf16,
158
162
jn,
159
163
jnf,
160
164
ldexp,
@@ -299,43 +303,6 @@ macro_rules! impl_op_for_ty {
299
303
}
300
304
}
301
305
302
- impl MpOp for crate :: op:: [ <frexp $suffix>] :: Routine {
303
- type MpTy = MpFloat ;
304
-
305
- fn new_mp( ) -> Self :: MpTy {
306
- new_mpfloat:: <Self :: FTy >( )
307
- }
308
-
309
- fn run( this: & mut Self :: MpTy , input: Self :: RustArgs ) -> Self :: RustRet {
310
- this. assign( input. 0 ) ;
311
- let exp = this. frexp_mut( ) ;
312
- ( prep_retval:: <Self :: FTy >( this, Ordering :: Equal ) , exp)
313
- }
314
- }
315
-
316
- impl MpOp for crate :: op:: [ <ilogb $suffix>] :: Routine {
317
- type MpTy = MpFloat ;
318
-
319
- fn new_mp( ) -> Self :: MpTy {
320
- new_mpfloat:: <Self :: FTy >( )
321
- }
322
-
323
- fn run( this: & mut Self :: MpTy , input: Self :: RustArgs ) -> Self :: RustRet {
324
- this. assign( input. 0 ) ;
325
-
326
- // `get_exp` follows `frexp` for `0.5 <= |m| < 1.0`. Adjust the exponent by
327
- // one to scale the significand to `1.0 <= |m| < 2.0`.
328
- this. get_exp( ) . map( |v| v - 1 ) . unwrap_or_else( || {
329
- if this. is_infinite( ) {
330
- i32 :: MAX
331
- } else {
332
- // Zero or NaN
333
- i32 :: MIN
334
- }
335
- } )
336
- }
337
- }
338
-
339
306
impl MpOp for crate :: op:: [ <jn $suffix>] :: Routine {
340
307
type MpTy = MpFloat ;
341
308
@@ -466,6 +433,48 @@ macro_rules! impl_op_for_ty_all {
466
433
prep_retval:: <Self :: RustRet >( & mut this. 0 , ord)
467
434
}
468
435
}
436
+
437
+ impl MpOp for crate :: op:: [ <frexp $suffix>] :: Routine {
438
+ type MpTy = MpFloat ;
439
+
440
+ fn new_mp( ) -> Self :: MpTy {
441
+ new_mpfloat:: <Self :: FTy >( )
442
+ }
443
+
444
+ fn run( this: & mut Self :: MpTy , input: Self :: RustArgs ) -> Self :: RustRet {
445
+ // Implementation taken from `rug::Float::to_f32_exp`.
446
+ this. assign( input. 0 ) ;
447
+ let exp = this. get_exp( ) . unwrap_or( 0 ) ;
448
+ if exp != 0 {
449
+ * this >>= exp;
450
+ }
451
+
452
+ ( prep_retval:: <Self :: FTy >( this, Ordering :: Equal ) , exp)
453
+ }
454
+ }
455
+
456
+ impl MpOp for crate :: op:: [ <ilogb $suffix>] :: Routine {
457
+ type MpTy = MpFloat ;
458
+
459
+ fn new_mp( ) -> Self :: MpTy {
460
+ new_mpfloat:: <Self :: FTy >( )
461
+ }
462
+
463
+ fn run( this: & mut Self :: MpTy , input: Self :: RustArgs ) -> Self :: RustRet {
464
+ this. assign( input. 0 ) ;
465
+
466
+ // `get_exp` follows `frexp` for `0.5 <= |m| < 1.0`. Adjust the exponent by
467
+ // one to scale the significand to `1.0 <= |m| < 2.0`.
468
+ this. get_exp( ) . map( |v| v - 1 ) . unwrap_or_else( || {
469
+ if this. is_infinite( ) {
470
+ i32 :: MAX
471
+ } else {
472
+ // Zero or NaN
473
+ i32 :: MIN
474
+ }
475
+ } )
476
+ }
477
+ }
469
478
}
470
479
} ;
471
480
}
0 commit comments