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