jorisvandenbossche commented on a change in pull request #9841:
URL: https://github.com/apache/arrow/pull/9841#discussion_r605646390



##########
File path: cpp/src/arrow/compute/kernels/scalar_arithmetic.cc
##########
@@ -233,6 +235,282 @@ struct DivideChecked {
   }
 };
 
+struct Power {
+  template <typename T, typename Arg0, typename Arg1>
+  static enable_if_signed_integer<T> Call(KernelContext* ctx, Arg0 left, Arg1 
right) {
+    Arg0 result = 1;
+    if (left == 0) {
+      if (right < 0) {
+        ARROW_PREDICT_FALSE(MultiplyWithOverflow(2, 
std::numeric_limits<Arg0>::max(), &result));
+        ctx->SetStatus(Status::Invalid("divide by zero"));
+        return result;
+      } else if (right == 0) {
+        return 1;
+      }
+      return 0;
+    } else if (right == INFINITY && abs(left) > 1) {
+      ARROW_PREDICT_FALSE(MultiplyWithOverflow(2, 
std::numeric_limits<Arg0>::max(), &result));
+      return result;
+    } else if (right == -INFINITY && abs(left) > 1) {
+      return 0;
+    }
+
+    if (right > 0) {
+      for (Arg1 i = 0; i < right; i++) {
+        if (ARROW_PREDICT_FALSE(MultiplyWithOverflow(result, left, &result))) {
+          ctx->SetStatus(Status::Invalid("overflow"));
+        }
+      }
+    } else {
+      for (Arg1 i = 0; i < -right; i++) {

Review comment:
       I *think* the reason this is not allowed in numpy is because it would 
not be type stable (an int to a negative power would give a float, but an int 
to a positive power preserves the integer dtype; so allowing both would give 
value-dependent result type). 
   
   For example plain Python also allows it:
   
   ```
   In [16]: 2 ** 2
   Out[16]: 4
   
   In [17]: 2 ** -2
   Out[17]: 0.25
   ```
   
   but for plain Python there is less need to type stability. 
   
   I think for Arrow we want to have kernels with defined input / output types?




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to