diff --git a/src/mo_expression.F90 b/src/mo_expression.F90
index e82652399b0231bf694bda5e1278ffa4dcb9df5b..6d9d296067d39efd8213e7b740450223e69b0cc0 100644
--- a/src/mo_expression.F90
+++ b/src/mo_expression.F90
@@ -1050,9 +1050,15 @@ CONTAINS
     CLASS(t_op_pow), INTENT(INOUT) :: this
     CLASS(t_result_stack_0D), INTENT(INOUT) :: result_stack
     REAL(real_kind), POINTER :: arg1, arg2
+    INTEGER :: exponent
     CALL result_stack%pop(arg2)
     CALL result_stack%pop(arg1)
-    arg1 = arg1**arg2
+    exponent = arg2
+    IF (arg2 == exponent) THEN
+      arg1 = arg1**exponent
+    ELSE
+      arg1 = arg1**arg2
+    END IF
     CALL result_stack%push(arg1)
     DEALLOCATE (arg2)
   END SUBROUTINE stack_op_pow_eval_0D
@@ -1061,9 +1067,15 @@ CONTAINS
     CLASS(t_op_pow), INTENT(INOUT) :: this
     CLASS(t_result_stack_2D), INTENT(INOUT) :: result_stack
     REAL(real_kind), DIMENSION(:, :), POINTER :: arg1, arg2
+    INTEGER, DIMENSION(:, :), ALLOCATABLE :: exponent
     CALL result_stack%pop(arg2)
     CALL result_stack%pop(arg1)
-    arg1 = arg1**arg2
+    exponent = arg2
+    IF (ALL(arg2 == exponent)) THEN
+      arg1 = arg1**exponent
+    ELSE
+      arg1 = arg1**arg2
+    END IF
     CALL result_stack%push(arg1)
     DEALLOCATE (arg2)
   END SUBROUTINE stack_op_pow_eval_2D
@@ -1072,9 +1084,15 @@ CONTAINS
     CLASS(t_op_pow), INTENT(INOUT) :: this
     CLASS(t_result_stack_3D), INTENT(INOUT) :: result_stack
     REAL(real_kind), DIMENSION(:, :, :), POINTER :: arg1, arg2
+    INTEGER, DIMENSION(:, :, :), ALLOCATABLE :: exponent
     CALL result_stack%pop(arg2)
     CALL result_stack%pop(arg1)
-    arg1 = arg1**arg2
+    exponent = arg2
+    IF (ALL(arg2 == exponent)) THEN
+      arg1 = arg1**exponent
+    ELSE
+      arg1 = arg1**arg2
+    END IF
     CALL result_stack%push(arg1)
     DEALLOCATE (arg2)
   END SUBROUTINE stack_op_pow_eval_3D