2015-09-19 75 views
-1

为什么这段代码在ris1和ris2上给我2个不同的结果?算术双重表达式和c/C++

他们为什么不等于?

#include <iostream> 
#include <stdio.h> 
#include <malloc.h> 
#include <stdlib.h> 
#include <math.h> 
#include <string.h> 
#include <time.h> 

using namespace std; 

int main() { 
    double x1 = 0.4628471891711442; 
    double h = 0.51152525298500628; 
    double lambda = 0.99999999999999989; 
    double t = 0.10000000000000001; 
    double ris1 = 0; 
    double ris2 = 0; 

    ris1 = x1 - (h * exp(-lambda * t)); 

    double sub = h * exp(-lambda * t); 
    ris2 = x1 - sub; 

    printf("\n\nris1 = %1.4e", ris1); 
    printf("\n\nris2 = %1.4e", ris2); 

    return 0; 
} 

结果:

ris1 = 8.9257e-017 

ris2 = 1.1102e-016 

我在Eclipse中MinGW的工作。 这里我的mingw安装框架:http://ctrlv.in/638751

+0

这是所有的代码?我不认为这是事实,问题必须在其他地方。因为这个代码是没有问题的。您是否尝试过在独立的编译单元中测试代码?请注意,这两个值都不正确。答案是'5.5511e-17'。 –

+0

你能告诉我们更多关于你运行你的代码的环境吗?我无法重现您的问题。特别是我希望你发布标准库的版本,编译器和用于编译的所有选项(特别是优化相关的)以及运行代码的处理器数据。 – mszymborski

+0

我正在使用mingw和eclipse – andrea

回答

1

鉴于你的配置,这很可能是一个执行MinGW的g ++ 4.8.1-4的错误,正如解释here。请考虑更新(或降级)您的MinGW安装。

+0

甚至避免MinGW和使用g ++不存在的操作系统。或者使用MSVC C++编译器。 –

0

x1 - sub的差异接近double精度的最后几位,因为这两个变量大约相同。 @peter

由于优化和exp()的正确性程度,预计会有轻微变化的答案。

的另一个因素是C允许double数学为doublelong double取决于FLT_EVAL_METHOD进行。

以上2这些不能与不同的计算路径同等使用。

通过迫使额外的精度与long double,答案是一致的

ris1 = 1.2357e-16 
ris2 = 1.2357e-16