尽管存在C ++舍入错误,但仍定义范围

时间:2015-03-11 12:14:33

标签: c++ rounding-error

给定下限,上限和步,我想创建一个向量,列出包含从下限开始的数字,然后逐步上升到上限,由步骤分隔。 例如lower = 1.5,upper = 6.0,step = 1.0: 返回[1.5,2.5,3.5,4.5,5.5]。

我目前使用C ++编写代码:

#include<iostream>
#include<armadillo>
using namespace std;
using namespace arma;

vec createArray( double lower, double upper, double step) {

    int arrayLength = int ((upper - lower)/step + 1);
    vec array(arrayLength);
    for( int j = 0; j < arrayLength; j += 1 )
    {
        array(j) = lower + j*step;
    }
    return array;
}

理想情况下应该可以正常工作,但是舍入错误会使输出错误。例如,

int((pow(10,-7)-0)/pow(10,-9));

有时输出99而不是100,大概是因为10 ^ -7表示为9.9999 ... 9 * 10 ^ -8。

我在想,是否有某种方法或技巧可以帮助我避免这些问题?

3 个答案:

答案 0 :(得分:2)

对于它的价值,使用std::vectorfor循环会更直接。

std::vector<double> createArray(double lower, double upper, double step)
{
    std::vector<double> values;
    for (double value = lower; value <= upper; value += step)
    {
        values.push_back(value);
    }
    return values;
}

Working example

这将使实际值尽可能接近正确的浮点值,而不会累积舍入误差。您仍然可以使用<iomanip>库将值输出为首选精度。

答案 1 :(得分:1)

您应该std::round结果,而不是截断。只要您的整数在浮点类型中完全可以表示,这至少会起作用。

答案 2 :(得分:1)

使用矢量,您不需要预先拥有容器的大小。因此,只需创建一个在超过最大值时停止的循环。这是一些伪代码。

vector<double> createVector(double minVal, double maxVal, double step)
{
    vector<double> data;

    while(minVal < maxVal){  
       data.push_back(minVal);   
       minVal += step;
    }

      return data;
}
相关问题