我一直认为,测试NANvia 之间几乎没有区别
x!=x要么
std::isnan(x)但是,gcc为这两个版本提供了不同的汇编程序(在godbolt.org上直播):
;x!=x:
ucomisd %xmm0, %xmm0
movl $1, %edx
setne %al
cmovp %edx, %eax
ret
;std::isnan(x)
ucomisd %xmm0, %xmm0
setp %al
ret
Run Code Online (Sandbox Code Playgroud)
但是,我很难理解这两个版本.我天真的尝试编译std::isnan(x)将是:
ucomisd %xmm0, %xmm0
setne %al ;return true when not equal
ret
Run Code Online (Sandbox Code Playgroud)
但我必须遗漏一些东西.