2016-05-15 45 views
0

鑑於一些這個測試是重複嗎?

double x; 

是什麼

if((x>0 || (x<=0))) 

if(true)之間的區別?有什麼區別嗎?我認爲它們是相同的,但似乎並非如此?任何人都知道爲什麼?

好吧,我是新來的CPP,我很抱歉這個問題。但我真的需要解決這個問題 double sigmaX = 0.1; double sigmaY = 0.1;

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); 
} 

`在measure_prob功能 ,我發現,如果(真),或者如果(X> = 0 || X < 0)得到不同的結果。如果(true)它可以跟蹤兩個對象,但是當我使用if(x> = 0 || x < 0)時,它將快速收斂到一個對象。我真的很迷茫......

+1

什麼是'x'? –

+0

它很大程度上取決於'x'是什麼。這是一個帶有副作用的表達嗎?它是否已經重載了'>'或'<='運算符?一個潛在的'x <0'運算符重載是否會返回超出邏輯或'||'運算符的重載? –

+4

如果x是'float'或'double'並且是'NaN'(不是數字),那麼這兩個條件都是錯誤的。所以在這種情況下,它們並不完全等同。 – SirGuy

回答

4

例子:

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

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

輸出

False 

因此,它們是不等價的。 NAN代表不是數字因此它既不大於0也不等於或小於零,因爲它不是數字。