【问题标题】:Multiplying and dividing CGFloat and loss of precision [duplicate]乘除 CGFloat 和精度损失 [重复]
【发布时间】:2013-01-17 12:50:25
【问题描述】:

可能重复:
CGFloat addition bug?

我有一些代码,我在其中对CGFloats 进行了大量的乘法和除法,以便找出转换的正确尺寸。我注意到有时当我想得到 320 的值时,我会得到 320.00000092。谁能解释为什么会发生这种情况以及如何纠正它?是不是应该这样做?以下是一些可能出现问题的示例代码:

- (void) setMinimumSize
{
    CGSize superViewSize = self.superview.bounds.size;
    CGSize size = self.frame.size;

    CGFloat xScale = superViewSize.width / size.width;
    CGFloat yScale = superViewSize.height / size.height;

    CGFloat minimumScale = MIN(xScale, yScale);
    self.minimumSize = CGSizeMake(size.width * minimumScale, size.height * minimumScale);
}

- (void) scaleToMinimumSize
{
    self.transform = CGAffineTransformScale(self.transform, self.minimumSize.width / self.frame.size.width, self.minimumSize.height / self.frame.size.height);
}

【问题讨论】:

标签: iphone ios cocoa-touch math


【解决方案1】:

不要比较相等,不适用于浮点(或双精度),而是比较 与适合您的准确性需求的一些增量的差异

这始终是十进制和浮点数的问题。

问一个中学生 (1/3.0)*3.0,都说 1。电脑说 0.999999。

你不能指望0 成为0.000000,它永远不会接近那个。

编辑:

如果浮动非常有用,你应该阅读这个 http://en.wikipedia.org/wiki/IEEE_754-2008

还有What Every Computer Scientist Should Know About Floating-Point Arithmetic

【讨论】:

  • 这不是解释(正如问题中所要求的那样)。此外,陈规定型的“平等不适用于浮动”在这种情况下既不正确也不是问题。
  • 作为 OP“他期望 320,但得到 320.00000092”,这意味着他正在尝试比较这两个值。另外,为什么 320 是 320.00000092 也是另一个问题。为此我提到你不能在浮点数中获得 0.0000000 的精度。
  • 您只是复制了其他人的答案(从这里stackoverflow.com/a/5334849/104790 和这里stackoverflow.com/a/10335601/104790)而没有提及来源。请理解,这在 SO 上是不受欢迎的。
  • 实际上,当以 IEEE-754 双精度计算时,1/3.0 * 3.0 is 正好是 1.0,而应该正好为零的结果是最有可能引起注意的错误。浮点数是微妙的,不影响所提出的特定问题的通用答案通常是不正确的。
  • 你的说法“只要你想要一个具有一定精度的浮点值,你可以取一个整数并乘以它”对于许多操作也是错误的。
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
相关资源
最近更新 更多