gpt4 book ai didi

c - IEEE 754 : sqrtf() with fesetround(): different results between compilers: 0x42440a72 vs. 0x42440a73

转载 作者:行者123 更新时间:2023-12-02 11:17:34 25 4
gpt4 key购买 nike

#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;
}
主机: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

问题:
  • 为什么编译器之间会有不同的结果( 0x42440a720x42440a73 )?
  • 如何在编译器之间获得相同的结果?
  • 最佳答案

    Why there are different results (0x42440a72 vs. 0x42440a73) between compilers?


    至少对于较旧的 gcc, <fenv.h>不需要支持。
    floating-point environment access in <fenv.h>, Library feature, no compiler support required.
    当我用“GNU C11 (GCC) version 9.3.0 (x86_64-pc-cygwin)”编译时,下面的
    #include <fenv.h>
    #pragma STDC FENV_ACCESS ON
    我收到以下信息:
    warning: ignoring #pragma STDC FENV_ACCESS [-Wunknown-pragmas]
    另见 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?


    没那么有用,但不要使用 fenv.h 的可选功能或避免选择编译器。
    可能存在一个 gcc 编译时标志来提供帮助,但我不知道。
    也可以使用 #pragma STDC FENV_ACCESS ON @Eric Postpischil .这可能无法解决此问题,但可以防止相关问题。

    关于c - IEEE 754 : sqrtf() with fesetround(): different results between compilers: 0x42440a72 vs. 0x42440a73,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63870900/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com