Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-compute/src/arithmetic/float.rs
6939 views
1
use arrow::array::PrimitiveArray as PArr;
2
3
use super::PrimitiveArithmeticKernelImpl;
4
use crate::arity::{prim_binary_values, prim_unary_values};
5
6
macro_rules! impl_float_arith_kernel {
7
($T:ty) => {
8
impl PrimitiveArithmeticKernelImpl for $T {
9
type TrueDivT = $T;
10
11
fn prim_wrapping_abs(lhs: PArr<$T>) -> PArr<$T> {
12
prim_unary_values(lhs, |x| x.abs())
13
}
14
15
fn prim_wrapping_neg(lhs: PArr<$T>) -> PArr<$T> {
16
prim_unary_values(lhs, |x| -x)
17
}
18
19
fn prim_wrapping_add(lhs: PArr<$T>, rhs: PArr<$T>) -> PArr<$T> {
20
prim_binary_values(lhs, rhs, |l, r| l + r)
21
}
22
23
fn prim_wrapping_sub(lhs: PArr<$T>, rhs: PArr<$T>) -> PArr<$T> {
24
prim_binary_values(lhs, rhs, |l, r| l - r)
25
}
26
27
fn prim_wrapping_mul(lhs: PArr<$T>, rhs: PArr<$T>) -> PArr<$T> {
28
prim_binary_values(lhs, rhs, |l, r| l * r)
29
}
30
31
fn prim_wrapping_floor_div(lhs: PArr<$T>, rhs: PArr<$T>) -> PArr<$T> {
32
prim_binary_values(lhs, rhs, |l, r| (l / r).floor())
33
}
34
35
fn prim_wrapping_trunc_div(lhs: PArr<$T>, rhs: PArr<$T>) -> PArr<$T> {
36
prim_binary_values(lhs, rhs, |l, r| (l / r).trunc())
37
}
38
39
fn prim_wrapping_mod(lhs: PArr<$T>, rhs: PArr<$T>) -> PArr<$T> {
40
prim_binary_values(lhs, rhs, |l, r| l - r * (l / r).floor())
41
}
42
43
fn prim_wrapping_add_scalar(lhs: PArr<$T>, rhs: $T) -> PArr<$T> {
44
if rhs == 0.0 {
45
return lhs;
46
}
47
prim_unary_values(lhs, |x| x + rhs)
48
}
49
50
fn prim_wrapping_sub_scalar(lhs: PArr<$T>, rhs: $T) -> PArr<$T> {
51
if rhs == 0.0 {
52
return lhs;
53
}
54
Self::prim_wrapping_add_scalar(lhs, -rhs)
55
}
56
57
fn prim_wrapping_sub_scalar_lhs(lhs: $T, rhs: PArr<$T>) -> PArr<$T> {
58
if lhs == 0.0 {
59
Self::prim_wrapping_neg(rhs)
60
} else {
61
prim_unary_values(rhs, |x| lhs - x)
62
}
63
}
64
65
fn prim_wrapping_mul_scalar(lhs: PArr<$T>, rhs: $T) -> PArr<$T> {
66
// No optimization for multiplication by zero, would invalidate NaNs/infinities.
67
if rhs == 1.0 {
68
lhs
69
} else if rhs == -1.0 {
70
Self::prim_wrapping_neg(lhs)
71
} else {
72
prim_unary_values(lhs, |x| x * rhs)
73
}
74
}
75
76
fn prim_wrapping_floor_div_scalar(lhs: PArr<$T>, rhs: $T) -> PArr<$T> {
77
let inv = 1.0 / rhs;
78
prim_unary_values(lhs, |x| (x * inv).floor())
79
}
80
81
fn prim_wrapping_floor_div_scalar_lhs(lhs: $T, rhs: PArr<$T>) -> PArr<$T> {
82
prim_unary_values(rhs, |x| (lhs / x).floor())
83
}
84
85
fn prim_wrapping_trunc_div_scalar(lhs: PArr<$T>, rhs: $T) -> PArr<$T> {
86
let inv = 1.0 / rhs;
87
prim_unary_values(lhs, |x| (x * inv).trunc())
88
}
89
90
fn prim_wrapping_trunc_div_scalar_lhs(lhs: $T, rhs: PArr<$T>) -> PArr<$T> {
91
prim_unary_values(rhs, |x| (lhs / x).trunc())
92
}
93
94
fn prim_wrapping_mod_scalar(lhs: PArr<$T>, rhs: $T) -> PArr<$T> {
95
let inv = 1.0 / rhs;
96
prim_unary_values(lhs, |x| x - rhs * (x * inv).floor())
97
}
98
99
fn prim_wrapping_mod_scalar_lhs(lhs: $T, rhs: PArr<$T>) -> PArr<$T> {
100
prim_unary_values(rhs, |x| lhs - x * (lhs / x).floor())
101
}
102
103
fn prim_checked_mul_scalar(_lhs: PArr<$T>, _rhs: $T) -> PArr<$T> {
104
unimplemented!()
105
}
106
107
fn prim_true_div(lhs: PArr<$T>, rhs: PArr<$T>) -> PArr<Self::TrueDivT> {
108
prim_binary_values(lhs, rhs, |l, r| l / r)
109
}
110
111
fn prim_true_div_scalar(lhs: PArr<$T>, rhs: $T) -> PArr<Self::TrueDivT> {
112
Self::prim_wrapping_mul_scalar(lhs, 1.0 / rhs)
113
}
114
115
fn prim_true_div_scalar_lhs(lhs: $T, rhs: PArr<$T>) -> PArr<Self::TrueDivT> {
116
prim_unary_values(rhs, |x| lhs / x)
117
}
118
}
119
};
120
}
121
122
impl_float_arith_kernel!(f32);
123
impl_float_arith_kernel!(f64);
124
125