有关NaN操作的问题

Bon*_*ero 8 floating-point x86 sse nan ieee-754

我的SSE-FPU生成以下NaN:

  • 当我做类似ADDSD,SUBSD,MULSD或DIVSD和两个操作数中的一个的任何基本的双操作是NaN,则结果具有南操作数的符号和结果的尾数的较低51位装载有NaN操作数的尾数的低51位.
  • 当两个操作都是NaN时,结果加载了目标寄存器的符号,结果 - 尾数的低51位在操作之前加载了目标寄存器的低51位.因此,当对两个NaN操作数进行乘法时,关联定律不计算在内!
  • 当我在NaN值上执行SQRTSD时,结果具有NaN操作数的符号,结果的低51位加载操作数的低51位.
  • 当我将无穷大与零或无穷大相乘时,我总是得到-NaN(二进制表示0xFFF8000000000000u).
  • 如果任何操作数是信令NaN,则如果未屏蔽异常,则结果变为安静的NaN.

这种行为是否在IEEE-754标准的任何地方确定?

Mar*_*oom 8

NaN有一个符号和一个有效载荷,它们一起被称为NaN中包含信息.
NaNs的全部意义在于它们是"粘性的"(也许Monadic是一个更好的术语?),一旦我们在表达式中有一个NaN,整个表达式就会评估为NaN.
在评估谓词(如二元关系)时,也会特别处理aNaN,例如,如果是NaN,则它不等于它自己.

第1点
来自IEEE 754:

诊断信息的传播要求通过算术运算和浮点格式转换来保留NaN中包含的信息.

第2点
来自IEEE 754:

每个涉及一个或两个输入NaN的操作,没有一个信号发送,都不会发出异常信号,但是,如果要传递一个浮点结果,则应该输出一个安静的NaN,它应该是输入NaN之一.

没有任何浮点运算是关联的.
我认为你正在寻找交换这个术语,因为关联性需要至少三个操作数.

第3
点见第4点

第4点
来自IEEE 754:

无效操作是
1.对信号NaN(6.2)的任何操作
2.加法或减法 - 无穷大的幅度减法,例如,(+ INFINITY)+(
-INFINITY )3.乘法 - 0×INFINITY
4. Division-0/0或INFINITY/INFINITY
5.剩余 - x REM y,其中y为零或x为无穷大
6.如果操作数小于零,则为平方根
7.溢出时将二进制浮点数转换为整数或十进制格式,无限或NaN排除了该格式的忠实表示,否则不能用信号表示
8.当操作数无序时,通过涉及<或>,没有?的谓词进行比较(5.7,表4)

第5点
来自IEEE 754:

如果没有发生陷阱并且如果要传递浮点结果,则涉及信令NaN或无效操作(7.1)的每个操作都应该提供安静的NaN作为其结果.


由于其相关性,可以在此处找到IEEE 754标准.