Joh*_*itb 13 c++ gcc nan ieee-754
当我调试代码时,我发现GCC和Clang都产生了纳米,0.0/0.0这正是我所期待的,但GCC产生一个nan,符号位设置为1,而Clang将其设置为0(与ICC一致,如果我记得正确).
现在显然两种形式都是允许的,但我一直想知道为什么0.0/0.0GCC输出会产生"负面"结果(打印出来-nan),并-(0.0/0.0)给出"正面"结果?更令人困惑的是,-0.0/0.0再次"消极".这是一个不断折叠的怪异吗?
编辑
实际上,它是恒定的折叠,使其成为一个积极的纳米.如果我在运行时强制执行计算,我会在GCC和Clang上得到负值
volatile float zero = 0.0;
std::cout << (zero/zero); // -nan
Run Code Online (Sandbox Code Playgroud)
请问有人对此有所了解吗?x86 FPU上的符号位是否设置为1?
IEEE-754未指定NaN的符号:
当输入或结果是NaN时,该标准不解释NaN的符号.但是请注意,对位串的操作 - copy,negate,abs,copySign - 指定NaN结果的符号位,有时基于NaN操作数的符号位.逻辑谓词totalOrder也受NaN操作数的符号位的影响.对于所有其他操作,此标准不指定NaN结果的符号位,即使只有一个输入NaN,或者NaN是由无效操作产生的.
现在让我们来看看Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 1: Basic Architecture.
其中,英特尔确实在这种情况下指定了NaN的特定值,该值被调用QNaN Floating-Point Indefinite(参见表4-1),该值在#IA(无效算术异常)时返回(参见表8-10).找0除0.
您会看到该值已设置符号位.
| 归档时间: |
|
| 查看次数: |
488 次 |
| 最近记录: |