<html><body><p><tt><font size="2">Serge Pavlov <sepavloff@gmail.com> wrote on 05.03.2020 18:48:33:<br><br>>> I'm not sure what problem you see here.  In default mode, i.e.<br>>> when there is no "#pragma STDC FENV_ACCESS on" in effect,<br>>> then the compiler can always assume that the default rounding<br>>> mode is in effect.  </font></tt><br><tt><font size="2">> <br>> Well, if #pragma STDC FENV_ACCESS on is not in effect, that means<br>> that the user has promised that at this point during execution,<br>> we will *always* have the default FP environment.</font></tt><br><tt><font size="2">>  </font></tt><br><tt><font size="2">> This is a strong statement (no pragma == default mode), we need to <br>> confirm it with proper references to the standard.</font></tt><br><br><tt><font size="2">That statement is made explicitly (multiple times) in the standard.</font></tt><br><br><tt><font size="2">Most specifically, C11 7.6.1.2 says:</font></tt><br><br><tt><font size="2">"The FENV_ACCESS pragma provides a means to inform the implementation when a</font></tt><br><tt><font size="2">program might access the floating-point environment to test floating-point status flags or</font></tt><br><tt><font size="2">run under non-default floating-point control modes. 213)"</font></tt><br><br><tt><font size="2">where the footnote clarifies:</font></tt><br><br><tt><font size="2">"213) The purpose of the FENV_ACCESS pragma is to allow certain optimizations that could subvert flag</font></tt><br><tt><font size="2">tests and mode changes (e.g., global common subexpression elimination, code motion, and constant</font></tt><br><tt><font size="2">folding). In general, if the state of FENV_ACCESS is ‘‘off’’, the translator can assume that default</font></tt><br><tt><font size="2">modes are in effect and the flags are not tested."</font></tt><br><br><tt><font size="2">This explicitly says the if FENV_ACCESS is off, the compiler can assume</font></tt><br><tt><font size="2">that default modes (including default rounding modes) are in effect.</font></tt><br><br><tt><font size="2">Later, C11 7.6.1.2 goes on to say:</font></tt><br><br><tt><font size="2">"If part of a program tests floating-point status flags, sets floating-point control</font></tt><br><tt><font size="2">modes, or runs under non-default mode settings, but was translated with the state for the</font></tt><br><tt><font size="2">FENV_ACCESS pragma ‘‘off’’, the behavior is undefined."</font></tt><br><br><tt><font size="2">This reiterates explicitly what I said in my earlier email, that whenever</font></tt><br><tt><font size="2">any code is run that was compiled with FENV_ACCESS off, then at run-time</font></tt><br><tt><font size="2">the default modes (including default rounding mode) must be in effect, or</font></tt><br><tt><font size="2">else the behavior of the whole program is undefined.</font></tt><br><br><tt><font size="2">The upcoming C2x standard complicates the logic a little bit since it</font></tt><br><tt><font size="2">also introduces a FENV_ROUND pragma which may be used even in the</font></tt><br><tt><font size="2">absence of FENV_ACCESS.  Nevertheless, if code is compiled without</font></tt><br><tt><font size="2">either of FENV_ACCESS or FENV_ROUND in effect, the compiler may still</font></tt><br><tt><font size="2">assume default modes.</font></tt><br><br><tt><font size="2">>If it is true and the code:</font></tt><br><tt><font size="2">> <br>> float qqq(float x) {</font></tt><br><tt><font size="2">>   return nearbyint(x);</font></tt><br><tt><font size="2">> }</font></tt><br><tt><font size="2">> <br>> is really equivalent to:</font></tt><br><tt><font size="2">> <br>> float qqq(float x) {</font></tt><br><tt><font size="2">>   return roundeven(x);</font></tt><br><tt><font size="2">> }</font></tt><br><tt><font size="2">> <br>> (in absence of 'pragma STD FENV_ACCESS), it is a fact that would be <br>> surprise for many user.</font></tt><br><br><tt><font size="2">In the absence of FENV_ACCESS, the compiler can assume "default" modes.</font></tt><br><tt><font size="2">But what exactly those default modes are is implementation-defined,</font></tt><br><tt><font size="2">so nearbyint *may* be equivalent to roundeven if that's the default,</font></tt><br><tt><font size="2">but it may also be something else.</font></tt><br><br><tt><font size="2">Bye,</font></tt><br><tt><font size="2">Ulrich</font></tt><br><BR>
</body></html>