我需要创建一个程序,将浮点数分成不连续的部分。 我需要以增量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
答案 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);
}