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

标签 c++ rounding-error

给定下限、上限和步长,我想创建一个 vector ,其中列出包含从下限开始并逐步上升到上限的数字,并由步长分隔。 例如下限 = 1.5,上限 = 6.0,步长 = 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。

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

最佳答案

就其值(value)而言,使用 std::vector 会更直接。和一个 for循环。

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> 将值输出到您首选的精度。图书馆。

关于c++ - 尽管存在 C++ 舍入错误,仍定义范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28986353/

相关文章:

c++ - 检查指针在析构函数中不为空

c++ - 为什么采用 std::initializer_list 的构造函数不首选双花括号语法

Excel VBA四舍五入与 double

css - 当计算出的宽度不准确时,如何在柏树中测试元素的宽度?

php - 使用 money_format 进行意外舍入,包括示例代码

c++ - MacOS Sierra - cmake 因 qt5 而失败

c++ - boost 序列化段错误

c++ - 浮点分辨率似乎比它应该的更受限制

c++ - 如何用相同的参数初始化所有元组元素?

java - 为什么某些 double 在打印到控制台时会自动舍入?