Floating point 从0.0-1.0间隔转换时,为什么需要将RGB值乘以256而不是255?

Floating point 从0.0-1.0间隔转换时,为什么需要将RGB值乘以256而不是255?,floating-point,integer,rounding,Floating Point,Integer,Rounding,我在这个问题上读到了关于舍入的技巧。 在0到1的范围内有一个浮点数,您希望将其映射到0-255的字节整数范围。所以你把0-1乘以255f,然后把这个数字转换成一个字节。因为所有的转换都只是浮点数的小数部分,所以需要一种方法使浮点数达到小数部分,当浮点数达到小数部分时,它将达到所需的四舍五入结果 我的想法是在转换成字节之前只添加0.5f 然而,我在我链接的页面上发现了一些我不理解的新东西。他将0-1映射到256,这将以某种方式获得一个四舍五入的结果 我测试了这些值,看看它是否有效,看起来确实有效

我在这个问题上读到了关于舍入的技巧。

在0到1的范围内有一个浮点数,您希望将其映射到0-255的字节整数范围。所以你把0-1乘以255f,然后把这个数字转换成一个字节。因为所有的转换都只是浮点数的小数部分,所以需要一种方法使浮点数达到小数部分,当浮点数达到小数部分时,它将达到所需的四舍五入结果

我的想法是在转换成字节之前只添加0.5f

然而,我在我链接的页面上发现了一些我不理解的新东西。他将0-1映射到256,这将以某种方式获得一个四舍五入的结果


我测试了这些值,看看它是否有效,看起来确实有效。我只是不明白为什么。有人能给我一个证据吗?

这是一个特殊的例子。如果你只有两种颜色,黑色和白色,你可以看到最简单的解释。因此,很容易看出,必须将间隔0-1除以2

这可以通过将间隔乘以稍微少一点的除法数并截断结果来轻松实现。这也是随机数生成器返回值>=0和<1.0以获得概率相等的值的原因

因此,在本例中,使用value=floorf(1.9999*x)得到正确的结果


问题是,虽然颜色索引以数字1结尾,但实际上有两种颜色(0和1),因此间隔必须除以2。因此,对于256色(0-255),需要除以数字256。人们可能会注意到0也是一个有效值,并且必须正确映射。

这是一种特殊情况。如果你只有两种颜色,黑色和白色,你可以看到最简单的解释。因此,很容易看出,必须将间隔0-1除以2

这可以通过将间隔乘以稍微少一点的除法数并截断结果来轻松实现。这也是随机数生成器返回值>=0和<1.0以获得概率相等的值的原因

因此,在本例中,使用value=floorf(1.9999*x)得到正确的结果


问题是,虽然颜色索引以数字1结尾,但实际上有两种颜色(0和1),因此间隔必须除以2。因此,对于256色(0-255),需要除以数字256。人们可能会注意到0也是一个有效值,必须正确映射。

简单地说,如果你用整数“0,1,2,3”表示颜色,你需要选择一些东西作为你的0.5大小写。如果你选择1,你会得到0.0,0.5,0.75,1.0。如果你选择2,你会得到0.0,0,25,0.5,1.0。没有办法使这些间隔相等,但整数颜色不能有小数。唯一的解决方案是完全消除0.5的情况,并使用偶数间隔0.333 0.666,但他们选择不这样做。所以颜色127/255当前的计算结果是0.5,而不是0.498,因为它是128/256。不幸的是,在分子和分母中添加1会导致颜色0被解释为1/256,而不是0/255。简单地说,如果您用整数“0,1,2,3”表示颜色,您需要选择一些东西作为0.5的大小写。如果你选择1,你会得到0.0,0.5,0.75,1.0。如果你选择2,你会得到0.0,0,25,0.5,1.0。没有办法使这些间隔相等,但整数颜色不能有小数。唯一的解决方案是完全消除0.5的情况,并使用偶数间隔0.333 0.666,但他们选择不这样做。所以颜色127/255当前的计算结果是0.5,而不是0.498,因为它是128/256。不幸的是,在分子和分母中加1会导致颜色0被解释为1/256而不是0/255

我的陈述是事实性的,而且是主题性的。如果有人对答案有疑问,试着发表评论,而不是否决投票。我的陈述是真实的,而且是主题性的。如果有人对答案有疑问,试着发表评论而不是否决投票。