如何在C中安全地进行浮点运算

问题描述 投票:0回答:1

最近 (C23) 添加的

stdckdint.h
提供了一种可移植的方法来检查整数算术中的溢出问题。我过去曾在用户提供相关整数的情况下使用过类似的编译器扩展,并且它们非常有帮助。现在我面临的情况是提供的值是浮点数,我需要对它们进行算术运算。

我的问题是是否有类似的解决方案(不一定在标准库中),以确保浮点变量(浮点数、双精度数、长双精度数)之间的操作不会遇到任何问题。如果不是,算术运算期间可能出现哪些问题(上溢、下溢等)以及如何检查这些问题?

c floating-point precision ieee-754
1个回答
1
投票

忽略 C 语言与 IEEE 754 浮点标准的一致性(标准和实现)的讨论,IEEE 754 在第 7 条中指定了五种例外情况:

  • 无效运算当且仅当“没有有用的可定义结果”时发出信号:信号 NaN 的一般运算、零与无穷大的乘法、相反符号无穷大的加法、同符号无穷大的减法、零除以零或无穷大乘无穷大、小于零的数字的平方根、量化运算的某些用途(用于调整十进制格式的指数)、转换为无法表示结果的整数、NaN 与需要非运算符的比较NaN 以及 NaN、+∞ 或零的整数对数。
  • 除以零表示普通除以零和−∞的整数对数(“获取浮点指数”)。
  • 当计算结果为无穷大时,会发出
  • 溢出信号,因为指数受浮点格式限制(不是因为它“自然”是无穷大)。
  • 当计算结果为零时,会发出
  • Underflow 信号,因为指数受浮点格式限制(否,因为它“自然”为零),但当舍入之前的结果幅度较低时,实现也可能会发出下溢信号比最小的可表示非零数。
  • 当计算的浮点结果与实数算术结果不同时,会发出
  • 不精确信号。

在此上下文中,“发出信号”意味着以某种方式指示异常,例如在状态寄存器中设置一个位。它并不意味着程序执行被中断或改变,就像 Unix 信号导致信号处理程序被执行一样。以上是总结,省略一些细节。

© www.soinside.com 2019 - 2024. All rights reserved.