有关NaN操作的问题

时间:2016-06-18 10:33:55

标签: floating-point x86 sse nan ieee-754

我的SSE-FPU生成以下NaN:

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

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

1 个答案:

答案 0 :(得分:7)

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

第1点
来自IEEE 754:

  

诊断信息的传播需要该信息   NaN中包含的NaNs通过算术运算来保存   浮点格式转换。

第2点
来自IEEE 754:

  

涉及一个或两个输入NaN的每个操作,都没有信号,   应表示无异常,但如果要发送浮点结果,   应该提供一个安静的NaN,这应该是输入之一   NaN的。

没有任何浮点运算与之关联 我认为您正在寻找术语可交换,因为关联性需要至少三个操作数。

第3点
见第4点

第4点
来自IEEE 754:

  

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

第5点
来自IEEE 754:

  

涉及信令NaN或无效操作(7.1)的每个操作都应如果   没有陷阱发生,如果要传递浮点结果,请保持安静   NaN就是结果。

由于其相关性,可以找到IEEE 754标准here