Skip to content

Commit

Permalink
windows/Makefile: Fix float exact int formatting on 32-bit mingw.
Browse files Browse the repository at this point in the history
When compiler optimizations are enabled on the mingw version of gcc, we are
getting failing tests because of rounding issues, for example:

    print(float("1e24"))

would print

    9.999999999999999e+23

instead of

    1e+24

It turns out special compiler options are needed to get GCC to use the SSE
instruction set instead of the 387 coprocessor (which uses 80-bit precision
internall).

Signed-off-by: David Lechner <david@pybricks.com>
  • Loading branch information
dlech authored and dpgeorge committed Feb 5, 2024
1 parent ac8e7f7 commit 23342ef
Showing 1 changed file with 9 additions and 0 deletions.
9 changes: 9 additions & 0 deletions ports/windows/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,15 @@ ifneq ($(FROZEN_MANIFEST),)
CFLAGS += -DMPZ_DIG_SIZE=16
endif

ifeq ($(shell $(CC) -dumpmachine),i686-w64-mingw32)
# GCC disables the SSE instruction set by default on i366 targets and we have
# to specify all three of these options to enable it.
# https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html (see -mfpmath=unit section)
# Enabling the SSE instruction set is necessary to get correct rounding of floating points.
# https://lemire.me/blog/2020/06/26/gcc-not-nearest
CFLAGS += -msse -mfpmath=sse -march=pentium4
endif

CXXFLAGS += $(filter-out -std=gnu99,$(CFLAGS))

include $(TOP)/py/mkrules.mk
Expand Down

0 comments on commit 23342ef

Please sign in to comment.