diff --git a/ChangeLog b/ChangeLog
index 2bfca09e8db09fa905b0f99d0f89e31d9ade2abb..f701bb6253561e41f3d9bbed83adf0535d552f6b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -91,6 +91,10 @@ CVS code -
   read_file()
 	- Remove apparently unneeded logic to handle a case where
 	  current is NULL, since it shouldn't be NULL there. (DLR)
+  get_next_filename()
+	- Store the value of digits(ULONG_MAX) in a static, since it
+	  doesn't change and hence doesn't need to be recalculated.
+	  (DLR)
 - nano.c:
   do_verbatim_input()
 	- Move to text.c, since it's an advanced text-based operation.
diff --git a/src/files.c b/src/files.c
index 233e06de88b43e122fe0fab13f39c34cdbc74c7a..a7885dfa3f33ab20ce9f281249c3cc3121d8665d 100644
--- a/src/files.c
+++ b/src/files.c
@@ -628,16 +628,20 @@ int open_file(const char *filename, bool newfie, FILE **f)
  * extension exists, we return "". */
 char *get_next_filename(const char *name, const char *suffix)
 {
+    static int ulmax_digits = -1;
     unsigned long i = 0;
     char *buf;
     size_t namelen, suffixlen;
 
     assert(name != NULL && suffix != NULL);
 
+    if (ulmax_digits == -1)
+	ulmax_digits = digits(ULONG_MAX);
+
     namelen = strlen(name);
     suffixlen = strlen(suffix);
 
-    buf = charalloc(namelen + suffixlen + digits(ULONG_MAX) + 2);
+    buf = charalloc(namelen + suffixlen + ulmax_digits + 2);
     sprintf(buf, "%s%s", name, suffix);
 
     while (TRUE) {