diff --git a/src/macro/MacroValue.cc b/src/macro/MacroValue.cc
index 737168c93f7bbfdd2cba9a3c111dd0960aa8dc1c..6088bdb2bb180c3535053b7841ded50afff04ad6 100644
--- a/src/macro/MacroValue.cc
+++ b/src/macro/MacroValue.cc
@@ -18,6 +18,7 @@
  */
 
 #include <utility>
+#include <cmath>
 
 #include "MacroDriver.hh"
 
@@ -198,6 +199,15 @@ IntMV::divide(const MacroValuePtr &mv) noexcept(false)
   return make_shared<IntMV>(value / mv2->value);
 }
 
+MacroValuePtr
+IntMV::power(const MacroValuePtr &mv) noexcept(false)
+{
+  auto mv2 = dynamic_pointer_cast<IntMV>(mv);
+  if (!mv2)
+    throw TypeError("Type mismatch for operands of ^ operator");
+  return make_shared<IntMV>(pow(value, mv2->value));
+}
+
 shared_ptr<IntMV>
 IntMV::is_less(const MacroValuePtr &mv) noexcept(false)
 {
diff --git a/src/macro/MacroValue.hh b/src/macro/MacroValue.hh
index f0eff55e6ef15184edd3cf558a1ad82e6850d022..acb6447d84875508b11f61a5d3bdab6a7ff8d253 100644
--- a/src/macro/MacroValue.hh
+++ b/src/macro/MacroValue.hh
@@ -135,6 +135,7 @@ public:
   MacroValuePtr times(const MacroValuePtr &mv) noexcept(false) override;
   //! Computes arithmetic division
   MacroValuePtr divide(const MacroValuePtr &mv) noexcept(false) override;
+  MacroValuePtr power(const MacroValuePtr &mv) noexcept(false) override;
   shared_ptr<IntMV> is_less(const MacroValuePtr &mv) noexcept(false) override;
   shared_ptr<IntMV> is_greater(const MacroValuePtr &mv) noexcept(false) override;
   shared_ptr<IntMV> is_less_equal(const MacroValuePtr &mv) noexcept(false) override;