2016-04-06 21 views
0

浮動小数点数を離散的に分割するプログラムを作成する必要があります。 私はstart_actual(5.66882)からend_actual(8.05153)まで増分0.43322ずつ増やしていく必要がありますが、オーバーシュートの値を増やしている間はend_actualまで減少し、プロセスは終了します。私は変更する場合はここで 浮動小数点数を離散セグメントに分割する

は結果が 5.66882 6.10204 6.53526 6.96848

である。この場合、私の試み

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

....など。 8.05153

ですが、

の値
float start= 10; //percentages 
    float end= 65; //percentages 
    float incr= 5; //percentages 

丸め誤差のため、最後の値が2回(8.05153)印刷されますが、この問題を解決する方法はありますか?

事前に感謝.. Vipin

+0

「2度印刷された」というのはどういう意味ですか?あなたはループを使って印刷していません。また、問題点が明確ではありません。浮動小数点値の精度は限られており、浮動小数点値については考慮する必要があります。 – einpoklum

答えて

0

あなたは極めてエラーが発生しやすくなります浮動小数点数の平等を、比較しています。
(value-end_actual)<0.1)は、実際に(value-end_actual)の結果と0.1の結果を比較していません。 0.1は任意の数字です。おそらく0.100000000000000005のようなものです。つまり、浮動小数点の比較は小数点の比較として扱うことができません。あなたが必要とするのは、ある種の指定された精度との「ほぼ比較」です。もちろん、次のような関数のような振る舞いを実装します:

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); 
} 
関連する問題