CGGA意外值的CGAffineTransformMakeRotation

时间:2014-06-22 22:37:39

标签: objective-c ios7 cgaffinetransform cgpoint

我正在使用CGAffineTransformRotation旋转CGPoints

执行此代码:

double degToRad(double degrees) {
  return ((degrees) * (M_PI / 180.0));
}

CGAffineTransform rotate = CGAffineTransformMakeRotation(degToRad(-90.0));

NSLog(@"before n.nP %@",NSStringFromCGPoint(node.nodePoint));

node.nodePoint = CGPointApplyAffineTransform(node.nodePoint, rotate);

NSLog(@"after  n.nP %@",NSStringFromCGPoint(node.nodePoint));

给出了这些结果:

before n.nP {96, 196}
after n.nP  {196, -95.999999999999986}

这是可以理解的; -95.999 ...而不是-96是由于某些内部舍入/ M_PI的表达程度限制。在这种情况下,差异程度可以忽略不计。

但结果如下:

before n.nP {0, 768}
after n.nP  {768, 4.702643708725836e-14}

......让我感到困惑。我希望{768, 0}或相当接近作为返回值。为什么这种情况下的差异程度如此之大?

1 个答案:

答案 0 :(得分:1)

所以差异不是那么大。事实上,它非常小!在我们进入为什么存在这种差异之前,让我们解释一下这种差异意味着什么:

after n.np {768, 4.702643708725836e-14}

注意最后的e-14。这意味着4.702643708725836 x 10^-14或。00000000000004702643708725836,非常接近0.要了解有关 E符号的更多信息,请read this

现在,为什么会发生这种情况是M_PI和floating point representation的不准确性。浮点数(浮点数)是C语言(以及许多其他语言)表示非整数( int )数字的方式。它使用基于近似的方法,因为不可能用实际的位数表示所有数字。 双打就像浮动,但使用两倍的位(因此 double )来表示实数,因此具有更高的准确性。但它们仍然是近似值,有时会产生不准确的小文物,因此you shouldn't directly compare floats typically