Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确计算浮点对和_C++_C_Floating Point - Fatal编程技术网

C++ 如何正确计算浮点对和

C++ 如何正确计算浮点对和,c++,c,floating-point,C++,C,Floating Point,让我用两个浮点变量作为函数参数: float fun(float x, float y) { // ... } 我想计算一下他们总数的下限。在当前浮点舍入模式下是否可以正确执行 我的意思如下。考虑表达式: floorf(x+y) 在浮点运算期间,某些整数n的函数参数(x+y)abs(y)→x:y)-(abs(x)>abs(y)→y:x);总和=错误>0?下一次(总和,0):总和(浮点运算手册中提到了其他运算的误差计算)将舍入模式设置为向下舍入加法就足够了…sum=x+y;误差=总和

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

float fun(float x, float y) {
     // ...
}
我想计算一下他们总数的下限。在当前浮点舍入模式下是否可以正确执行

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

floorf(x+y)
在浮点运算期间,某些整数n的函数参数(x+y)这是可能的

一个著名的例子是IEEE754 64位
浮点
(不常见,但根据标准可能)

x=0.5
y=0.49999999994

(x+y)
正好是1,是
floorf
将返回1。

是这是可能的

一个著名的例子是IEEE754 64位
浮点
(不常见,但根据标准可能)

x=0.5
y=0.49999999994


(x+y)
正好是1,是
floorf
将返回1。

下面是一个演示,使用Bathsheba给出的数字以及以下效果:


下面是一个使用芭丝谢芭给出的数字和以下效果的演示:


对于加法…
sum=x+y,将舍入模式设置为向下舍入就足够了;误差=总和-(abs(x)>abs(y)→x:y)-(abs(x)>abs(y)→y:x);总和=错误>0?下一次(总和,0):总和
(浮点运算手册中提到了其他运算的误差计算)将舍入模式设置为向下舍入加法就足够了…
sum=x+y;误差=总和-(abs(x)>abs(y)→x:y)-(abs(x)>abs(y)→y:x);总和=错误>0?下一次(总和,0):总和(浮点运算手册中提到了其他运算的错误计算)(我想不出32位IEEE754中有任何例子,但我不明白为什么没有。您可以使用
nextafter
使用2D算法进行测试)(我想不出32位IEEE754中有任何例子,但我不明白为什么没有。你可以在下一步使用
nextafter
)用2D算法测试fesetround(FE_down)在内部做什么?切换round模式通常需要多长时间(比如,在CPU周期内测量)?fesetround(FE_down)做什么在内部做吗?切换模式通常需要多长时间(以CPU周期为单位)?
#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: 1
z1 == 1: 1
z2 == 1: 0
floor(z1): 1.000000
floor(z2): 0.000000