首页 > 解决方案 > 给定一个整数 M,满足 (int)C < M 的最大浮点数 C 是多少?

问题描述

我正在将大量浮点数映射到整数。所有浮点数都在 [0;1] 范围内,整数应在 [0, M) 范围内M = 1 << k,例如 256。

我关心均匀分布,所以我不能使用像这样的东西round (f * 255),它会留下第一个和一半容量的桶。

天真地,有人会这样做:

int i = (int)(f * M);

由于 f = 1.0 失败(导致 i = M 而不是 M - 1),我们需要单独讨论:

int i = min (M - 1, (int)(f * M));

相反,我想简单地做类似的事情

int i = (int)(f * C);

其中 C 是一个小于 M 的浮点常数,它保证了(int)(f * C) < M[0;1] 范围内的所有 f 的严格不等式。

当然,我们可以简单地设置C = M - 0.001f并完成它。但是让我们假设我们想以正确的方式来做。如果涉及任意整数宽度而不仅仅是 8 位,那么 C 到底是什么?换句话说:

给定一个整数 M > 0,最大的浮点数 C 是(int)C < M多少?

标签: c++floating-point

解决方案


给定一个整数 M,满足 (int)C < M 的最大浮点数 C 是多少?

会的std::nextafterf(M, 0)


推荐阅读