diff --git a/py/runtime.c b/py/runtime.c
index 2928de8a7207eef951a8bc8f039cf589b1a19cec..ba78ec40f3dfb7a64daef69d05951fffe2dcfd46 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -42,6 +42,11 @@ const mp_obj_module_t mp_module___main__ = {
 };
 
 void mp_init(void) {
+    // call port specific initialization if any 
+#ifdef MICROPY_PORT_INIT_FUNC
+    MICROPY_PORT_INIT_FUNC;
+#endif
+
     mp_emit_glue_init();
 
     // init global module stuff
diff --git a/windows/Makefile b/windows/Makefile
index 351aad6f1af6ebad8a63041373df193895f418f2..ce75a609856c9fdbfbeb35615ca7a292a37b4789 100644
--- a/windows/Makefile
+++ b/windows/Makefile
@@ -31,6 +31,7 @@ SRC_C = \
 	unix/main.c \
 	unix/file.c \
 	realpath.c \
+	init.c \
 
 OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
 
diff --git a/windows/init.c b/windows/init.c
new file mode 100644
index 0000000000000000000000000000000000000000..78b8738f77badb0d581cf9bd7396be05d3fb527d
--- /dev/null
+++ b/windows/init.c
@@ -0,0 +1,5 @@
+#include <stdlib.h>
+
+void init() {
+    putenv("PRINTF_EXPONENT_DIGITS=2");
+}
diff --git a/windows/init.h b/windows/init.h
new file mode 100644
index 0000000000000000000000000000000000000000..d081a20527ef70d2a393b969aa4790183eb42eaa
--- /dev/null
+++ b/windows/init.h
@@ -0,0 +1 @@
+void init();
diff --git a/windows/mpconfigport.h b/windows/mpconfigport.h
index d27c59cb3185a6d6f027cf6c9ac5a14678e35999..94b33340071155d1b5f8752c421ccc13e5015fb7 100644
--- a/windows/mpconfigport.h
+++ b/windows/mpconfigport.h
@@ -15,6 +15,7 @@
 #define MICROPY_MOD_SYS_STDFILES    (1)
 #define MICROPY_FLOAT_IMPL          (MICROPY_FLOAT_IMPL_DOUBLE)
 #define MICROPY_LONGINT_IMPL        (MICROPY_LONGINT_IMPL_MPZ)
+#define MICROPY_PORT_INIT_FUNC      init()
 
 // type definitions for the specific machine
 
@@ -38,3 +39,4 @@ extern const struct _mp_obj_fun_native_t mp_builtin_open_obj;
     { MP_OBJ_NEW_QSTR(MP_QSTR_open), (mp_obj_t)&mp_builtin_open_obj },
 
 #include "realpath.h"
+#include "init.h"