【问题标题】:Why nomalise a float &... why is alpha a 0 to 1 float point number in CSS rgba()为什么规范化浮点数&...为什么在 CSS rgba() 中 alpha 是 0 到 1 的浮点数
【发布时间】:2016-10-20 00:01:23
【问题描述】:

这里的重点问题。对不起。

我试图从数学的角度理解*规范化**。

toxiclibs 库中,可以规范化浮点数。为什么要对浮点数进行归一化...在 3D 中,我知道 3 维平面的法线可以给出 up。第一个想法:这与性能有关。但后来我发现这个SO question 解释了游戏用户界面如何使用它。这...我有点明白。

可以公平地说,将有最大值和最小值的浮点数归一化吗?我能想到的两种情况:

  1. CSS 颜色 RGBA:RGB 介于 0 到 255 之间,但理论上可以更高。而 A 是从 0.0 到 1.0。这是归一化的,因为它可以是完全透明的或不透明的,因此它是正常的,因为有一个确定的 0 或 1?

  2. 在录制音乐(或查看波形)时,可以对其进行剪辑。这是因为有一个最大值和一个最小值,所以高于 1 的归一化值会被剪裁吗?我想,在这种情况下,规范化是为了方便。

那么,为什么要标准化一个浮点数?是性能吗?可读性?别的东西(视觉参考==荣誉)?一直到 11 的 Spinal Tap Amp 与此有关吗?

【问题讨论】:

  • 正如 Jim 指出的,规范化向量(或平面)与规范化浮点数相同。这是两个完全不同的概念,却碰巧同名。

标签: math


【解决方案1】:

“归一化”浮点数的简要说明

在科学记数法中,您可以将任何数字写为x.y * 10^z,其中x 是一个非零数字。例如212 = 2.12 * 10^2x 总是有可能是个位数,因为您可以继续除以 10。同样,x 始终有可能为非零,因为您可以在尝试写入值 0 时继续乘以 10 except。科学计数法中的00.0 * 10^0 结尾。

More about scientific notation

继续使用浮点数...浮点数基本上是二进制的科学记数法。它们以x.y * 2^z 的形式编写。 x 仍然是一个非零数字,但在二进制中只留下一个选项:1!如果你在计算机中实现浮点存储,你不想浪费一点 always 1,所以你只存储 yz(和 +/ -)。

但是现在你如何存储0?事实证明,z 的特殊值用于表示“x 实际上是0”。然后你可以存储0.0。但您也可以存储 0.0010100011000 * 2^(special z) 和各种“非正规”值。

我不明白toxiclib 的 normalize 函数的作用 - 我找不到文档。据我所知,非正规浮点数对于相同精度的浮点数没有等效的规范化表示(非正规单声道可以表示为普通双精度,但不能表示为普通单精度)。也许这就是该功能正在做的事情。但除非您处理的是一些非常低级或高精度的东西,否则您可能不会在意。

Eric Lippert 有一个 good explanation 的漂浮物解剖结构。

【讨论】:

    【解决方案2】:

    我知道这是一个陈旧的线程,但是 FWIW(我是上述毒性库的作者) - 我通常更喜欢使用标准化值(即在 0.0 .. 1.0 或 -1.0 ... + 1.0 间隔)仅仅是因为它使它们在多个域中工作时更加灵活。您只需拥有一个关联的比例值或映射系数,每当使用该值时就会应用该值。这允许我将实际的绝对范围定义保留在代码之外和/或对 GUI 元素使用更人性化的数字范围。所以我倾向于将它们视为百分比,它有点像纳米级的 MVC。

    例如我可能有许多配置文件为 3D 角色定义了不同的高度范围。我的工具不关心绝对值是什么,但它可能有一些特殊情况,例如 >80% (0.8)。我的模型只使用标准化值。

    配置 A 可能是:min:50 - max:200
    配置 B:最小:20 - 最大:100

    如果我的高度值在内部只是在 0.0 .. 1.0 之间表示,那么我可以更好地使用它并且计算真正的绝对值(即该模型参数的“视图”)非常容易:

    float val = config.min + (config.max-config.min) * normVal;
    

    现在,如果有其他参数(具有自己的范围)取决于我的高度参数,标准化状态可以很容易地将其应用于它们的域(并避免不必要的重新映射)...

    【讨论】:

    • 最后...我前段时间读到了你的回答,但一分钱刚刚完全下降(尤其是由于范围超出代码)。太棒了,谢谢。
    【解决方案3】:

    为什么要规范化浮点数

    使尽可能多的位有意义。

    如果浮点数始终介于 0.5 和 1.0 之间,则可以假定最左边的位为 1。额外的一位精度。

    【讨论】:

    • 但是,如果有一个浮点数,然后对其进行归一化,它会获得精度吗?
    • 确实,浮点数具有有限的精度。大多数(我相信超过一半)可呈现的值在 -1.0 和 1.0 之间可用。不过,归一化操作本身在逻辑上似乎会失去一些精度,因此除非您要对归一化值进行进一步的数学运算,否则它是没有意义的。
    • @Ross:是的。但是,它不会获得准确性。归一化的重点是进行必要的代数,以在每个浮点运算的每一步产生归一化的结果。未归一化的浮点数需要非常复杂的处理才能创建。
    • @S.洛特:你的回答让我很困惑。您似乎混合了两种不同的“标准化”概念。对于几乎所有值,包括所有大于 1.0 的值,可以假定最左边的位为 1。只有非常接近零的值才能做出假设。虽然 Core Xii 关于一半值介于 -1.0 和 1.0 之间的评论是正确的,但如果将更大范围的值塞进 -1.0 到 1.0 的小范围内,就会失去优势。
    • @Mashmagar:“只有非常接近零的值才能做出假设”?什么?它们被标准化以遵循标准化浮点值的 IEEE 标准。没有假设。这是一个规则。
    【解决方案4】:

    没有一个标准化的概念。平面的法线与向量的归一化不同,向量的归一化与浮点数的归一化不同。

    【讨论】:

      猜你喜欢
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多