IEEE 754中规定的浮点计算结果是否包含无穷大和NaN?

Now*_*zki 1 floating-point ieee-754

例如,使用Visual Studio 2017,我得到了以下结果

inf + inf评估为inf

inf +( - inf)评估为-nan(ind)

浮点计算的结果是否涉及IEEE 754中规定的无穷大和NaN,还是编译器依赖的?

Eri*_*hil 7

当然,IEEE 754规定了无穷大和NaN的行为.微软称"Microsoft Visual C++ 符合 IEEE数字标准."我强调了这一点.一致性不一致,因此微软似乎并不承诺在本声明中完全符合.微软的低迷执行的C的pow例程的堆栈溢出许多重复的问题的原因,我不相信他们的二进制小数或十进制,二进制转换(如被看见在printfscanf转换)符合IEEE 754.

Visual Studio编译的程序执行的大部分算法都是由硬件提供的.在英特尔64和IA-32架构软件开发人员手册说,它的浮点数据格式"直接对应",以IEEE 754格式,不说算术符合标准.本手册包含有关分散在其中的IEEE 754的其他声明,因此确定哪些特定行为符合IEEE 754以及需要仔细阅读的方式.这些架构中的英特尔处理器主要设计为在基本操作中符合IEEE 754,但具有将零正常值替换为零的模式,出于性能原因,默认情况下可以启用这些操作系统.

在IEEE 754中,"浮点运算中无穷大的行为是从具有任意大幅度操作数的实数算术的极限情况得出的,当存在这样的限制时......无限操作数上的操作通常是精确的,因此信号没有例外,...只有当[∞是无效操作数,∞由有限操作数通过溢出或除零或剩余(次正规,∞)信号下溢创建时,才会发出与无穷有关的例外情况.]"

IEEE 754规定有两种NaN,信令和安静.信令NaN在一般操作中导致异常,并且旨在用于标记未初始化的数据或实现自定义算术特征(通过处理异常并以自定义方式替换结果或以其他方式转移正常计算).安静的NaN通常不会导致异常,并且应该保留存储在其中的有效负载数据(以便计算结果可以提供关于其中NaN源自何处的一些线索).

虽然Visual C++可能与IEEE 754"一致",但有一些警告.例如,给定a,bc类型double,a*b + c可以实现表达式:

  • 使用基本64位二进制格式的IEEE 754乘法,然后添加该格式.
  • 使用融合乘法 - 加法指令,在乘法和加法之间没有舍入误差.
  • 具有更高的精度.

一般情况下,我希望无穷大和NaN作为一个编译程序的底层基本操作在IEEE 754规定的行为,但要注意的是,Visual C++实现可能只有遵守IEEE 754有些松懈,这一点很重要.