如何正确对浮点对和求和

0x2*_*207 1 c c++ floating-point

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

float fun(float x, float y) {
     // ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

floorf(x+y)
Run Code Online (Sandbox Code Playgroud)

对于浮点数运算,某个整数n的函数参数(x + y)<n的精确值可能会四舍五入为最接近的整数n,然后floorf()函数将返回n而不是(n -1)。

Ant*_*ala 5

这是使用Bathsheba给出的数字和浮点舍入模式的效果的演示:

#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));
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)