gpt4 book ai didi

c++ - VC++ 优化打破了与 NaN 的比较?

转载 作者:可可西里 更新时间:2023-11-01 17:35:29 25 4
gpt4 key购买 nike

IEEE754 要求 NaN 是无序的;当一个或两个操作数为 NaN 时,小于、大于、等于等都应返回 false。

下面的示例在所有优化级别使用 g++ 编译时以及使用 VC++ 的 CL.exe(32 位版本 15.00.30729.01)编译时没有优化参数或/Od、/fp:fast、/arch:SSE 的任意组合。

但是,当使用/O1 或/O2(以及任何/没有其他优化参数)编译时,T T F F F T 结果,即使还指定了/Op。

CL.exe 的 64 位版本产生许多变体 - T T F F F TT T T F F TT T T F F F 等 - 取决于优化级别以及是否/fp:fast 已指定,但与 32 位版本一样,合规行为似乎只有在禁用所有优化的情况下才有可能。

我是不是犯了一些明显的错误?有没有什么方法可以使编译器在不牺牲所有其他优化的情况下遵守此处的标准?

#include <limits>
#include <stdio.h>

int main( int argc, char const ** argv )
{
float test = std::numeric_limits<float>::quiet_NaN();

printf( "%c %c %c %c %c %c\n",
(test < test) ? 'T' : 'F',
(test <= test) ? 'T' : 'F',
(test == test) ? 'T' : 'F',
(test > test) ? 'T' : 'F',
(test >= test) ? 'T' : 'F',
(test != test) ? 'T' : 'F'
);

return 0;
}

重现问题的 build.cmd 示例:

set "PATH=c:\program files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64;c:\program files (x86)\Microsoft Visual Studio 9.0\Common7;c:\program files (x86)\Microsoft Visual Studio 9.0\Common7\IDE"
set "LIB=c:\program files (x86)\microsoft visual studio 9.0\vc\lib\x64;c:\program files\Microsoft SDKs\Windows\v6.0A\Lib\x64"
cl test.cpp /fp:fast /Od /c /I "c:\program files (x86)\microsoft visual studio 9.0\vc\include"
link "/LIBPATH:C:/Program Files (x86)/Microsoft Visual Studio 9.0/vc/lib/amd64" "/LIBPATH:C:\Program Files\Microsoft SDKs\Windows\v6.0A\/Lib/x64" /DEBUG /IGNORE:4199 /IGNORE:4221 /MACHINE:X64 /SUBSYSTEM:CONSOLE test.obj
test

编辑

作为记录,使用问题中最初给出的示例

inline float QNaN()
{
static int const QNaNValue = 0x7fc00000;
return *(reinterpret_cast<float const*>(&QNaNValue));
}

生成一个NaN;正如许多评论和答案指出的那样,这是未定义的行为,用 std::numeric_limits::quiet_NaN() 替换它实际上解决了某些版本的 32 位 CL.exe 的问题

最佳答案

因此,总而言之,存在许多不同的问题:

  • 原始示例代码因违反严格别名而产生未定义的行为。修复此问题足以解决某些版本的 32 位编译器的问题。

  • 解决该问题后,删除 /fp:fast 解决了我可用的所有 32 位和 64 位编译器版本的问题

  • Martinho 提到即使使用 /fp:fast

  • cl 16.0 中也不再存在该问题

关于c++ - VC++ 优化打破了与 NaN 的比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15786606/

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