c++ - 如何正确地计算浮点对总和

标签 c++ c floating-point

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

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

我想计算他们总和的底数。是否可以正确地执行与当前浮点舍入模式无关的操作?

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

floorf(x+y)

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

最佳答案

这里是一个演示,使用了 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

关于c++ - 如何正确地计算浮点对总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55218500/

相关文章:

c++ - 静态成员有不同的值

c++ - 确保在 C++ 中调用析构函数的信号处理

c++ - 在 C++ 中按行打乱二维数组

c - C 中具有固定大小缓冲区的 read() 函数无法返回预期结果

c - putchar 和整个代码是如何执行的?

python - 根据列中的值是整数(整数)的条件过滤数据框

c++ - getline() 是如何工作的?

c - 如何查找 sscanf 输入程序集的格式

php - 为什么 float 的打印方式如此不同?

c - 为什么 GCC 在添加浮点值时会给出意想不到的结果?