2016-04-06 27 views
0

Kayan nokta sayısını kesikli parçalara bölen bir program oluşturmam gerekiyor. End_actual'dan (5.66882) end_actual (8.05153) 'den artışa 0.43322 artışlarla gitmem gerekiyorsa, end_actual değeri aşıldıklarında end_actual değerine azaltılmalı ve işlem sonlandırılacaktır. i değiştirirseniz İşte Kayan nokta sayısını ayrık segmentlere ayırma

sonuç 5,66882 6,10204 6,53526 6,96848

bu durumda benim girişimi

#include <iostream> 
#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 

using namespace std; 

int main() 

{ 
    float max=9.5678; 
    float min= 5.2356; 
    float diff=max-min; 

    float start= 10; //percentages 
    float end= 65; //percentages 
    float incr= 10; //percentages 

    int steps= ((end-start)/incr); 

    float start_actual= min+ (diff*start/100); 
    float end_actual= max-(diff*(100-end)/100); 
    float incr_actual= diff*incr/100; 

    cout<<"Min value is "<<min<<endl; 
    cout<<"Max value is "<<max<<endl; 

    cout<<"start_actual is "<<start_actual<<endl; 
    cout<<"end_actual is "<<end_actual<<endl; 
    cout<<"increment is"<<incr_actual<<endl; 
    cout<<"steps is"<<steps<<endl; 


    float value; 
    steps=steps+1; 

    for(int i=0;i<=steps;i++) 
    { 

     value= start_actual + (incr_actual*i); 


     if(value<=end_actual) 
     cout<<"value is "<<value<<endl; 

     else if ((end_actual-value)<incr_actual) 
     { 
      value=end_actual; 
      cout<<"final value is "<<value; 
      break; 
     } 

     //else if (((value-end_actual)<0.1)||((-value+end_actual)<0.1)) 
     //cout<<"value is"<<end_actual<<endl; 

    } 


    //cout<<"diiff "<<diff<<endl; 


    getchar(); 
    return(0); 
} 

.... vs .. 8,05153

ama

float start= 10; //percentages 
    float end= 65; //percentages 
    float incr= 5; //percentages 
'in değeri

Son değer, yuvarlama hataları nedeniyle bu soruna nasıl çözümleneceğinden iki kez yazdırılır (8.05153)? peşin

Teşekkür .. Vipin

+0

"İki kere basıldı" nasıl yazılır? Yazdırmak için bir döngü kullanmıyorsunuz. Ayrıca, sorunun ne olduğu oldukça açık değil. Kayan nokta değerleri sınırlıdır ve bunu hesaba katmalısınız. – einpoklum

cevap

0

Sen son derece hata eğilimli kayan nokta numaraları, eşitliğini karşılaştırıyoruz.
(value-end_actual)<0.1)0.1 ile (value-end_actual) sonucunu karşılaştırıyor aslında değil. 0.1, bazı rasgele sayı olabilir, belki 0.100000000000000005 gibi bir şey. Bunun anlamı, kayan nokta karşılaştırmalarının ondalık karşılaştırmalar olarak ele alınamamasıdır. İhtiyacınız olan şey, bir tür belirlenmiş hassasiyetle "neredeyse karşılaştırma" yapmaktır. Elbette böyle bir davranışı aşağıdaki gibi bir işlev olarak uygularsınız:

template<typename T, 
     typename = std::enable_if<std::is_arithmetic<T>::value>::type> 
inline 
bool AlmostEqual(T lhs, T rhs, std::size_t precision = 100000) 
{ 
    return (std::abs(a - b) < 1.0/precision); 
} 
İlgili konular