0

我将如何评估等效性 - 说的那句话sender.alpha != 1?我怎么知道它是否完全不透明?

- (IBAction)buttonPressed:(UIButton *)sender {
    NSLog(@"%@ -- Opacity: %f", digitPressed, sender.alpha);
    if (sender.alpha != 1) {
        NSLog(@"Nope!");
    }
4

1 回答 1

1

一般来说,比较浮点数不是一个好主意。但是在完全不透明的不透明度测试的特殊情况下,比较1.0f可能没问题。这是因为:

  1. 1.0f是 IEEE 单精度二进制浮点的精确值。(这就是你将在这里使用的。)
  2. 您想要检测这种精确相等的情况将是您要比较的值(几乎可以肯定)首先准确指定的情况。特别是,纯色的不透明度设置为精确1.0f

如果您的用例不是检测纯色,而是确定事物是否“足够纯”,那么您需要进行更复杂的检查,测试该值是否“在 ε 内”(epsilon)。特别是,考虑到 alpha 值的特殊特性(硬限制 1.0,在实现中通常映射到 256 个离散值,因此对 ε 的良好估计很容易计算出来),您会发现这个简化版本很可能做正确的事:

if (1.0f - sender.alpha < 1.0f/256) …
于 2013-10-13T07:34:38.073 回答