将浮点数除以不连续的段

时间:2016-04-06 16:46:19

标签: numbers rounding floating

我需要创建一个程序,将浮点数分成不连续的部分。 我需要以增量0.43322的增量从start_actual(5.66882)转到end_actual(8.05153),以防增加值超过end_actual时减少到end_actual并且进程终止。

这是我的尝试

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

在这种情况下结果是 5.66882 6.10204 6.53526 6.96848

...等。 8.05153

但如果我改变了

的值
    float start= 10; //percentages
    float end= 65; //percentages
    float incr= 5; //percentages

由于四舍五入错误,最后一次打印两次(8.05153),如何解决此问题?

提前致谢.. VIPIN

1 个答案:

答案 0 :(得分: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); 
}