diff --git a/src/pl/plperl/plperl.h b/src/pl/plperl/plperl.h
index 12fbad9787..0a77860b98 100644
--- a/src/pl/plperl/plperl.h
+++ b/src/pl/plperl/plperl.h
@@ -40,10 +40,15 @@
 
 /*
  * ActivePerl 5.18 and later are MinGW-built, and their headers use GCC's
- * __inline__.  Translate to something MSVC recognizes.
+ * __inline__.  Translate to something MSVC recognizes. Also, perl.h sometimes
+ * defines isnan, so undefine it here and put back the definition later if
+ * perl.h doesn't.
  */
 #ifdef _MSC_VER
 #define __inline__ inline
+#ifdef isname
+#undef isnan
+#endif
 #endif
 
 /*
@@ -135,6 +140,13 @@
 #define vprintf			pg_vprintf
 #define printf(...)		pg_printf(__VA_ARGS__)
 
+/* put back the definition of isnan if needed */
+#ifdef _MSC_VER
+#ifndef isnan
+#define isnan(x) _isnan(x)
+#endif
+#endif
+
 /* perl version and platform portability */
 #define NEED_eval_pv
 #define NEED_newRV_noinc