让我有两个浮点变量作为函数参数出现:
float fun(float x, float y) {
// ...
}
我想计算其和的下限。是否可以正确地将其与当前浮点舍入模式无关?
我的意思是。考虑以下表达式:
floorf(x+y)
对于某个整数n,函数参数(x + y)
答案 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.5
和y = 0.49999999999999994
。
(x + y)
正好是1,是的floorf
将返回1。