我目前正在学习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
}
}
}
}
}
答案 0 :(得分:4)
关于浮点运算。当你通过号码addToAnswer()
时,你偶然发现了数字,你会发现错误,因为f = 1.23456792E8
和f-1
在这里有相同的浮点表示。因此,递减使得数字本身,这导致无限循环。请检查:
f
这个号码有多特别,为什么执行停止?这是因为System.out.println(1.23456792E8f);
System.out.println(1.23456792E8f - 1);
的浮点表示是123456789
。由于缺少浮点数的精度,这已经给出了至少1.23456792E8
的差距。使用3
代替double
会使程序完成,但问题会出现更高的数字。