diff --git a/doc/site/modules/core/num.markdown b/doc/site/modules/core/num.markdown
index d8eea004..09fb78ae 100644
--- a/doc/site/modules/core/num.markdown
+++ b/doc/site/modules/core/num.markdown
@@ -35,6 +35,17 @@ The largest representable numeric value.
The smallest positive representable numeric value.
+### Num.**maxSafeInteger**
+
+The largest integer that Wren can safely represent. It's a constant value of `9007199254740991`.
+
+ This is relevant because Wren uses double precision [floating-point format](https://en.wikipedia.org/wiki/IEEE_floating_point)
+ for numbers, which can only safely represent integers between -(253 - 1) and 253 - 1.
+
+### Num.**minSafeInteger**
+
+The smallest integer Wren can safely represent. It's a constant value of `-9007199254740991`.
+
## Methods
### **abs**
diff --git a/src/vm/wren_core.c b/src/vm/wren_core.c
index ef72ccd0..4f893620 100644
--- a/src/vm/wren_core.c
+++ b/src/vm/wren_core.c
@@ -640,6 +640,9 @@ DEF_NUM_CONSTANT(tau, 6.28318530717958647692528676655900577)
DEF_NUM_CONSTANT(largest, DBL_MAX)
DEF_NUM_CONSTANT(smallest, DBL_MIN)
+DEF_NUM_CONSTANT(maxSafeInteger, 9007199254740991.0)
+DEF_NUM_CONSTANT(minSafeInteger, -9007199254740991.0)
+
// Defines a primitive on Num that calls infix [op] and returns [type].
#define DEF_NUM_INFIX(name, op, type) \
DEF_PRIMITIVE(num_##name) \
@@ -1336,6 +1339,8 @@ void wrenInitializeCore(WrenVM* vm)
PRIMITIVE(vm->numClass->obj.classObj, "tau", num_tau);
PRIMITIVE(vm->numClass->obj.classObj, "largest", num_largest);
PRIMITIVE(vm->numClass->obj.classObj, "smallest", num_smallest);
+ PRIMITIVE(vm->numClass->obj.classObj, "maxSafeInteger", num_maxSafeInteger);
+ PRIMITIVE(vm->numClass->obj.classObj, "minSafeInteger", num_minSafeInteger);
PRIMITIVE(vm->numClass, "-(_)", num_minus);
PRIMITIVE(vm->numClass, "+(_)", num_plus);
PRIMITIVE(vm->numClass, "*(_)", num_multiply);
diff --git a/test/core/number/maxSafeInteger.wren b/test/core/number/maxSafeInteger.wren
new file mode 100644
index 00000000..10acdb4f
--- /dev/null
+++ b/test/core/number/maxSafeInteger.wren
@@ -0,0 +1 @@
+System.print(Num.maxSafeInteger) // expect: 9.007199254741e+15
diff --git a/test/core/number/minSafeInteger.wren b/test/core/number/minSafeInteger.wren
new file mode 100644
index 00000000..4e5029cf
--- /dev/null
+++ b/test/core/number/minSafeInteger.wren
@@ -0,0 +1 @@
+System.print(Num.minSafeInteger) // expect: -9.007199254741e+15