diff --git a/COMPILE b/COMPILE
index 5b1c5b2c81c05d8acbfa73b9328637e97b3351d4..b63ae7f44441ba078b780e9b7b6eb68d6047b68a 100644
--- a/COMPILE
+++ b/COMPILE
@@ -15,7 +15,7 @@ flags.
 Fast math
 ---------
 
-Specifying "-ffast-math" is important for all compilers, since it allows the
+Specifying "-ffast-math" or "-ffp-contract=fast" is important for all compilers, since it allows the
 compiler to fuse multiplications and additions into FMA instructions, which is
 forbidden by the C99 standard. Since FMAs are a central aspect of the algorithm,
 they are needed for optimum performance.
@@ -25,8 +25,8 @@ to the C99 standard, you should still be able to compile libsharp with
 "-ffast-math" without any problems.
 
 
-Runtime CPU selection with gcc
-------------------------------
+Runtime CPU selection with gcc and clang
+----------------------------------------
 
 When using a recent gcc (6.0 and newer) or a recent clang (successfully tested
 with versions 6 and 7) on an x86_64 platform, the build machinery can compile
diff --git a/libsharp/sharp_core_inc.c b/libsharp/sharp_core_inc.c
index 331f8f7611a3c9999500253dfc53432eead6efbb..682558c2b8e596ef80d340d59884811f2af2ac2c 100644
--- a/libsharp/sharp_core_inc.c
+++ b/libsharp/sharp_core_inc.c
@@ -42,6 +42,11 @@
 #include "libsharp/sharp_internal.h"
 #include "c_utils/c_utils.h"
 
+// In the following, we explicitly allow the compiler to contract floating
+// point operations, like multiply-and-add.
+// Unfortunately, most compilers don't act on this pragma yet.
+#pragma STDC FP_CONTRACT ON
+
 typedef complex double dcmplx;
 
 #define nv0 (128/VLEN)