@@ -982,6 +982,7 @@ impl ScalarValue {
982
982
DataType :: UInt16 => ScalarValue :: UInt16 ( Some ( 0 ) ) ,
983
983
DataType :: UInt32 => ScalarValue :: UInt32 ( Some ( 0 ) ) ,
984
984
DataType :: UInt64 => ScalarValue :: UInt64 ( Some ( 0 ) ) ,
985
+ DataType :: Float16 => ScalarValue :: Float16 ( Some ( f16:: from_f32 ( 0.0 ) ) ) ,
985
986
DataType :: Float32 => ScalarValue :: Float32 ( Some ( 0.0 ) ) ,
986
987
DataType :: Float64 => ScalarValue :: Float64 ( Some ( 0.0 ) ) ,
987
988
DataType :: Timestamp ( TimeUnit :: Second , tz) => {
@@ -1035,6 +1036,7 @@ impl ScalarValue {
1035
1036
DataType :: UInt16 => ScalarValue :: UInt16 ( Some ( 1 ) ) ,
1036
1037
DataType :: UInt32 => ScalarValue :: UInt32 ( Some ( 1 ) ) ,
1037
1038
DataType :: UInt64 => ScalarValue :: UInt64 ( Some ( 1 ) ) ,
1039
+ DataType :: Float16 => ScalarValue :: Float16 ( Some ( f16:: from_f32 ( 1.0 ) ) ) ,
1038
1040
DataType :: Float32 => ScalarValue :: Float32 ( Some ( 1.0 ) ) ,
1039
1041
DataType :: Float64 => ScalarValue :: Float64 ( Some ( 1.0 ) ) ,
1040
1042
_ => {
@@ -1053,6 +1055,7 @@ impl ScalarValue {
1053
1055
DataType :: Int16 | DataType :: UInt16 => ScalarValue :: Int16 ( Some ( -1 ) ) ,
1054
1056
DataType :: Int32 | DataType :: UInt32 => ScalarValue :: Int32 ( Some ( -1 ) ) ,
1055
1057
DataType :: Int64 | DataType :: UInt64 => ScalarValue :: Int64 ( Some ( -1 ) ) ,
1058
+ DataType :: Float16 => ScalarValue :: Float16 ( Some ( f16:: from_f32 ( -1.0 ) ) ) ,
1056
1059
DataType :: Float32 => ScalarValue :: Float32 ( Some ( -1.0 ) ) ,
1057
1060
DataType :: Float64 => ScalarValue :: Float64 ( Some ( -1.0 ) ) ,
1058
1061
_ => {
@@ -1074,6 +1077,7 @@ impl ScalarValue {
1074
1077
DataType :: UInt16 => ScalarValue :: UInt16 ( Some ( 10 ) ) ,
1075
1078
DataType :: UInt32 => ScalarValue :: UInt32 ( Some ( 10 ) ) ,
1076
1079
DataType :: UInt64 => ScalarValue :: UInt64 ( Some ( 10 ) ) ,
1080
+ DataType :: Float16 => ScalarValue :: Float16 ( Some ( f16:: from_f32 ( 10.0 ) ) ) ,
1077
1081
DataType :: Float32 => ScalarValue :: Float32 ( Some ( 10.0 ) ) ,
1078
1082
DataType :: Float64 => ScalarValue :: Float64 ( Some ( 10.0 ) ) ,
1079
1083
_ => {
@@ -1181,8 +1185,12 @@ impl ScalarValue {
1181
1185
| ScalarValue :: Int16 ( None )
1182
1186
| ScalarValue :: Int32 ( None )
1183
1187
| ScalarValue :: Int64 ( None )
1188
+ | ScalarValue :: Float16 ( None )
1184
1189
| ScalarValue :: Float32 ( None )
1185
1190
| ScalarValue :: Float64 ( None ) => Ok ( self . clone ( ) ) ,
1191
+ ScalarValue :: Float16 ( Some ( v) ) => {
1192
+ Ok ( ScalarValue :: Float16 ( Some ( f16:: from_f32 ( -v. to_f32 ( ) ) ) ) )
1193
+ }
1186
1194
ScalarValue :: Float64 ( Some ( v) ) => Ok ( ScalarValue :: Float64 ( Some ( -v) ) ) ,
1187
1195
ScalarValue :: Float32 ( Some ( v) ) => Ok ( ScalarValue :: Float32 ( Some ( -v) ) ) ,
1188
1196
ScalarValue :: Int8 ( Some ( v) ) => Ok ( ScalarValue :: Int8 ( Some ( v. neg_checked ( ) ?) ) ) ,
@@ -1435,6 +1443,9 @@ impl ScalarValue {
1435
1443
( Self :: UInt32 ( Some ( l) ) , Self :: UInt32 ( Some ( r) ) ) => Some ( l. abs_diff ( * r) as _ ) ,
1436
1444
( Self :: UInt64 ( Some ( l) ) , Self :: UInt64 ( Some ( r) ) ) => Some ( l. abs_diff ( * r) as _ ) ,
1437
1445
// TODO: we might want to look into supporting ceil/floor here for floats.
1446
+ ( Self :: Float16 ( Some ( l) ) , Self :: Float16 ( Some ( r) ) ) => {
1447
+ Some ( ( f16:: to_f32 ( * l) - f16:: to_f32 ( * r) ) . abs ( ) . round ( ) as _ )
1448
+ }
1438
1449
( Self :: Float32 ( Some ( l) ) , Self :: Float32 ( Some ( r) ) ) => {
1439
1450
Some ( ( l - r) . abs ( ) . round ( ) as _ )
1440
1451
}
@@ -2452,6 +2463,7 @@ impl ScalarValue {
2452
2463
DataType :: Boolean => typed_cast ! ( array, index, BooleanArray , Boolean ) ?,
2453
2464
DataType :: Float64 => typed_cast ! ( array, index, Float64Array , Float64 ) ?,
2454
2465
DataType :: Float32 => typed_cast ! ( array, index, Float32Array , Float32 ) ?,
2466
+ DataType :: Float16 => typed_cast ! ( array, index, Float16Array , Float16 ) ?,
2455
2467
DataType :: UInt64 => typed_cast ! ( array, index, UInt64Array , UInt64 ) ?,
2456
2468
DataType :: UInt32 => typed_cast ! ( array, index, UInt32Array , UInt32 ) ?,
2457
2469
DataType :: UInt16 => typed_cast ! ( array, index, UInt16Array , UInt16 ) ?,
@@ -5635,7 +5647,6 @@ mod tests {
5635
5647
}
5636
5648
5637
5649
#[ test]
5638
- #[ should_panic( expected = "Can not run arithmetic negative on scalar value Float16" ) ]
5639
5650
fn f16_test_overflow ( ) {
5640
5651
// TODO: if negate supports f16, add these cases to `test_scalar_negative_overflows` test case
5641
5652
let cases = [
@@ -5805,6 +5816,21 @@ mod tests {
5805
5816
ScalarValue :: UInt64 ( Some ( 10 ) ) ,
5806
5817
5 ,
5807
5818
) ,
5819
+ (
5820
+ ScalarValue :: Float16 ( Some ( f16:: from_f32 ( 1.1 ) ) ) ,
5821
+ ScalarValue :: Float16 ( Some ( f16:: from_f32 ( 1.9 ) ) ) ,
5822
+ 1 ,
5823
+ ) ,
5824
+ (
5825
+ ScalarValue :: Float16 ( Some ( f16:: from_f32 ( -5.3 ) ) ) ,
5826
+ ScalarValue :: Float16 ( Some ( f16:: from_f32 ( -9.2 ) ) ) ,
5827
+ 4 ,
5828
+ ) ,
5829
+ (
5830
+ ScalarValue :: Float16 ( Some ( f16:: from_f32 ( -5.3 ) ) ) ,
5831
+ ScalarValue :: Float16 ( Some ( f16:: from_f32 ( -9.7 ) ) ) ,
5832
+ 4 ,
5833
+ ) ,
5808
5834
(
5809
5835
ScalarValue :: Float32 ( Some ( 1.0 ) ) ,
5810
5836
ScalarValue :: Float32 ( Some ( 2.0 ) ) ,
@@ -5877,6 +5903,14 @@ mod tests {
5877
5903
// Different type
5878
5904
( ScalarValue :: Int8 ( Some ( 1 ) ) , ScalarValue :: Int16 ( Some ( 1 ) ) ) ,
5879
5905
( ScalarValue :: Int8 ( Some ( 1 ) ) , ScalarValue :: Float32 ( Some ( 1.0 ) ) ) ,
5906
+ (
5907
+ ScalarValue :: Float16 ( Some ( f16:: from_f32 ( 1.0 ) ) ) ,
5908
+ ScalarValue :: Float32 ( Some ( 1.0 ) ) ,
5909
+ ) ,
5910
+ (
5911
+ ScalarValue :: Float16 ( Some ( f16:: from_f32 ( 1.0 ) ) ) ,
5912
+ ScalarValue :: Int32 ( Some ( 1 ) ) ,
5913
+ ) ,
5880
5914
(
5881
5915
ScalarValue :: Float64 ( Some ( 1.1 ) ) ,
5882
5916
ScalarValue :: Float32 ( Some ( 2.2 ) ) ,
0 commit comments