Joh*_*inz 5 c floating-point c99 ieee-754
我正在用C编写一个浮点计算器接口,该接口允许在运行时访问math.h中定义的数学函数。接口被实现为功能类似于strtold()的函数。它基于ASCII,并且应该像ASCII一样可移植,但是为了实现这一点,我需要以尽可能可移植的方式处理浮点数。我对将支持范围限制为IEEE-754浮点感到满意,但不确定如何处理IEEE-754定义的异常(上溢,下溢等)。首先,我很确定检查所有舍入模式下可用的异常的唯一方法是检查状态标志本身。为了做到这一点,我将需要fenv.h(在C99的附件F中定义),因此我想知道fenv.h在实践中的便携性。我也不太了解fenv。h应该工作;在我看来,状态标志是集中的,但是无论出于什么原因,我印象中每个浮点都有内置的标志。我也知道C99说在math.h中定义的函数可能会上溢和下溢,但我不明白如何检查这些异常。因此,总而言之,我正在寻找一个示例,该示例如何使用fenv.h检查由乘法引起的溢出,并说明如何正确地错误检查math.h中定义的函数。
从理论上讲,以下函数将两个数相乘,true如果发生溢出false则返回,如果没有发生则返回:
bool mul(double &a, double b) {
feclearexcept(FE_OVERFLOW);
a *= b;
return fetestexcept(FE_OVERFLOW) != 0;
}
Run Code Online (Sandbox Code Playgroud)
该标准指出您需要#pragma FENV_ACCESS ON使用它。但是,我尚未使用关心该编译指示的编译器,或者知道浮点乘法具有异常标志所反映的副作用的编译器-gcc和clang都会很乐意“优化”“死”浮点运算。 gcc错误34678与这种行为有关,我想针对clang也有类似的错误。此警告还适用于在程序中使用除舍入到最近的平分到偶数以外的舍入模式的任何使用。
| 归档时间: |
|
| 查看次数: |
472 次 |
| 最近记录: |