Pav*_*kin 7 c floating-point rounding ieee-754 cl
#include <stdio.h>
#include <stdint.h>
#include <fenv.h>
#include <math.h>
int main()
{
typedef union { uint32_t u; float f; } ufloat;
ufloat val;
float arg = 2401.999999;
int r;
r = fesetround(FE_DOWNWARD);
val.f = sqrtf(arg);
printf ("FE_DOWNWARD %22.13a [0x%x] %d\n", val.f, val.u, r);
r = fesetround(FE_TONEAREST);
val.f = sqrtf(arg);
printf ("FE_TONEAREST %22.13a [0x%x] %d\n", val.f, val.u, r);
r = fesetround(FE_TOWARDZERO);
val.f = sqrtf(arg);
printf ("FE_TOWARDZERO %22.13a [0x%x] %d\n", val.f, val.u, r);
r = fesetround(FE_UPWARD);
val.f = sqrtf(arg);
printf ("FE_UPWARD %22.13a [0x%x] %d\n", val.f, val.u, r);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
主机:Win10 x64。
结果:
情况1。
$clang t2.c -o t2.clang.exe && ./t2.clang.exe FE_DOWNWARD 0x1.8814e60000000p+5 [0x42440a73] 0 FE_TONEAREST 0x1.8814e60000000p+5 [0x42440a73] 0 FE_TOWARDZERO 0x1.8814e60000000p+5 [0x42440a73] 0 FE_UPWARD 0x1.8814e60000000p+5 [0x42440a73] 0 $ clang --version clang 版本 8.0.1 (tags/RELEASE_801/final)
案例 2。
$ gcc t2.c -o t2.gcc.exe && ./t2.gcc.exe FE_DOWNWARD 0x1.8814e60000000p+5 [0x42440a73] 0 FE_TONEAREST 0x1.8814e60000000p+5 [0x42440a73] 0 FE_TOWARDZERO 0x1.8814e60000000p+5 [0x42440a73] 0 FE_UPWARD 0x1.8814e60000000p+5 [0x42440a73] 0 $ gcc --version 海湾合作委员会(海湾合作委员会)10.2.0
案例 3。
cl t2.c && t2 适用于 x64 的 Microsoft (R) C/C++ 优化编译器版本 19.25.28611 ... FE_DOWNWARD 0x1.8814e40000000p+5 [0x42440a72] 0 FE_TONEAREST 0x1.8814e60000000p+5 [0x42440a73] 0 FE_TOWARDZERO 0x1.8814e40000000p+5 [0x42440a72] 0 FE_UPWARD 0x1.8814e60000000p+5 [0x42440a73] 0
案例 4。
cl t2.c && t2 适用于 x86 的 Microsoft (R) C/C++ 优化编译器版本 19.25.28611 ... 系统无法执行指定的程序。 弹出窗口出现:“病毒和线程保护:Windows Defender 防病毒软件发现威胁。获取详细信息。”
案例 5。
wandbox.org:gcc HEAD 11.0.0 20200 $ gcc prog.c -Wall -Wextra -std=c99 "-lm" FE_DOWNWARD 0x1.8814e40000000p+5 [0x42440a72] 0 FE_TONEAREST 0x1.8814e60000000p+5 [0x42440a73] 0 FE_TOWARDZERO 0x1.8814e40000000p+5 [0x42440a72] 0 FE_UPWARD 0x1.8814e60000000p+5 [0x42440a73] 0
案例 6。
wandbox.org:clang HEAD 12.0.0 $ clang prog.c -Wall -Wextra -std=gnu11 "-lm" FE_DOWNWARD 0x1.8814e40000000p+5 [0x42440a72] 0 FE_TONEAREST 0x1.8814e60000000p+5 [0x42440a73] 0 FE_TOWARDZERO 0x1.8814e40000000p+5 [0x42440a72] 0 FE_UPWARD 0x1.8814e60000000p+5 [0x42440a73] 0
问题:
0x42440a72vs. 0x42440a73)?Why there are different results (0x42440a72 vs. 0x42440a73) between compilers?
At least with older gcc, <fenv.h> support not required.
See floating-point environment access in <fenv.h>, Library feature, no compiler support required.
When I compile with "GNU C11 (GCC) version 9.3.0 (x86_64-pc-cygwin)", the below
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
Run Code Online (Sandbox Code Playgroud)
I receive the below:
warning: ignoring #pragma STDC FENV_ACCESS [-Wunknown-pragmas]
Run Code Online (Sandbox Code Playgroud)
See also If pragma STDC FENV_ACCESS is absent, does it mean default rounding mode?, pragma STDC FENV_ACCESS ON is not supported
How to get the same results between compilers?
Not that helpful, but do not use optional features of fenv.h or avoid select compilers.
There may exist a gcc compile time flag to help, but I am not aware of one.
Also use #pragma STDC FENV_ACCESS ON @Eric Postpischil. This may not solve this issue, but prevent related ones.