我正在将大量的float映射为int。所有浮点数都在[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的浮点常量,它保证范围[0; 1]中的所有f都具有严格的不等式(int)(f * C) < M
。
当然,我们可以简单地设置C = M - 0.001f
并完成它。但是,让我们假设我们想以正确的方式来做。如果涉及任意整数宽度而不是8位,C到底是什么?换句话说:
给出一个整数M> 0,什么是(int)C < M
这样的最大浮点数C?
答案 0 :(得分:4)
给定一个整数M,使得(int)C
它将是std::nextafterf(M, 0)
。