像 Denormals-Are-Zero (DAZ) 这样的非规范标志会影响比较的相等性吗?

Zac*_*rns 6 floating-point x86 sse x87 fast-math

如果我有 2 个具有不同位模式的非正规浮点数并比较它们是否相等,结果是否会受到非正规数-零标志、刷新到零标志或常用处理器上的其他标志的影响?

还是这些标志只影响计算而不影响相等性检查?

Pet*_*des 6

DAZ(Denormals Are Zero)影响读取输入,因此DAZ 影响 compares。根据它们的符号,所有非正规数在字面上都被视为-0.0+0.0

FTZ (Flush To Zero) 只影响写输出,所以FTZ 不影响 compares。比较不会产生 FP 输出,所以没有什么要刷新的。


(DAZ 和 FTZ 是 SSE MXCSR 控制/状态寄存器中的标志。x87 没有等效项。)


为什么两个标志单独存在,而不是一个标志控制两件事?我不知道,但你肯定需要这两种效果。

您可能正在从文件或网络中读取 FP 数据,因此您可以直接获得非正规输入,而不是计算结果。所以你需要 DAZ。

产生正确的非正规输出(例如,通过减去附近的正规数,或乘以两个小的正规数)可能很慢,因此您需要 FTZ 以允许 CPU 下溢,+-0.0而不是采用微码辅助来获得正确的值。


或者,您可能让一个线程使用快速数学 (FTZ+DAZ) 运行,而另一个线程使用精确数学运行某些需要它的计算。如果快速数学线程读取由精确线程生成的数据,则这些数字可能是非规范的。

我不确定设置 DAZ 而不是 FTZ 的用例是什么,反之亦然。它肯定会涉及读取不是您自己生成的数据,或为您以外的读者编写数据,否则仅 FTZ 就足以避免任何减速。

(仅 DAZ 是不够的:从正常输入生成非正常输出仍然很慢,即使下一个操作将其视为 0。)