【问题标题】:Comparing Floats in a vector比较向量中的浮点数
【发布时间】:2019-01-17 07:02:28
【问题描述】:

我正在编写一个程序来创建两个向量来练习比较向量中的元素。第一个向量是 1-100 之间的所有非素数(不是素数)的列表,第二个向量是 1-100 之间的所有数字的列表(向量 number_bank)。我正在使用循环来比较向量中的每个元素。假设数字 5 来自 number_bank(它是一个素数),如果这个数字与 not_prime_numbers 向量中的任何数字都不匹配,那么它将被推回称为素数的第三个向量。如果将像 4 这样的数字与 not_prime_number 列表中的元素进行比较,则它应该与该列表中的数字 4 匹配,并在不将数字推回 prime_numbers 向量的情况下打破循环。正在发生的事情是 1-100 之间的所有数字都被推回。 number_bank 向量中的 4 永远不会等于 not_prime_numbers 向量中的 4,因此循环继续将 4 推回到素数向量中。

更改这些向量中的元素不涉及数学运算,因此不应存在通常与比较浮点数相关的增量误差 (epsilon)。有没有更好的方法来比较这些向量中的元素?

int main()
{
    float i = 1.0;
    unsigned int n = 0;
    std::vector<float>not_prime_numbers;
    std::vector<float>number_bank;
    std::vector<float>prime_numbers;
    while (i < 101.0)
    {
        for (float j = 1.0;j<(i);++j)
        {
            float p = i / j;
            if (abs(floor(p)) == p&&j!=1.0)
            {
                not_prime_numbers.push_back(i);
                break;
            }
        }
        ++i;
    }

    for (float k = 1.0; k < 101.0; ++k)
    {
        number_bank.push_back(k);
    }

    for (unsigned int m = 0; m < number_bank.size(); ++m)
    {
        while (n < not_prime_numbers.size())
        {
            if (not_prime_numbers[n] == number_bank[m])  // here is where i try to break the loop
            {                                            
            break;                                   
            }
            if (n == (not_prime_numbers.size()-1))
            {                   // here is where element is pushed back when compared to all loop elements
                prime_numbers.push_back(number_bank[m]);
                break;
            }
            if (not_prime_numbers[n] != number_bank[m])
            {
                ++n;
            }

        }
    }


    std::cout << "All prime numbers between 0 and 100 are as follows:\n";
    for (unsigned int j = 0; j < prime_numbers.size(); ++j)
    {
        std::cout << prime_numbers[j] << "\n";
    }
    return 0;
}

我阅读了 .compare 并尝试了它,但它指出左侧需要有一个类结构(也许一个向量没有类结构?)。我是 C++ 新手,非常感谢您的帮助。

【问题讨论】:

  • 它指出左侧需要有一个类结构 请始终发布错误消息的确切文本。如果这是 Visual Studio,请从“输出”选项卡 (Alt+2) 复制它
  • 你为什么使用浮点类型?素数只是整数,您可以通过使用% 检查余数来解决整数是否为素数。你真的应该切换你的数据类型。
  • @NathanOliver 我使用浮点数是因为我检查它是否不是质数的方式。如果我使用整数,则舍入会导致 1-100 之间的所有数字都被定义为非素数。其目的更多是比较向量元素而不是素数方面。
  • 旁注:floats 的比较可能会变得混乱,因为floats 不能包含许多数字的精确表示,即使可以,有时算术运算的结果也会稍微“中断”号码。换句话说,您认为您正在查看 25,但 float 实际上持有的是 24.999999999999997 并且不完全等于 25。有关此主题的更多信息:Is floating point math broken?
  • @user4561301 嗯,那么比较两个浮点值的正确语法是什么?一个向量是一个数字库,第二个向量是一系列计算值?

标签: c++ vector floating-point


【解决方案1】:

你永远不会重置n,所以一旦你得到一个素数(当n == (not_prime_numbers.size()-1)),其余的数字也会被添加到素数列表中。

为什么要在循环中检查该条件?如果你发现数字不是素数,你应该设置一个标志变量,然后在你的循环之后检查它是否可能将它添加到你的素数列表中。

【讨论】:

  • 切换到 for 循环工作了,谢谢!为了论证,假设问题是您认为您正在查看 25,但浮点数实际上持有的是 24.999999999999997 并且不完全等于 25。那么比较两个浮点值的正确语法是什么?一个向量是一个数字库,第二个向量是一系列计算值?
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2017-02-15
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多