tests sc_array_functions_test fail due to floating point precision

Milton Vandersloot miltonrobertvandersloot1412 at protonmail.com
Wed Dec 6 19:46:06 UTC 2017


Hi Eike

On December 4, 2017 10:22 PM, Eike Rathke wrote:
> From what I understood by browsing shortly gcc enables
> this by default for -std=gnu* and it can be unset by
> #pragma STDC FP_CONTRACT OFF
> [...]
> Could you try if adding the pragma to include/sal/config.h
> helps?

I gave it a try but GCC didn't appreciate it and threw warnings back at me:

    include/sal/config.h:100:0: warning: ignoring #pragma STDC FP_CONTRACT [-Wunknown-pragmas]

I didn't let the compilation finish since in light of the 
warning I expect the outcome to be the same as without pragma.
(If you think otherwise, let me know then I'll invest a couple
of hours into the compilation.)

The GCC version used was 6.4.0 but GCC 5 shows the same
behaviour. Sadly, I currently have no GCC 7 at my disposal to
test if that version supports the STDC FP_CONTRACT pragma (but
I don't think it does).

I took the liberty to google around a little. Here is what
I've found:

The GCC manual [0] (for version 6.4 but also for version 7.2)
states:

| Whether and how floating expressions are contracted when
| not disallowed by the FP_CONTRACT pragma (C99 and C11 6.5).
|
| Expressions are currently only contracted if
| -ffp-contract=fast, -funsafe-math-optimizations or
| -ffast-math are used. This is subject to change.

The C99 status page of GCC[1] reads:

| standard pragmas: Not implemented. Associated command-line
| options to control the state of the pragmas for the whole
| translation unit are available.

which hint to me that instead of the pragma we should use the
command line option -ffp-contract.

There is also GCC bug #37845 "gcc ignores FP_CONTRACT pragma
set to OFF". The last entry is:

| [...]
| Note: This bug was about FP contraction being done despite
| the use of:
| #pragma STDC FP_CONTRACT OFF
| not about the pragma being ignored (the implementation of
| this pragma is not required by the ISO C standard if the
| default is OFF, which is now the case with GCC). So, this
| bug is really fixed. A new enhancement bug could be opened
| (if not already done) for the implementation of the STDC
| FP_CONTRACT pragma.

So GCC does not recognize the pragma and its "default"
behaviour is "FP_CONTRACT=OFF". However, GCC enables
FP_CONTRACT as soon as -O2 (or higher) is enabled and the
target hardware supports it.

LLVM/clang seems to understand the pragma FP_CONTRACT, though
[3,4]

Best Milton


[0] https://gcc.gnu.org/onlinedocs/gcc-6.4.0/gcc/Floating-point-implementation.html
[1] https://gcc.gnu.org/c99status.html
[2] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37845
[3] https://reviews.llvm.org/D24481
[4] https://github.com/llvm-mirror/clang/blob/master/test/Preprocessor/pragma_unknown.c


More information about the LibreOffice mailing list