【问题标题】:For loop with float as counter, increasing by 0.01, does not print expected float values [duplicate]以浮点数为计数器的循环,增加 0.01,不打印预期的浮点值 [重复]
【发布时间】:2013-04-20 19:02:06
【问题描述】:
for (float x = 0.00; x < 1.00; x += 0.01) {
    cout << x << endl;
}

我期待

0.00
0.01
0.02
...

它工作正常,直到 0.83:

...
0.81
0.82
0.83
0.839999
0.849999
0.859999
0.869999
0.879999
0.889999
0.899999
0.909999
0.919999
0.929999
0.939999
0.949999
0.959999
0.969999
0.979999
0.989999
0.999999

那部分是怎么回事?为什么所有额外的9s?

【问题讨论】:

标签: c++ floating-point


【解决方案1】:

请阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic

浮点类型不能代表所有可能的数值。他们有些不精确。最接近0.84 的可表示IEEE754 单精度浮点值是0.839999973773956298828125。这比0.84 少一点。如您所见,打印时显示为0.839999。这个数字的二进制表示是:

00111111 01010111 00001010 00111101

事实上,即使0.01 也不能完全用float 表示,所以每次你把这个值加到x 上,你的期望就会变得越来越不精确。您可以改用ints 来避免这种情况,如下所示:

for (int x = 0; x < 100; x += 1) {
    cout << (x / 100.0f) << endl;
}

但是,它打印的许多值在执行除法后仍然无法表示。如果您根本无法处理不精确性,那么您必须根本不使用浮点值。将您的值存储为 ints 并简单地将它们解释为表示对应的除以 100 float 值。

【讨论】:

    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多