@@ -157,13 +157,18 @@ fn basic() {
157
157
assert_eq ( -{ 5.0_f128 } , -5.0_f128 ) ;
158
158
159
159
// infinities, NaN
160
- // FIXME(f16_f128): add when constants and `is_infinite` are available
160
+ assert ! ( ( 5.0_f16 / 0.0 ) . is_infinite( ) ) ;
161
+ assert_ne ! ( { 5.0_f16 / 0.0 } , { -5.0_f16 / 0.0 } ) ;
161
162
assert ! ( ( 5.0_f32 / 0.0 ) . is_infinite( ) ) ;
162
163
assert_ne ! ( { 5.0_f32 / 0.0 } , { -5.0_f32 / 0.0 } ) ;
163
164
assert ! ( ( 5.0_f64 / 0.0 ) . is_infinite( ) ) ;
164
165
assert_ne ! ( { 5.0_f64 / 0.0 } , { 5.0_f64 / -0.0 } ) ;
166
+ assert ! ( ( 5.0_f128 / 0.0 ) . is_infinite( ) ) ;
167
+ assert_ne ! ( { 5.0_f128 / 0.0 } , { 5.0_f128 / -0.0 } ) ;
168
+ assert_ne ! ( f16:: NAN , f16:: NAN ) ;
165
169
assert_ne ! ( f32 :: NAN , f32 :: NAN ) ;
166
170
assert_ne ! ( f64 :: NAN , f64 :: NAN ) ;
171
+ assert_ne ! ( f128:: NAN , f128:: NAN ) ;
167
172
168
173
// negative zero
169
174
let posz = 0.0f16 ;
@@ -215,9 +220,14 @@ fn basic() {
215
220
assert ! ( ( black_box( -1.0f128 ) % 1.0 ) . is_sign_negative( ) ) ;
216
221
assert ! ( ( black_box( -1.0f128 ) % -1.0 ) . is_sign_negative( ) ) ;
217
222
218
- // FIXME(f16_f128): add when `abs` is available
223
+ assert_eq ! ( ( -1.0f16 ) . abs( ) , 1.0f16 ) ;
224
+ assert_eq ! ( 34.2f16 . abs( ) , 34.2f16 ) ;
219
225
assert_eq ! ( ( -1.0f32 ) . abs( ) , 1.0f32 ) ;
226
+ assert_eq ! ( 34.2f32 . abs( ) , 34.2f32 ) ;
227
+ assert_eq ! ( ( -1.0f64 ) . abs( ) , 1.0f64 ) ;
220
228
assert_eq ! ( 34.2f64 . abs( ) , 34.2f64 ) ;
229
+ assert_eq ! ( ( -1.0f128 ) . abs( ) , 1.0f128 ) ;
230
+ assert_eq ! ( 34.2f128 . abs( ) , 34.2f128 ) ;
221
231
}
222
232
223
233
/// Test casts from floats to ints and back
@@ -654,6 +664,14 @@ fn casts() {
654
664
}
655
665
656
666
fn ops ( ) {
667
+ // f16 min/max
668
+ assert_eq ( ( 1.0_f16 ) . max ( -1.0 ) , 1.0 ) ;
669
+ assert_eq ( ( 1.0_f16 ) . min ( -1.0 ) , -1.0 ) ;
670
+ assert_eq ( f16:: NAN . min ( 9.0 ) , 9.0 ) ;
671
+ assert_eq ( f16:: NAN . max ( -9.0 ) , -9.0 ) ;
672
+ assert_eq ( ( 9.0_f16 ) . min ( f16:: NAN ) , 9.0 ) ;
673
+ assert_eq ( ( -9.0_f16 ) . max ( f16:: NAN ) , -9.0 ) ;
674
+
657
675
// f32 min/max
658
676
assert_eq ( ( 1.0 as f32 ) . max ( -1.0 ) , 1.0 ) ;
659
677
assert_eq ( ( 1.0 as f32 ) . min ( -1.0 ) , -1.0 ) ;
@@ -670,6 +688,21 @@ fn ops() {
670
688
assert_eq ( ( 9.0 as f64 ) . min ( f64:: NAN ) , 9.0 ) ;
671
689
assert_eq ( ( -9.0 as f64 ) . max ( f64:: NAN ) , -9.0 ) ;
672
690
691
+ // f128 min/max
692
+ assert_eq ( ( 1.0_f128 ) . max ( -1.0 ) , 1.0 ) ;
693
+ assert_eq ( ( 1.0_f128 ) . min ( -1.0 ) , -1.0 ) ;
694
+ assert_eq ( f128:: NAN . min ( 9.0 ) , 9.0 ) ;
695
+ assert_eq ( f128:: NAN . max ( -9.0 ) , -9.0 ) ;
696
+ assert_eq ( ( 9.0_f128 ) . min ( f128:: NAN ) , 9.0 ) ;
697
+ assert_eq ( ( -9.0_f128 ) . max ( f128:: NAN ) , -9.0 ) ;
698
+
699
+ // f16 copysign
700
+ assert_eq ( 3.5_f16 . copysign ( 0.42 ) , 3.5_f16 ) ;
701
+ assert_eq ( 3.5_f16 . copysign ( -0.42 ) , -3.5_f16 ) ;
702
+ assert_eq ( ( -3.5_f16 ) . copysign ( 0.42 ) , 3.5_f16 ) ;
703
+ assert_eq ( ( -3.5_f16 ) . copysign ( -0.42 ) , -3.5_f16 ) ;
704
+ assert ! ( f16:: NAN . copysign( 1.0 ) . is_nan( ) ) ;
705
+
673
706
// f32 copysign
674
707
assert_eq ( 3.5_f32 . copysign ( 0.42 ) , 3.5_f32 ) ;
675
708
assert_eq ( 3.5_f32 . copysign ( -0.42 ) , -3.5_f32 ) ;
@@ -683,6 +716,13 @@ fn ops() {
683
716
assert_eq ( ( -3.5_f64 ) . copysign ( 0.42 ) , 3.5_f64 ) ;
684
717
assert_eq ( ( -3.5_f64 ) . copysign ( -0.42 ) , -3.5_f64 ) ;
685
718
assert ! ( f64 :: NAN . copysign( 1.0 ) . is_nan( ) ) ;
719
+
720
+ // f128 copysign
721
+ assert_eq ( 3.5_f128 . copysign ( 0.42 ) , 3.5_f128 ) ;
722
+ assert_eq ( 3.5_f128 . copysign ( -0.42 ) , -3.5_f128 ) ;
723
+ assert_eq ( ( -3.5_f128 ) . copysign ( 0.42 ) , 3.5_f128 ) ;
724
+ assert_eq ( ( -3.5_f128 ) . copysign ( -0.42 ) , -3.5_f128 ) ;
725
+ assert ! ( f128:: NAN . copysign( 1.0 ) . is_nan( ) ) ;
686
726
}
687
727
688
728
/// Tests taken from rustc test suite.
@@ -807,6 +847,18 @@ fn nan_casts() {
807
847
808
848
fn rounding ( ) {
809
849
// Test cases taken from the library's tests for this feature
850
+ // f16
851
+ assert_eq ( 2.5f16 . round_ties_even ( ) , 2.0f16 ) ;
852
+ assert_eq ( 1.0f16 . round_ties_even ( ) , 1.0f16 ) ;
853
+ assert_eq ( 1.3f16 . round_ties_even ( ) , 1.0f16 ) ;
854
+ assert_eq ( 1.5f16 . round_ties_even ( ) , 2.0f16 ) ;
855
+ assert_eq ( 1.7f16 . round_ties_even ( ) , 2.0f16 ) ;
856
+ assert_eq ( 0.0f16 . round_ties_even ( ) , 0.0f16 ) ;
857
+ assert_eq ( ( -0.0f16 ) . round_ties_even ( ) , -0.0f16 ) ;
858
+ assert_eq ( ( -1.0f16 ) . round_ties_even ( ) , -1.0f16 ) ;
859
+ assert_eq ( ( -1.3f16 ) . round_ties_even ( ) , -1.0f16 ) ;
860
+ assert_eq ( ( -1.5f16 ) . round_ties_even ( ) , -2.0f16 ) ;
861
+ assert_eq ( ( -1.7f16 ) . round_ties_even ( ) , -2.0f16 ) ;
810
862
// f32
811
863
assert_eq ( 2.5f32 . round_ties_even ( ) , 2.0f32 ) ;
812
864
assert_eq ( 1.0f32 . round_ties_even ( ) , 1.0f32 ) ;
@@ -831,23 +883,59 @@ fn rounding() {
831
883
assert_eq ( ( -1.3f64 ) . round_ties_even ( ) , -1.0f64 ) ;
832
884
assert_eq ( ( -1.5f64 ) . round_ties_even ( ) , -2.0f64 ) ;
833
885
assert_eq ( ( -1.7f64 ) . round_ties_even ( ) , -2.0f64 ) ;
834
-
886
+ // f128
887
+ assert_eq ( 2.5f128 . round_ties_even ( ) , 2.0f128 ) ;
888
+ assert_eq ( 1.0f128 . round_ties_even ( ) , 1.0f128 ) ;
889
+ assert_eq ( 1.3f128 . round_ties_even ( ) , 1.0f128 ) ;
890
+ assert_eq ( 1.5f128 . round_ties_even ( ) , 2.0f128 ) ;
891
+ assert_eq ( 1.7f128 . round_ties_even ( ) , 2.0f128 ) ;
892
+ assert_eq ( 0.0f128 . round_ties_even ( ) , 0.0f128 ) ;
893
+ assert_eq ( ( -0.0f128 ) . round_ties_even ( ) , -0.0f128 ) ;
894
+ assert_eq ( ( -1.0f128 ) . round_ties_even ( ) , -1.0f128 ) ;
895
+ assert_eq ( ( -1.3f128 ) . round_ties_even ( ) , -1.0f128 ) ;
896
+ assert_eq ( ( -1.5f128 ) . round_ties_even ( ) , -2.0f128 ) ;
897
+ assert_eq ( ( -1.7f128 ) . round_ties_even ( ) , -2.0f128 ) ;
898
+
899
+ assert_eq ! ( 3.8f16 . floor( ) , 3.0f16 ) ;
900
+ assert_eq ! ( ( -1.1f16 ) . floor( ) , -2.0f16 ) ;
835
901
assert_eq ! ( 3.8f32 . floor( ) , 3.0f32 ) ;
902
+ assert_eq ! ( ( -1.1f32 ) . floor( ) , -2.0f32 ) ;
903
+ assert_eq ! ( 3.8f64 . floor( ) , 3.0f64 ) ;
836
904
assert_eq ! ( ( -1.1f64 ) . floor( ) , -2.0f64 ) ;
905
+ assert_eq ! ( 3.8f128 . floor( ) , 3.0f128 ) ;
906
+ assert_eq ! ( ( -1.1f128 ) . floor( ) , -2.0f128 ) ;
837
907
908
+ assert_eq ! ( 3.8f16 . ceil( ) , 4.0f16 ) ;
909
+ assert_eq ! ( ( -2.3f16 ) . ceil( ) , -2.0f16 ) ;
910
+ assert_eq ! ( 3.8f32 . ceil( ) , 4.0f32 ) ;
838
911
assert_eq ! ( ( -2.3f32 ) . ceil( ) , -2.0f32 ) ;
839
912
assert_eq ! ( 3.8f64 . ceil( ) , 4.0f64 ) ;
913
+ assert_eq ! ( ( -2.3f64 ) . ceil( ) , -2.0f64 ) ;
914
+ assert_eq ! ( 3.8f128 . ceil( ) , 4.0f128 ) ;
915
+ assert_eq ! ( ( -2.3f128 ) . ceil( ) , -2.0f128 ) ;
840
916
917
+ assert_eq ! ( 0.1f16 . trunc( ) , 0.0f16 ) ;
918
+ assert_eq ! ( ( -0.1f16 ) . trunc( ) , 0.0f16 ) ;
841
919
assert_eq ! ( 0.1f32 . trunc( ) , 0.0f32 ) ;
920
+ assert_eq ! ( ( -0.1f32 ) . trunc( ) , 0.0f32 ) ;
921
+ assert_eq ! ( 0.1f64 . trunc( ) , 0.0f64 ) ;
842
922
assert_eq ! ( ( -0.1f64 ) . trunc( ) , 0.0f64 ) ;
923
+ assert_eq ! ( 0.1f128 . trunc( ) , 0.0f128 ) ;
924
+ assert_eq ! ( ( -0.1f128 ) . trunc( ) , 0.0f128 ) ;
843
925
926
+ assert_eq ! ( 3.3_f16 . round( ) , 3.0 ) ;
927
+ assert_eq ! ( 2.5_f16 . round( ) , 3.0 ) ;
844
928
assert_eq ! ( 3.3_f32 . round( ) , 3.0 ) ;
845
929
assert_eq ! ( 2.5_f32 . round( ) , 3.0 ) ;
846
930
assert_eq ! ( 3.9_f64 . round( ) , 4.0 ) ;
847
931
assert_eq ! ( 2.5_f64 . round( ) , 3.0 ) ;
932
+ assert_eq ! ( 3.9_f128 . round( ) , 4.0 ) ;
933
+ assert_eq ! ( 2.5_f128 . round( ) , 3.0 ) ;
848
934
}
849
935
850
936
fn mul_add ( ) {
937
+ // FIXME(f16_f128): add when supported
938
+
851
939
assert_eq ! ( 3.0f32 . mul_add( 2.0f32 , 5.0f32 ) , 11.0 ) ;
852
940
assert_eq ! ( 0.0f32 . mul_add( -2.0 , f32 :: consts:: E ) , f32 :: consts:: E ) ;
853
941
assert_eq ! ( 3.0f64 . mul_add( 2.0 , 5.0 ) , 11.0 ) ;
@@ -983,7 +1071,7 @@ fn test_fast() {
983
1071
use std:: intrinsics:: { fadd_fast, fdiv_fast, fmul_fast, frem_fast, fsub_fast} ;
984
1072
985
1073
#[ inline( never) ]
986
- pub fn test_operations_f64 ( a : f64 , b : f64 ) {
1074
+ pub fn test_operations_f16 ( a : f16 , b : f16 ) {
987
1075
// make sure they all map to the correct operation
988
1076
unsafe {
989
1077
assert_eq ! ( fadd_fast( a, b) , a + b) ;
@@ -1006,10 +1094,38 @@ fn test_fast() {
1006
1094
}
1007
1095
}
1008
1096
1009
- test_operations_f64 ( 1. , 2. ) ;
1010
- test_operations_f64 ( 10. , 5. ) ;
1097
+ #[ inline( never) ]
1098
+ pub fn test_operations_f64 ( a : f64 , b : f64 ) {
1099
+ // make sure they all map to the correct operation
1100
+ unsafe {
1101
+ assert_eq ! ( fadd_fast( a, b) , a + b) ;
1102
+ assert_eq ! ( fsub_fast( a, b) , a - b) ;
1103
+ assert_eq ! ( fmul_fast( a, b) , a * b) ;
1104
+ assert_eq ! ( fdiv_fast( a, b) , a / b) ;
1105
+ assert_eq ! ( frem_fast( a, b) , a % b) ;
1106
+ }
1107
+ }
1108
+
1109
+ #[ inline( never) ]
1110
+ pub fn test_operations_f128 ( a : f128 , b : f128 ) {
1111
+ // make sure they all map to the correct operation
1112
+ unsafe {
1113
+ assert_eq ! ( fadd_fast( a, b) , a + b) ;
1114
+ assert_eq ! ( fsub_fast( a, b) , a - b) ;
1115
+ assert_eq ! ( fmul_fast( a, b) , a * b) ;
1116
+ assert_eq ! ( fdiv_fast( a, b) , a / b) ;
1117
+ assert_eq ! ( frem_fast( a, b) , a % b) ;
1118
+ }
1119
+ }
1120
+
1121
+ test_operations_f16 ( 11. , 2. ) ;
1122
+ test_operations_f16 ( 10. , 15. ) ;
1011
1123
test_operations_f32 ( 11. , 2. ) ;
1012
1124
test_operations_f32 ( 10. , 15. ) ;
1125
+ test_operations_f64 ( 1. , 2. ) ;
1126
+ test_operations_f64 ( 10. , 5. ) ;
1127
+ test_operations_f128 ( 1. , 2. ) ;
1128
+ test_operations_f128 ( 10. , 5. ) ;
1013
1129
}
1014
1130
1015
1131
fn test_algebraic ( ) {
@@ -1018,7 +1134,7 @@ fn test_algebraic() {
1018
1134
} ;
1019
1135
1020
1136
#[ inline( never) ]
1021
- pub fn test_operations_f64 ( a : f64 , b : f64 ) {
1137
+ pub fn test_operations_f16 ( a : f16 , b : f16 ) {
1022
1138
// make sure they all map to the correct operation
1023
1139
assert_eq ! ( fadd_algebraic( a, b) , a + b) ;
1024
1140
assert_eq ! ( fsub_algebraic( a, b) , a - b) ;
@@ -1037,15 +1153,41 @@ fn test_algebraic() {
1037
1153
assert_eq ! ( frem_algebraic( a, b) , a % b) ;
1038
1154
}
1039
1155
1040
- test_operations_f64 ( 1. , 2. ) ;
1041
- test_operations_f64 ( 10. , 5. ) ;
1156
+ #[ inline( never) ]
1157
+ pub fn test_operations_f64 ( a : f64 , b : f64 ) {
1158
+ // make sure they all map to the correct operation
1159
+ assert_eq ! ( fadd_algebraic( a, b) , a + b) ;
1160
+ assert_eq ! ( fsub_algebraic( a, b) , a - b) ;
1161
+ assert_eq ! ( fmul_algebraic( a, b) , a * b) ;
1162
+ assert_eq ! ( fdiv_algebraic( a, b) , a / b) ;
1163
+ assert_eq ! ( frem_algebraic( a, b) , a % b) ;
1164
+ }
1165
+
1166
+ #[ inline( never) ]
1167
+ pub fn test_operations_f128 ( a : f128 , b : f128 ) {
1168
+ // make sure they all map to the correct operation
1169
+ assert_eq ! ( fadd_algebraic( a, b) , a + b) ;
1170
+ assert_eq ! ( fsub_algebraic( a, b) , a - b) ;
1171
+ assert_eq ! ( fmul_algebraic( a, b) , a * b) ;
1172
+ assert_eq ! ( fdiv_algebraic( a, b) , a / b) ;
1173
+ assert_eq ! ( frem_algebraic( a, b) , a % b) ;
1174
+ }
1175
+
1176
+ test_operations_f16 ( 11. , 2. ) ;
1177
+ test_operations_f16 ( 10. , 15. ) ;
1042
1178
test_operations_f32 ( 11. , 2. ) ;
1043
1179
test_operations_f32 ( 10. , 15. ) ;
1180
+ test_operations_f64 ( 1. , 2. ) ;
1181
+ test_operations_f64 ( 10. , 5. ) ;
1182
+ test_operations_f128 ( 1. , 2. ) ;
1183
+ test_operations_f128 ( 10. , 5. ) ;
1044
1184
}
1045
1185
1046
1186
fn test_fmuladd ( ) {
1047
1187
use std:: intrinsics:: { fmuladdf32, fmuladdf64} ;
1048
1188
1189
+ // FIXME(f16_f128): add when supported
1190
+
1049
1191
#[ inline( never) ]
1050
1192
pub fn test_operations_f32 ( a : f32 , b : f32 , c : f32 ) {
1051
1193
assert_approx_eq ! ( unsafe { fmuladdf32( a, b, c) } , a * b + c) ;
0 commit comments