C 常数0.0039215689代表什么?

C 常数0.0039215689代表什么?,c,floating-point,constants,magic-numbers,C,Floating Point,Constants,Magic Numbers,我一直在各种图形头文件中看到这个不断弹出的窗口 0.0039215689 这似乎和颜色有关也许 以下是第一点: 这个数字代表什么?为什么没有人宣称它是常量 我在谷歌上找不到任何解释。这个乘以0.0039215689f的乘法将0到255范围内的整数值颜色强度转换为0到1范围内的实值颜色强度 正如Ilmari Karonen所指出的,即使这是一个优化,它也是一个表达得相当糟糕的优化。用(1.0f/255)相乘会更加清晰 0.0039215689大约等于1/255 鉴于这是OpenGL,性能可能很重

我一直在各种图形头文件中看到这个不断弹出的窗口

0.0039215689
这似乎和颜色有关也许

以下是第一点:

这个数字代表什么?为什么没有人宣称它是常量


我在谷歌上找不到任何解释。

这个乘以
0.0039215689f的乘法将0到255范围内的整数值颜色强度转换为0到1范围内的实值颜色强度


正如Ilmari Karonen所指出的,即使这是一个优化,它也是一个表达得相当糟糕的优化。用
(1.0f/255)
相乘会更加清晰

0.0039215689
大约等于
1/255

鉴于这是OpenGL,性能可能很重要。因此,我们可以安全地猜测,这样做是出于性能原因

乘以倒数比反复除以255快


旁注:

如果您想知道为什么这样的微优化没有留给编译器,那是因为它是一种不安全的浮点优化。换言之:

x / 255  !=  x * (1. / 255)
由于浮点舍入错误

因此,尽管现代编译器可能足够聪明,可以进行这种优化,但除非您通过编译器标志明确告诉它们,否则不允许它们进行优化


相关:

当我第一次看到它的时候,我其实不知道它是什么。但从它的使用方式来看,我怀疑这是一种乘反优化。所以我查了一下我的计算器,果然——我猜对了。我本以为它会写成
a=b*(1.0f/255)
;编译器仍在进行常量折叠,不是吗?@IlmariKaronen是的,它们仍在进行常量折叠。它实际上是模板解析之类的东西所必需的。但我会把它作为一个常量或一个宏。但是,并不是所有的代码都写得很好。:)@起初,我也在想同样的事情。但是如果使用256,它将从
0.0-0.996
缩放,而不是所需的
0.0-1.0
。(
0.996=255/256
其中
255
是最大的8位整数)当然,回答我自己的问题,这是因为其他两个数字不能表示为标准的C浮点数。低于0.0039215689的下一个浮点数是0.0039215684。源代码有没有理由写这个而不是
(1.f/255)
?嗯……如果有办法避免幻数的话……
1/255==0.00(3921568627450980)
——帕伦斯意味着重复。对于你的下一个幻数,不管是什么原因,使用一个魔术数字而不记录它的用途是非常不彩色的,也许更好,定义为常量?@Johny肯定定义为常量。这一点不是一个神奇的价值。
x / 255  !=  x * (1. / 255)