@@ -517,8 +517,8 @@ fn random_nan<S: Semantics>(rng: &mut StdRng) -> IeeeFloat<S> {
517
517
///
518
518
/// For `powf*` operations of the form:
519
519
///
520
- /// - `x ^(±0)` where `x` is a SNaN
521
- /// - `1^y` where `y` is SNaN
520
+ /// - `(SNaN) ^(±0)`
521
+ /// - `1^( SNaN)`
522
522
///
523
523
/// The result is implementation-defined:
524
524
/// - musl returns for both `1.0`
@@ -553,13 +553,9 @@ fn fixed_float_value<S: Semantics>(
553
553
554
554
// x^(±0) = 1 for any x, even a NaN, *but* not a SNaN
555
555
( "powf32" | "powf64" , [ base, exp] ) if exp. is_zero ( ) => {
556
+ let rng = ecx. machine . rng . get_mut ( ) ;
556
557
// Handle both the musl and glibc cases non-deterministically.
557
- if base. is_signaling ( ) {
558
- let rng = ecx. machine . rng . get_mut ( ) ;
559
- if rng. random ( ) { one } else { random_nan ( rng) }
560
- } else {
561
- one
562
- }
558
+ if !base. is_signaling ( ) || rng. random ( ) { one } else { random_nan ( rng) }
563
559
}
564
560
565
561
// There are a lot of cases for fixed outputs according to the C Standard, but these are mainly INF or zero
@@ -570,7 +566,7 @@ fn fixed_float_value<S: Semantics>(
570
566
571
567
/// Returns `Some(output)` if `powi` (called `pown` in C) results in a fixed value specified in the C standard
572
568
/// (specifically, C23 annex F.10.4.6) when doing `base^exp`. Otherwise, returns `None`.
573
- // REVIEW : I'm not sure what I should document here about pown(1, SNaN) since musl and glibc do the same and the C standard is explicit here.
569
+ // TODO : I'm not sure what I should document here about pown(1, SNaN) since musl and glibc do the same and the C standard is explicit here.
574
570
fn fixed_powi_float_value < S : Semantics > (
575
571
ecx : & mut MiriInterpCx < ' _ > ,
576
572
base : IeeeFloat < S > ,
0 commit comments