c - 向下舍入浮点结果

标签 c floating-point double rounding

我有两个浮点( double )值 ab,我希望将它们相加以获得结果 c .

我知道 c 会以某种方式被近似,因为一切都是有限精度的。现在,我想“向下舍入”c,这意味着 float c 不大于 float ab,或 c <= a + b

我该怎么做?想到了以下 c 中的代码,但我不确定答案是否是我想要的。

c = nextafter(a + b, bigNegativeNumber)

同样的问题适用于乘法而不是加法。 :)

附言。如果有帮助,ab 总是非负数。

编辑:c 也应该是一个 float

最佳答案

根据您的描述,您似乎想控制浮点运算的舍入模式。这在 C99 中由头文件 fenv.h 中提供的功能支持。您可能需要指示您的编译器打开 C99 支持,并且您可能需要指示它以符合 IEEE-754 的方式执行浮点运算。下面是一个最小的示例,展示了如何执行带有截断(向零舍入)的 double 加法。由于您的操作数已知为正数,因此这相当于向下舍入(朝向负无穷大)。

#include <stdio.h>
#include <stdlib.h>
#include <fenv.h>

#pragma STDC FENV_ACCESS ON

double dadd_rz (double a, double b) 
{
    double res;
    int orig_mode = fegetround ();
    fesetround (FE_TOWARDZERO);  // set rounding mode to truncate
    res = a + b;
    fesetround (orig_mode);      // restore rounding mode
    return res;
}

int main (void)
{
    double a = 0x1.fffffffffffffp1023;
    printf ("                  a = %20.13a\n", a);
    printf ("                a+a = %20.13a\n", a + a);
    printf ("round_to_zero (a+a) = %20.13a", dadd_rz (a, a));
    return EXIT_SUCCESS;
}

上面程序的输出应该是这样的(注意无穷大的打印是依赖于实现的):

                  a = 0x1.fffffffffffffp+1023
                a+a = 0x1.#INF000000000p+0
round_to_zero (a+a) = 0x1.fffffffffffffp+1023

关于c - 向下舍入浮点结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31443002/

相关文章:

c++ - 如何在 C 中声明指向嵌套 C++ 类的指针

c - 为什么这个 MSVC API 是这样定义的?

c++ - 将 "__m256 with random-bits"转换为 [0, 1] 范围的浮点值

c# - 将 Delphi Real48 转换为 C# double

java - "[\x09-\x0d -~]"正则表达式是什么意思?

c - fgets() 似乎溢出输入到其他变量

java - Float.floatToRawIntBits(); 是什么意思?在java中返回?

c - float 未正确转换

c++ - 四舍五入/截断双

svg - 带有 SVG 的双重绑定(bind) Angular 2