如何正确对浮点对和求和

时间:2019-03-18 09:46:47

标签: c++ c floating-point

让我有两个浮点变量作为函数参数出现:

float fun(float x, float y) {
     // ...
}

我想计算其和的下限。是否可以正确地将其与当前浮点舍入模式无关?

我的意思是。考虑以下表达式:

floorf(x+y)

对于某个整数n,函数参数(x + y)

2 个答案:

答案 0 :(得分:5)

以下是使用Bathsheba给出的数字和the floating point rounding mode的效果的演示:

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


int main(void) {
    double y = 0.49999999999999994;
    double x = 0.5;


    double z1 = x + y;

    // set floating point rounding downwards    
    fesetround(FE_DOWNWARD);

    double z2 = x + y;
    printf("y < 0.5: %d\nz1 == 1: %d\nz2 == 1: %d\n", y < x, z1 == 1, z2 == 1);
    printf("floor(z1): %f\nfloor(z2): %f\n", floor(z1), floor(z2));
}

y小于0.5,因此y + 0.5的总和应小于1,但使用默认模式(z1)将其舍入为1。如果将浮点舍入模式设置为向下舍入,则结果小于1(z2),该值将下限为0。显然,在“任何任意浮点舍入下,不可能正确执行此操作”模式” ...

输出为

y < 0.5: 1
z1 == 1: 1
z2 == 1: 0
floor(z1): 1.000000
floor(z2): 0.000000

答案 1 :(得分:2)

是的,这是可能的。

一个著名的例子是IEEE754 64位float(不常见,但按标准可能)

x = 0.5y = 0.49999999999999994

(x + y)正好是1,是的floorf将返回1。