Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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++ If语句在应该时计算为TRUE_C++_Numerical Methods_Numerical Analysis - Fatal编程技术网

C++ If语句在应该时计算为TRUE

C++ If语句在应该时计算为TRUE,c++,numerical-methods,numerical-analysis,C++,Numerical Methods,Numerical Analysis,我有一个x值数组,一个用于PDE解算器的网格,当我传递给一个函数,该函数基于这些x值填充另一个数组时,涉及一个x值的特定表达式无法正确计算。x值的范围是-1:1,增量为0.0125,x=-0.5,x=0.5,我需要以不同于其他值的方式处理这些情况。但是,对于点x=0.5,下面的块无法计算为真,对于x=-0.5,它是正常的。下面是问题块的一个精简片段,详细内容如下: int N = 160; double delta_x = 0.0125; const double lims = 0.5 * de

我有一个x值数组,一个用于PDE解算器的网格,当我传递给一个函数,该函数基于这些x值填充另一个数组时,涉及一个x值的特定表达式无法正确计算。x值的范围是-1:1,增量为0.0125,x=-0.5,x=0.5,我需要以不同于其他值的方式处理这些情况。但是,对于点x=0.5,下面的块无法计算为真,对于x=-0.5,它是正常的。下面是问题块的一个精简片段,详细内容如下:

int N = 160;
double delta_x = 0.0125;
const double lims = 0.5 * delta_x;

for(int i = 0; i <= N; i++)
{                                
  if((x[i] < -0.5) || (x[i] > 0.5)) sol[i] = 0;
  else if( (abs(x[i] + 0.5) < lims) || (abs(x[i] - 0.5) < lims) )  sol[i] = 0.5;
  else sol[i] = 1;

  cout << setprecision(30) << "lims: " << lims << ", abs(x[i] - 0.5): " << abs(x[i] - 0.5) << endl;
  cout << "sol[" << i << "]: " << sol[i] << endl;                                                                                         
}
因此,当x=0.5时,if语句中的表达式看起来应该返回TRUE,尽管它当然不是精确的0.5,因为它在范围的lims内。有什么想法吗?

回答原来的问题

if语句中的表达式的计算结果为true。如果没有,那么您就不会看到问题中包含的输出

FWIW,一个更简单的测试是

abs(abs(x[i]) - 0.5) < lims
因此,您需要更改测试的顺序:

if( (abs(x[i] + 0.5) < lims) || (abs(x[i] - 0.5) < lims) )  sol[i] = 0.5;
else if((x[i] < -0.5) || (x[i] > 0.5)) sol[i] = 0;
else sol[i] = 1;
我会这样写:

if (abs(abs(x[i]) - 0.5) < lims)
    sol[i] = 0.5;
else if ((x[i] < -0.5) || (x[i] > 0.5)) 
    sol[i] = 0;
else 
    sol[i] = 1;

以后请确保在您提出的问题中包含正确的代码。

好吧,现在在您更正代码之后,问题就显而易见了。对于x[i]=0.5,控制被第一个条件截获

if((x[i] < -0.5) || (x[i] > 0.5)) sol[i] = 0;

对我来说,这看起来真是一个错误。当然,它应该if( (abs(x[i] + 0.5) < lims) || (abs(x[i] - 0.5) < lims) ) sol[i] = 0.5; else if((x[i] < -0.5) || (x[i] > 0.5)) sol[i] = 0; else sol[i] = 1;
if (abs(abs(x[i]) - 0.5) < lims)
    sol[i] = 0.5;
else if ((x[i] < -0.5) || (x[i] > 0.5)) 
    sol[i] = 0;
else 
    sol[i] = 1;
if((x[i] < -0.5) || (x[i] > 0.5)) sol[i] = 0;
if( (abs(x[i] + 0.5) < lims) || (abs(x[i] - 0.5) < lims) )  sol[i] = 0.5; 
else if((x[i] < -0.5) || (x[i] > 0.5)) sol[i] = 0;
else sol[i] = 1;