@@ -590,6 +590,38 @@ fn max_num() {
590
590
assert_eq ! ( 1.0 , nan. max( f1) . to_f64( ) ) ;
591
591
}
592
592
593
+ #[ test]
594
+ fn minimum ( ) {
595
+ let f1 = Double :: from_f64 ( 1.0 ) ;
596
+ let f2 = Double :: from_f64 ( 2.0 ) ;
597
+ let zp = Double :: from_f64 ( 0.0 ) ;
598
+ let zn = Double :: from_f64 ( -0.0 ) ;
599
+ let nan = Double :: NAN ;
600
+
601
+ assert_eq ! ( 1.0 , f1. minimum( f2) . to_f64( ) ) ;
602
+ assert_eq ! ( 1.0 , f2. minimum( f1) . to_f64( ) ) ;
603
+ assert_eq ! ( -0.0 , zp. minimum( zn) . to_f64( ) ) ;
604
+ assert_eq ! ( -0.0 , zn. minimum( zp) . to_f64( ) ) ;
605
+ assert ! ( f1. minimum( nan) . to_f64( ) . is_nan( ) ) ;
606
+ assert ! ( nan. minimum( f1) . to_f64( ) . is_nan( ) ) ;
607
+ }
608
+
609
+ #[ test]
610
+ fn maximum ( ) {
611
+ let f1 = Double :: from_f64 ( 1.0 ) ;
612
+ let f2 = Double :: from_f64 ( 2.0 ) ;
613
+ let zp = Double :: from_f64 ( 0.0 ) ;
614
+ let zn = Double :: from_f64 ( -0.0 ) ;
615
+ let nan = Double :: NAN ;
616
+
617
+ assert_eq ! ( 2.0 , f1. maximum( f2) . to_f64( ) ) ;
618
+ assert_eq ! ( 2.0 , f2. maximum( f1) . to_f64( ) ) ;
619
+ assert_eq ! ( 0.0 , zp. maximum( zn) . to_f64( ) ) ;
620
+ assert_eq ! ( 0.0 , zn. maximum( zp) . to_f64( ) ) ;
621
+ assert ! ( f1. maximum( nan) . to_f64( ) . is_nan( ) ) ;
622
+ assert ! ( nan. maximum( f1) . to_f64( ) . is_nan( ) ) ;
623
+ }
624
+
593
625
#[ test]
594
626
fn denormal ( ) {
595
627
// Test single precision
@@ -1003,6 +1035,7 @@ fn to_string() {
1003
1035
assert_eq ! ( "873.18340000000001" , to_string( 873.1834 , 0 , 1 ) ) ;
1004
1036
assert_eq ! ( "8.73183400000000010e+02" , to_string( 873.1834 , 0 , 0 ) ) ;
1005
1037
assert_eq ! ( "1.79769313486231570e+308" , to_string( 1.7976931348623157E+308 , 0 , 0 ) ) ;
1038
+ assert_eq ! ( "NaN" , X87DoubleExtended :: from_bits( 1 << 64 ) . to_string( ) ) ;
1006
1039
}
1007
1040
1008
1041
#[ test]
@@ -1072,11 +1105,11 @@ fn to_integer() {
1072
1105
1073
1106
#[ test]
1074
1107
fn nan ( ) {
1075
- fn nanbits < T : Float > ( signaling : bool , negative : bool , fill : u128 ) -> u128 {
1108
+ fn nanbits_from_u128 < T : Float > ( signaling : bool , negative : bool , payload : u128 ) -> u128 {
1076
1109
let x = if signaling {
1077
- T :: snan ( Some ( fill ) )
1110
+ T :: snan ( Some ( payload ) )
1078
1111
} else {
1079
- T :: qnan ( Some ( fill ) )
1112
+ T :: qnan ( Some ( payload ) )
1080
1113
} ;
1081
1114
if negative {
1082
1115
( -x) . to_bits ( )
@@ -1085,23 +1118,38 @@ fn nan() {
1085
1118
}
1086
1119
}
1087
1120
1088
- assert_eq ! ( 0x7fc00000 , nanbits:: <Single >( false , false , 0 ) ) ;
1089
- assert_eq ! ( 0xffc00000 , nanbits:: <Single >( false , true , 0 ) ) ;
1090
- assert_eq ! ( 0x7fc0ae72 , nanbits:: <Single >( false , false , 0xae72 ) ) ;
1091
- assert_eq ! ( 0x7fffae72 , nanbits:: <Single >( false , false , 0xffffae72 ) ) ;
1092
- assert_eq ! ( 0x7fa00000 , nanbits:: <Single >( true , false , 0 ) ) ;
1093
- assert_eq ! ( 0xffa00000 , nanbits:: <Single >( true , true , 0 ) ) ;
1094
- assert_eq ! ( 0x7f80ae72 , nanbits:: <Single >( true , false , 0xae72 ) ) ;
1095
- assert_eq ! ( 0x7fbfae72 , nanbits:: <Single >( true , false , 0xffffae72 ) ) ;
1096
-
1097
- assert_eq ! ( 0x7ff8000000000000 , nanbits:: <Double >( false , false , 0 ) ) ;
1098
- assert_eq ! ( 0xfff8000000000000 , nanbits:: <Double >( false , true , 0 ) ) ;
1099
- assert_eq ! ( 0x7ff800000000ae72 , nanbits:: <Double >( false , false , 0xae72 ) ) ;
1100
- assert_eq ! ( 0x7fffffffffffae72 , nanbits:: <Double >( false , false , 0xffffffffffffae72 ) ) ;
1101
- assert_eq ! ( 0x7ff4000000000000 , nanbits:: <Double >( true , false , 0 ) ) ;
1102
- assert_eq ! ( 0xfff4000000000000 , nanbits:: <Double >( true , true , 0 ) ) ;
1103
- assert_eq ! ( 0x7ff000000000ae72 , nanbits:: <Double >( true , false , 0xae72 ) ) ;
1104
- assert_eq ! ( 0x7ff7ffffffffae72 , nanbits:: <Double >( true , false , 0xffffffffffffae72 ) ) ;
1121
+ let tests_single = [
1122
+ // expected SNaN Neg payload
1123
+ ( 0x7fc00000 , false , false , 0x00000000 ) ,
1124
+ ( 0xffc00000 , false , true , 0x00000000 ) ,
1125
+ ( 0x7fc0ae72 , false , false , 0x0000ae72 ) ,
1126
+ ( 0x7fffae72 , false , false , 0xffffae72 ) ,
1127
+ ( 0x7fdaae72 , false , false , 0x00daae72 ) ,
1128
+ ( 0x7fa00000 , true , false , 0x00000000 ) ,
1129
+ ( 0xffa00000 , true , true , 0x00000000 ) ,
1130
+ ( 0x7f80ae72 , true , false , 0x0000ae72 ) ,
1131
+ ( 0x7fbfae72 , true , false , 0xffffae72 ) ,
1132
+ ( 0x7f9aae72 , true , false , 0x001aae72 ) ,
1133
+ ] ;
1134
+ let tests_double = [
1135
+ // expected SNaN Neg payload
1136
+ ( 0x7ff8000000000000 , false , false , 0x0000000000000000 ) ,
1137
+ ( 0xfff8000000000000 , false , true , 0x0000000000000000 ) ,
1138
+ ( 0x7ff800000000ae72 , false , false , 0x000000000000ae72 ) ,
1139
+ ( 0x7fffffffffffae72 , false , false , 0xffffffffffffae72 ) ,
1140
+ ( 0x7ffdaaaaaaaaae72 , false , false , 0x000daaaaaaaaae72 ) ,
1141
+ ( 0x7ff4000000000000 , true , false , 0x0000000000000000 ) ,
1142
+ ( 0xfff4000000000000 , true , true , 0x0000000000000000 ) ,
1143
+ ( 0x7ff000000000ae72 , true , false , 0x000000000000ae72 ) ,
1144
+ ( 0x7ff7ffffffffae72 , true , false , 0xffffffffffffae72 ) ,
1145
+ ( 0x7ff1aaaaaaaaae72 , true , false , 0x0001aaaaaaaaae72 ) ,
1146
+ ] ;
1147
+ for ( expected, signaling, negative, payload) in tests_single {
1148
+ assert_eq ! ( expected, nanbits_from_u128:: <Single >( signaling, negative, payload) ) ;
1149
+ }
1150
+ for ( expected, signaling, negative, payload) in tests_double {
1151
+ assert_eq ! ( expected, nanbits_from_u128:: <Double >( signaling, negative, payload) ) ;
1152
+ }
1105
1153
}
1106
1154
1107
1155
#[ test]
0 commit comments