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)。
这是使用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)
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |