循环的Java无限 - 浮动123456789

时间:2017-01-01 10:10:40

标签: java while-loop infinite-loop

我目前正在学习java浮点数。我知道,浮动具有特定数量的显着差异。我也知道,浮点数在java中表示为-1或1 * num * 10 ^ x。其中num是数字,10 ^ x是小数" point"。但在这里,我们没有一小部分。这里的无限循环怎么可能?

具有无限循环的代码:

// MARK: Rotation of Model and Camera
func rotationRecognized(sender: UIPanGestureRecognizer)
{
    if sender.state == .ended
    {
        if self.rotationMode == .model
        {
            if rootNode != nil
            {
                currentYAngle = rootNode!.eulerAngles.y
            }
        }
        else if self.rotationMode == .camera
        {
            if cameraNode != nil
            {
                currentXAngle = cameraNode!.eulerAngles.x
            }
        }

        self.rotationMode = .none
        return
    }

    let translation = sender.translation(in: sender.view)

    // Began
    if translation.x == 0 && translation.y == 0 && self.rotationMode == .none
    {
        return
    }
    else
    {
        // First change after recognition
        if self.rotationMode == .none
        {
            if abs(translation.x) > 0
            {
                self.rotationMode = .model
            }
            else if abs(translation.y) > 0
            {
                self.rotationMode = .camera
            }
        }
        else
        {
            if self.rotationMode == .model
            {
                if rootNode != nil
                {
                    var newAngleY = Float(translation.x / 4) * Float(M_PI / 180.0)
                    newAngleY += currentYAngle
                    rootNode!.eulerAngles.y = newAngleY
                }
            }
            else if self.rotationMode == .camera
            {
                if cameraNode != nil
                {
                    var newAngle = Float(translation.y / 4) * Float(M_PI / 180.0)

                    if translation.y < 0 // Up
                    {
                        if Math.toDegrees(Double(newAngle + currentXAngle)) < -70
                        {
                            return
                        }
                    }
                    else if translation.y > 0 // Down
                    {
                        if Math.toDegrees(Double(newAngle + currentXAngle)) > -10
                        {
                            return
                        }
                    }

                    newAngle += currentXAngle
                    cameraNode!.eulerAngles.x = newAngle
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:4)

关于浮点运算。当你通过号码addToAnswer()时,你偶然发现了数字,你会发现错误,因为f = 1.23456792E8f-1在这里有相同的浮点表示。因此,递减使得数字本身,这导致无限循环。请检查:

f

这个号码有多特别,为什么执行停止?这是因为System.out.println(1.23456792E8f); System.out.println(1.23456792E8f - 1); 的浮点表示是123456789。由于缺少浮点数的精度,这已经给出了至少1.23456792E8的差距。使用3代替double会使程序完成,但问题会出现更高的数字。