提问人:H Kumar 提问时间:2/7/2023 最后编辑:H Kumar 更新时间:2/7/2023 访问量:92
比较 int64 和浮点值在循环内不起作用
Comparing int64 and float value does not work inside loop
问:
仅当 which is 小于 ceil 返回的值 double 时,以下循环才会运行。但是,我没有看到正在执行的循环。off
uint64_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
我不太确定这里发生了什么,我怎样才能执行循环?
答:
2赞
Marek R
2/7/2023
#1
问题是这个表达式:
off < ceil((float)(offset + size) / div)
请注意,在此比较的一侧,您在另一侧有.uint64_t
float
在进行比较之前,必须选择通用类型。这是一个 .float
因此,左边的值 : 将转换为 。由于只有有效数字,因此结果将四舍五入到最接近的值,该值可以用 表示。116422670
float
float
6
float
它恰好是:。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
我怎样才能使循环执行?
修复浮点数学的替代方法:不要将浮点数学用于整数问题。
在本例中,请使用 缩放 。off
div
// 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;
}
评论
main
bits/stdc++
float
6
#include < bits/stdc++.h>
?.你明白为什么这不是一个好主意吗?因为您询问有关 C++ 的问题,但您的代码无法使用许多 C++ 编译器进行编译。对于不包括 2-3 个标题来说,这是一个相当大的代价1164226702430/10000
116422670.243