1

对python还是新手,所以这对我来说很奇怪......

def getNormalizedStart(self):
        # center is Point: {X = 300, Y = 128}
        center = self.getTargetCenterFromStart()

        # effectiveStart is Point: {X=300.0,Y=472}
        effectiveStart = self.getFirstActiveTouchEventLocations()[0]["Point"]\
            if self.isTouchTrial() else self.getFirstMouseEventLocation()

        radians = float(MathUtils.angle(effectiveStart, center, True))

        # Point: {X=-44.0,Y=128.0}
        newStart = MathUtils.rotatePoint(effectiveStart, center, -radians)

        # newStart.X is float: -44
        # center.X is int: 300
        newStart.X -= center.X    # the result is -344. Good!

        # newStart.Y is float: 128.0
        # center.Y is int: 128
        newStart.Y -= center.Y    # the result is -5.68434188608e-14. Wut?
        return newStart

但它适用于控制台:

>>> x = 128.0
>>> y = 128
>>> x -= y
>>> x
0.0

我是疯了还是我错过了一些明显的东西?

4

2 回答 2

7

计算机中浮点运算的问题在于,一般来说,您无法获得准确的值。那是因为不可能用小数精确地表示一个数字,而且一个简单的操作128.0 - 128可能会导致非常小的错误。

像往常一样,解释这一点的强制性阅读是每个计算机科学家都应该知道的关于浮点运算的知识

于 2013-03-30T03:32:54.400 回答
7

我敢打赌你的 128.0 实际上不是 128。

例如:

>>> print x
128.0
>>> print x-128
5.68434188608e-14

但我在这里作弊:x实际上是

>>> x
128.00000000000006

str()和之间有区别repr()

>>> str(x)
'128.0'
>>> repr(x)
'128.00000000000006'

我通过numpy.nextafter计算 128 以上的两个微小增量来制作这个对象:

>>> numpy.nextafter(numpy.nextafter(128, 129),129)
128.00000000000006

要确认这一点,您应该检查repr(newStart.Y)newStart.Y > 128,同样检查center.Y,看看它们实际上是什么。

[编辑:你的差异是负数,所以它可能略小于 128 而不是略多一点,但你明白了。]

于 2013-03-30T03:43:31.267 回答