比较 int64 和浮点值在循环内不起作用

Comparing int64 and float value does not work inside loop

提问人:H Kumar 提问时间:2/7/2023 最后编辑:H Kumar 更新时间:2/7/2023 访问量:92

问:

仅当 which is 小于 ceil 返回的值 double 时,以下循环才会运行。但是,我没有看到正在执行的循环。offuint64_t

#include <bits/stdc++.h>
using namespace std;

int main()
{
    uint64_t offset = 1164226701485, size = 945, div = 10000;
    for (uint64_t off = offset / div; off < ceil((float)(offset + size) / div); off++)
    {
        cout<<off;
    }
                            
    return 0;
}

因此,我尝试打印这些对我来说似乎正确的值,并且循环应该至少执行一次

cout.precision(17);
cout<< offset / div<<" "<< ceil((float)(offset + size) / div);

输出:

116422670 116422672

我不太确定这里发生了什么,我怎样才能执行循环?

C++ 浮点 精度 格式说明符 UInt64

评论

0赞 463035818_is_not_an_ai 2/7/2023
当您发布一个最小的可重现示例时,可以帮助您要容易得多。这就是我在失去兴趣之前走了多远 godbolt.org/z/MGPeaoxvM。您不需要删除包含和用于测试代码的。这样做的主要效果是其他人必须将其添加回来......main
0赞 H Kumar 2/7/2023
添加了MRE,我知道现在有人会来说为什么使用不是一个好主意bits/stdc++
2赞 Marek R 2/7/2023
问题是您正在使用只有!!有效数字!float6
0赞 463035818_is_not_an_ai 2/7/2023
给你 为什么我不应该 #include < bits/stdc++.h>.你明白为什么这不是一个好主意吗?因为您询问有关 C++ 的问题,但您的代码无法使用许多 C++ 编译器进行编译。对于不包括 2-3 个标题来说,这是一个相当大的代价
0赞 H Kumar 2/7/2023
@MarekR但这里只有 3 个精度数字,= 可以决定 ceil 最终将四舍五入到最接近的整数(更大)1164226702430/10000116422670.243

答:

2赞 Marek R 2/7/2023 #1

问题是这个表达式:

off < ceil((float)(offset + size) / div)

请注意,在此比较的一侧,您在另一侧有.uint64_tfloat

在进行比较之前,必须选择通用类型。这是一个 .float

因此,左边的值 : 将转换为 。由于只有有效数字,因此结果将四舍五入到最接近的值,该值可以用 表示。116422670floatfloat6float

它恰好是:。116422672f

演示:https://godbolt.org/z/xhEnMKE8e

在观看十进制值时很难发现四舍五入问题,因此请查看以下内容: https://godbolt.org/z/TTEqvx1vG

评论

0赞 H Kumar 2/7/2023
当您将精度设置为 17 时,为什么仍然给我们cerr.precision(17);static_cast<float>(offset / div)116422672
0赞 Marek R 2/7/2023
cerr.precision(17);只是从您的示例中复制并留下,因此也可以进行测试。double
0赞 H Kumar 2/7/2023
当你说时,还有wdymresult is rounded to nearest value which can be represented in float
0赞 Marek R 2/7/2023
这就是浮点的工作方式。它们具有可以表示的一组值。计算结果始终四舍五入到最接近的值,该值可以由给定的浮点类型表示。它与使用有限数量的位数以十进制形式显示的东西相同。1/3
0赞 Marek R 2/7/2023
也试试这个网站
1赞 chux - Reinstate Monica 2/7/2023 #2

我怎样才能使循环执行?

修复浮点数学的替代方法:不要将浮点数学用于整数问题。

在本例中,请使用 缩放 。offdiv

// for (uint64_t off = offset / div; off < ceil((float)(offset + size) / div); off++) {
//    cout<<off;
// }

for (uint64_t off = offset; off < offset + size; off += div)
    cout << off/div;
}