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

时间:2019-02-18 20:28:56

标签: c++ floating-point

我正在将大量的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?

1 个答案:

答案 0 :(得分:4)

  

给定一个整数M,使得(int)C

它将是std::nextafterf(M, 0)