c++ - <= 和 == 运算符无法正常工作以结束循环

标签 c++ loops operators

<分区>

当我编写一个需要时间数组的小 ODE 求解器时,我最终遇到了以下非常奇怪的行为。以下代码应该可以清楚地重现问题。

#include <iostream>
using namespace std;

int main() {
    double t = 0.0;
    for (t = 0.0; t <= 1.00; t += 0.01) {
        cout << t << " ";
    }
    cout << endl;

    cout << "t = "<<  t << " and t <= 1.00? " << (t <= 1.00) << endl;
    double c = 1.00;
    cout << "c = "<<  c << " and c <= 1.00? " << (c <= 1.00) << endl;
    cout << "t == 1.00? " << (t == 1.00) << " and c == 1.00? " << (c == 1.00) << endl;
    return 0;
}

这给出了以下输出:

0 0.01 0.02 0.03 0.04 ... 0.97 0.98 0.99 
t = 1 and t <= 1.00? 0
c = 1 and c <= 1.00? 1
t == 1.00? 0 and c == 1.00? 1

我的问题是:为什么 (t <= 1.00) 和 (t == 1.00) 返回 false 而 t 显然应该等于 1 并且 t 是 double 类型?

我无法真正避免这个问题,因为在我的真实代码中,我的 t-step 不是硬编码等...

先谢谢你。

编辑:感谢您的回答。这确实是 0.01 等的二进制表示不准确但有一定舍入误差的问题。 t 标度实际上是由程序中的其他物理量强制执行的。同时,我在其他地方得到的另一个答案/提示是,如果需要使用浮点成员,则始终使用容差。在这种情况下,当我的应用程序需要使用可变精度 h 时,“t <= 1.00”可能会变成“t < 1.00 + 0.01/2”或更一般的“t < 1.00 + h/2”。

最佳答案

浮点运算并不像您预期​​的那样工作。

罪魁祸首是你在 for 循环中的条件:

t <= 1.00

tdouble,因此 0.00 加上 100 乘以 0.01 并不完全等于 1.00,而是大约等于它。

可以这样解决:

int t;
for (t = 0; t <= 100; t++) {
    std::cout << static_cast<double>(t)/100 << " ";
}

然后:

 std::cout << "t = "<<  static_cast<double>(t)/100 << " and t <= 1.00? " << (static_cast<double>(t)/100 <= 1) << std::endl;

关于c++ - <= 和 == 运算符无法正常工作以结束循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46672363/

相关文章:

c - 运算符优先级背后的逻辑

math - 数学函数不可逆吗?

c++ - 错误 : invalid use of 'Config::testMap'

C++:如何将一个函数(不知道其参数)传递给另一个函数?

C++ 将字符串转换为 int 函数

java - 我的java循环不工作。谁能明白为什么吗?

c++ - operator <- 在 C++ 中做什么?

c++ - 在接口(interface)映射遗留 C 接口(interface)中使用模板参数化类型

javascript - JavaScript 中未知大小的多维数组

r - 在R环境中,如何遍历哈希项?