2010-09-24 70 views
1

我在一个简单的程序中有一个非常奇怪的问题,一直无法达成任何合理的结论。当我将程序的输出重定向到一个文件时,我得到的结果与打印到stdout时不同。当我打印到文件时,结果是正确的。我不明白为什么它首先会有所不同。这是一个片段。有任何想法吗?输出错误在c + +

for (int i = 1; i <= N; i++) { 
    double x = i*h; 
    for (int j = 1; j <= N; j++) { 
     double y = j*h; 
     double bi = h*h*f(x,y); 
     if (x+h == 1.0) { 
      bi += boundary_f(1,y); 
     } 
    if (y+h == 1.0) { 
     bi += boundary_f(x,1); 
    } 
    cout << "i=" << i << "; j=" << j << "; b=" << bi << "\n"; 
    b(k,1) = bi; 
    ++k; 
} 

当打印到标准输出和重定向到文件时,我得到不同的结果!似乎y + h == 1.0的条件不会计算为true,即使当y + h为1.0时,输出到stdout但是被重定向到文件时,它的计算结果是正确的。

+0

程序是否写入cerr?如果是这样,你看到的问题是与cout和cerr输出混合? – Doug 2010-09-24 11:27:11

+0

不仅cout。当重定向到cout vs file时,似乎条件(y + h == 1.0)的计算方式不同。 – user236215 2010-09-24 11:30:58

+1

@ user236215:您能否显示您是如何从命令行运行程序的,以及某些(如果不是全部)输出?如果没有这个或完整的代码,就不可能重新创建问题或推测它发生的原因。 – 2010-09-24 11:40:52

回答

2

比较绝对平等的double值是不好的。你不能保证程序是否输入'如果'条件。相反,你可以做的是这样的:fabs(y+h-1.0) < EPSILON其中EPSILON将是东西10^-5.

+0

我明白了。这是一个简单的例子。我通常通过将绝对误差与ε进行比较来进行比较。但是当我用这种逻辑代替时,在这种情况下,我仍然得到不同的输出结果。这真的让我疯狂。我正在研究潜在的缓冲区溢出问题。 – user236215 2010-09-24 11:35:11

+0

你是对的。我的浮点比较函数中存在一个错误。我修好了,现在可以正常工作了。谢谢! – user236215 2010-09-24 11:47:51