diff --git a/.gitignore b/.gitignore
index 93fca5e5d252a76785b7d8a1fef3b9d5d5d5939a..9dd8f45c59a3fe637ce46978b967f1350f483877 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,4 @@ GTAGS
 /doc/lisp/elpa/
 /doc/*.png
 /doc/*.gnu
+/doc/filename.txt
diff --git a/src/language/modules/MathModule.cpp b/src/language/modules/MathModule.cpp
index 2217424e43bb9b276cf2260ce88c547252f88982..e73bfc4f5654f0864774ee2be8e1ada4b9d73927 100644
--- a/src/language/modules/MathModule.cpp
+++ b/src/language/modules/MathModule.cpp
@@ -2,6 +2,9 @@
 
 #include <language/utils/BuiltinFunctionEmbedder.hpp>
 
+#include <cmath>
+#include <cstdlib>
+
 MathModule::MathModule()
 {
   this->_addBuiltinFunction("sqrt", std::make_shared<BuiltinFunctionEmbedder<double(double)>>(
@@ -10,6 +13,9 @@ MathModule::MathModule()
   this->_addBuiltinFunction("abs", std::make_shared<BuiltinFunctionEmbedder<double(double)>>(
                                      [](double x) -> double { return std::abs(x); }));
 
+  this->_addBuiltinFunction("abs", std::make_shared<BuiltinFunctionEmbedder<uint64_t(int64_t)>>(
+                                     [](int64_t x) -> uint64_t { return std::abs(x); }));
+
   this->_addBuiltinFunction("sin", std::make_shared<BuiltinFunctionEmbedder<double(double)>>(
                                      [](double x) -> double { return std::sin(x); }));
 
diff --git a/tests/test_BuiltinFunctionProcessor.cpp b/tests/test_BuiltinFunctionProcessor.cpp
index 431fc186da94db30c013d73f565e8ede1619a5a2..60a4bd491f392b7cc0c303d94531edcf8634edbc 100644
--- a/tests/test_BuiltinFunctionProcessor.cpp
+++ b/tests/test_BuiltinFunctionProcessor.cpp
@@ -91,6 +91,15 @@ let x:R, x = sqrt(4);
       CHECK_BUILTIN_FUNCTION_EVALUATION_RESULT(data, "x", double{std::sqrt(4l)});
     }
 
+    {   // abs
+      tested_function_set.insert("abs:Z");
+      std::string_view data = R"(
+import math;
+let z:Z, z = abs(-3);
+)";
+      CHECK_BUILTIN_FUNCTION_EVALUATION_RESULT(data, "z", int64_t{std::abs(-3)});
+    }
+
     {   // abs
       tested_function_set.insert("abs:R");
       std::string_view data = R"(
diff --git a/tests/test_MathModule.cpp b/tests/test_MathModule.cpp
index 99801b5f1d6602cbc40b0308e20ea1c1d9009b24..99966d4bacebb938fce5bc686661b5c53e8d708e 100644
--- a/tests/test_MathModule.cpp
+++ b/tests/test_MathModule.cpp
@@ -13,9 +13,30 @@ TEST_CASE("MathModule", "[language]")
   MathModule math_module;
   const auto& name_builtin_function = math_module.getNameBuiltinFunctionMap();
 
-  REQUIRE(name_builtin_function.size() == 29);
+  REQUIRE(name_builtin_function.size() == 30);
 
-  SECTION("double -> double")
+  SECTION("Z -> N")
+  {
+    SECTION("abs:Z")
+    {
+      auto i_function = name_builtin_function.find("abs:Z");
+      REQUIRE(i_function != name_builtin_function.end());
+
+      IBuiltinFunctionEmbedder& function_embedder = *i_function->second;
+
+      int64_t arg = -3;
+
+      DataVariant arg_variant = arg;
+
+      DataVariant result_variant = function_embedder.apply({arg_variant});
+
+      uint64_t result = std::abs(arg);
+
+      REQUIRE(std::get<decltype(result)>(result_variant) == Catch::Approx(result));
+    }
+  }
+
+  SECTION("R -> R")
   {
     double arg = 0.7;
 
@@ -33,7 +54,7 @@ TEST_CASE("MathModule", "[language]")
       REQUIRE(std::get<decltype(result)>(result_variant) == Catch::Approx(result));
     }
 
-    SECTION("abs")
+    SECTION("abs:R")
     {
       auto i_function = name_builtin_function.find("abs:R");
       REQUIRE(i_function != name_builtin_function.end());
@@ -48,7 +69,7 @@ TEST_CASE("MathModule", "[language]")
       }
 
       {
-        arg = -3;
+        arg = double{-3};
 
         DataVariant arg_variant = arg;