让我有两个浮点变量作为函数参数:
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/