例如,使用Visual Studio 2017,我得到了以下结果
inf + inf评估为inf
inf +( - inf)评估为-nan(ind)
浮点计算的结果是否涉及IEEE 754中规定的无穷大和NaN,还是编译器依赖的?
答案 0 :(得分:7)
当然,IEEE 754规定了无穷大和NaN的行为。微软称“Microsoft Visual C++ is consistent with the IEEE numeric standards.”我强调了这一点;一致性不一致,因此微软似乎并不承诺在本声明中完全符合。微软拙劣的C pow
例程实现是Stack Overflow上许多重复问题的原因,我不相信他们的二进制十进制或十进制二进制转换(如printf
和{{ 1}}转换)符合IEEE 754。
Visual Studio编译的程序执行的大部分算法都是由硬件提供的。 Intel 64和IA-32架构软件开发人员手册表示其浮点数据格式“直接对应”IEEE 754格式,这并不表示该算法符合标准。本手册包含有关分散在其中的IEEE 754的其他声明,因此确定哪些特定行为符合IEEE 754以及需要仔细阅读的方式。这些架构中的英特尔处理器主要设计为在基本操作中符合IEEE 754标准,但具有将次正常值替换为零的模式,出于性能原因,默认情况下可以启用这些操作系统。
在IEEE 754中,“浮点算术中无穷大的行为是从具有任意大幅度操作数的实数算术的极限情况得出的,当存在这样的限制时......无限操作数上的操作通常是精确的,因此信号为no异常,......仅当[∞是无效操作数,∞是通过溢出或除零的有限操作数创建∞,或者余数(次正规,∞)信号下溢时,才会发出与无穷有关的异常。]“
IEEE 754规定有两种NaN,信令和安静。信令NaN在一般操作中导致异常,并且旨在用于标记未初始化的数据或实现自定义算术特征(通过处理异常并以自定义方式替换结果或以其他方式转移正常计算)。安静的NaN通常不会导致异常,并且应该保留存储在其中的有效负载数据(以便计算结果可以提供关于其中NaN源自何处的一些线索)。
尽管Visual C ++可能与IEEE 754“一致”,但仍有一些警告。例如,对于scanf
类型的a
,b
和c
,可以实现表达式double
:
通常,我希望无穷大和NaN在编译程序的基础基本操作中表现为IEEE 754中的规定,但重要的是要注意Visual C ++实现在遵守IEEE 754时可能有些松懈