如果我有 2 个具有不同位模式的非正规浮点数并比较它们是否相等,结果是否会受到常用处理器上的非正规化零标志、刷新为零标志或其他标志的影响?
还是这些标志只影响计算而不影响相等检查?
如果我有 2 个具有不同位模式的非正规浮点数并比较它们是否相等,结果是否会受到常用处理器上的非正规化零标志、刷新为零标志或其他标志的影响?
还是这些标志只影响计算而不影响相等检查?
DAZ(非正规为零)影响读取输入,因此DAZ 影响compares。根据它们的符号,所有非正规数都按字面意思视为or 。-0.0
+0.0
FTZ(清零)仅影响写入输出,因此FTZ 不影响 compares。比较不会产生 FP 输出,因此没有什么要刷新的。
(DAZ 和 FTZ 是 SSE MXCSR 控制/状态寄存器中的标志。x87 没有等效项。)
为什么两个标志分开存在,而不是一个标志控制两件事?我不知道,但你肯定需要这两种效果。
您可能正在从文件或网络中读取 FP 数据,因此您可以直接获得非正规输入,而不是计算结果。所以你需要DAZ。
产生正确的非正规输出(例如,减去附近的正规数,或乘以两个小的正规数)可能很慢,因此您需要 FTZ 以允许 CPU 刚好下溢,+-0.0
而不是通过微码辅助来获得正确的值。
或者,您可能让一个线程使用快速数学 (FTZ+DAZ) 运行,而另一个线程使用精确数学运行以进行某些需要它的计算。如果快速数学线程读取精确线程产生的数据,这些数字可能是非正规的。
我不确定设置 DAZ 而不是 FTZ 的用例是什么,反之亦然。它肯定会涉及读取不是您自己产生的数据,或者为您自己以外的读者编写数据,否则仅 FTZ 就足以避免任何减速。
(仅 DAZ 是不够的:从正常输入产生非规范输出仍然很慢,即使下一个操作将其视为 0。)