2016-05-15 19 views
0

?違いはありますか?私は彼らが同等だと思うが、そうではないようだ?なぜ誰が知っていますか?このテストは同音異義語ですか?</p> <pre><code>if((x>0 || (x<=0))) </code></pre> <p>と<code>if(true)</code>の違いは何であるいくつかの</p> <pre><code>double x; </code></pre> <p>考える

私はcppを初めて使っています。この質問は申し訳ありません。しかし、私は本当にこの問題を解決する必要があります double sigmaX = 0.1; double sigmaY = 0.1; measure_prob関数で

SimPFilter::SimPFilter() { 
    totalParticles = 100; 
    nFilters = 2; 
    gsl_rng_env_setup(); 
    rng = gsl_rng_alloc(gsl_rng_mt19937); 
    gsl_rng_set(rng, time(NULL)); 
} 

SimPFilter::~SimPFilter() { 

} 

void SimPFilter::initParticles(double initX, gsl_rng* rng){ 
    for (int i=0; i < totalParticles; i++) { 
     particles[i].xp = particles[i].x = 0.5 + gsl_ran_gaussian(rng, sigmaX*sigmaX); 
     if(i > totalParticles/2) 
      particles[i].xp = particles[i].x = -0.5 + gsl_ran_gaussian(rng, sigmaX*sigmaX); 
     particles[i].wNormalized = 1/(totalParticles/nFilters); 
     int j = (int)i/(totalParticles/nFilters); 
     particles[i].id = j; 
     filters[j].nParticles = (totalParticles/nFilters); 
     particles[i].w = particles[i].wp = particles[i].wNormalized = 1/totalParticles; 

    } 
    for(int i =0; i<nFilters; i++){ 
     filters[i].weight = filters[i].weightPrev = 1.0/nFilters; 

    } 
} 

void SimPFilter::transition(gsl_rng* rng){ 
    for (int i=0; i < totalParticles; i++) { 
     double temp = particles[i].x; 
     particles[i].xp = temp; 
     particles[i].x += gsl_ran_gaussian(rng, sigmaX*sigmaX); //the centre of each region  
    } 
} 

double SimPFilter::measure_prob(particle *p, double obser_y, gsl_rng* rng){ 
    double x = p->x; 
    //cout << "x value is " << x << endl; 
    double prob = gsl_ran_gaussian_pdf (obser_y - (x*x), sigmaY); 
    //cout << "probability " << prob << endl; 
    std::cout << std::boolalpha; 
    //cout << (x>0 || (x<=0)) << endl; 
    if(true){ 
     //cout << "probability2 " << prob << endl; 
     return prob; 
    } 
    return prob; 
} 

void SimPFilter::updateWeight(double obser_y, gsl_rng* rng){ 
    for (int i=0; i < totalParticles; i++) { 
     double temp = particles[i].w; 
     particles[i].wp = particles[i].w; 
     particles[i].w = measure_prob(&particles[i], obser_y, rng); 
    } 

    //normalized particle weight 
    double eachFilterSum[nFilters]; 
    for(int i=0; i < totalParticles; i++){ 
     int id = particles[i].id; 
     eachFilterSum[id] += particles[i].w; 
    } 

    for(int i=0; i < totalParticles; i++){ 
     particles[i].wNormalized = particles[i].w/eachFilterSum[particles[i].id]; 
    } 

    //update each filter's weight 
    double eachFilterW[nFilters]; 
    for(int i=0; i< totalParticles; i++){ 
     //cout << "prticle i's weight1 "<<particles[i].w << endl; 
     int id = particles[i].id; 
     eachFilterW[id] += particles[i].wNormalized; 
    } 
    double sigmaweight =0; // simga pi n t-1 * wnt 
    for(int j=0; j<nFilters; j++){ 
     sigmaweight += filters[j].weightPrev * eachFilterW[j]; 
    } 
    for(int j=0; j<nFilters; j++){ 
     double temp = filters[j].weight; 
     filters[j].weight = filters[j].weightPrev * eachFilterW[j]/sigmaweight; 
     filters[j].weightPrev = temp; 
    } 
} 

void SimPFilter::resample(gsl_rng* rng){ 
    particle * newParticles; 
    newParticles = (particle*) malloc(totalParticles * sizeof(particle)); 
    int index =(int)gsl_rng_uniform (rng)* totalParticles; 
    double beta = 0.0; 
    double maxWeight =0; 
    for (int i=0; i < totalParticles; i++) { 
     maxWeight = max(maxWeight, particles[i].wNormalized* filters[particles[i].id].weight); 
    } 
    for(int j=0; j < totalParticles; j++){ 
     beta += (rng, 0, 2*maxWeight); 
     while(beta > particles[index].wNormalized * (filters[particles[index].id].weight)){ 
      beta -= particles[index].wNormalized * (filters[particles[index].id].weight); 
      index = (index+1) % totalParticles; 
     } 
     newParticles[j] = particles[index]; 
    } 
    for(int i=0; i<totalParticles; i++){ 
     particles[i] = newParticles[i]; 
     particles[i].w = particles[i].wNormalized = particles[i].wp =1/filters[particles[i].id].nParticles; 
    } 
    //update each filter particles number 
    vector<int> countP; 
    for(int i=0; i<nFilters; i++){ 
     countP.push_back(0); 
    } 
    for(int i=0; i< totalParticles; i++){ 
     countP.at(particles[i].id)++; 
    } 
    for(int i=0; i< nFilters; i++){ 
     filters[i].nParticles = countP.at(i); 
    } 
    for(int i=0; i< nFilters;i++) 
     cout << "n particle value is " << filters[i].nParticles << endl; 
    free(newParticles); 
} 

`、私は(真の)場合は、調べる、または(x> = 0 || X < 0)場合には、異なる結果を与えます。 2つのオブジェクトを追跡することができる場合(true)、if(x> = 0 || x < 0)を使用すると、すぐに1つのオブジェクトに収束します。私は本当に混乱しています...

+1

「x」とは何ですか? –

+0

'x 'が何であるかは非常に異なります。副作用のある表現ですか? '>'や '<='演算子がオーバーロードされた型ですか?潜在的な 'x <0'演算子のオーバーロードは、論理演算子、または' || '演算子をオーバーロードしたものを返しますか? –

+4

xが 'float'または' double'でNaN(Not a Number)の場合、両方の条件はfalseになります。その場合、それらは全く同等ではありません。 – SirGuy

答えて

4

例:

double x = log2(-1); // Evaluates to NAN 

if (x>0 || (x<=0)) { 
    printf("True\n"); 
} 
else { 
    printf("False\n"); 
} 

OUTPUT

False 

したがって、彼らは同じではありません。 NANはNot A Numberの略での略で、0より大きくなく、0以下であるため数値ではありません。

関連する問題