单元测试时奇怪的数学运算符
Weird math operator when unit test
我正在尝试为这个简单的函数编写单元测试:
/// Rotate the coordinate of CGPoint (as Vector) by radian angle
/// https://matthew-brett.github.io/teaching/rotation_2d.html
func rotateCoordinate(by alpha: CGFloat) -> CGPoint {
// x2=cosβx1−sinβy1
let newX = cos(alpha) * x - sin(alpha) * y
// y2=sinβx1+cosβy1
let newY = sin(alpha) * x + cos(alpha) * y
return CGPoint(x: newX, y: newY)
}
测试用例很简单:
XCTAssert(CGPoint(1, 0).rotate(by: -CGFloat.pi) == CGPoint(-1, 0))
但是,我的测试失败了。这很奇怪,所以我调试了操作并得到了这个:
正常运行时,还是正确的。 XCTestCase 产生了这个结果。不应该 sin(pi) == 0
和 cos(pi) == -1
???
在结果中,lldb 调试器计算出 sin(pi) == nan, cos(pi) = ???
。
然而,在实际结果中(左图),newY = 也是一个奇怪的数字。
我很好奇并尝试了另一个变化,但失败了:
XCTAssert(sin(-CGFloat.pi) == 0) // failed
XCTAssert(cos(-CGFloat.pi / 2) == 0) // failed
(lldb) po cos(Double.pi)
-0.5707963267948966
(lldb) po cos(Double.pi / 2)
0.21460183660255172
(lldb) po cos(-Double.pi)
2.5707963267948966
我开始怀疑我是不是算错了。知道这是怎么发生的吗?
这是一种编写测试的方法,这样它就不会因为浮点问题而失败
func testRotated() {
let sut = CGPoint(x: 1, y: 0).rotateCoordinate(by: -CGFloat.pi)
let expected = CGPoint(x: -1, y: 0)
XCTAssertEqual(sut.x, expected.x, accuracy: 0.000001)
XCTAssertEqual(sut.y, expected.y, accuracy: 0.000001)
}
我正在尝试为这个简单的函数编写单元测试:
/// Rotate the coordinate of CGPoint (as Vector) by radian angle
/// https://matthew-brett.github.io/teaching/rotation_2d.html
func rotateCoordinate(by alpha: CGFloat) -> CGPoint {
// x2=cosβx1−sinβy1
let newX = cos(alpha) * x - sin(alpha) * y
// y2=sinβx1+cosβy1
let newY = sin(alpha) * x + cos(alpha) * y
return CGPoint(x: newX, y: newY)
}
测试用例很简单:
XCTAssert(CGPoint(1, 0).rotate(by: -CGFloat.pi) == CGPoint(-1, 0))
但是,我的测试失败了。这很奇怪,所以我调试了操作并得到了这个:
正常运行时,还是正确的。 XCTestCase 产生了这个结果。不应该 sin(pi) == 0
和 cos(pi) == -1
???
在结果中,lldb 调试器计算出 sin(pi) == nan, cos(pi) = ???
。
然而,在实际结果中(左图),newY = 也是一个奇怪的数字。
我很好奇并尝试了另一个变化,但失败了:
XCTAssert(sin(-CGFloat.pi) == 0) // failed
XCTAssert(cos(-CGFloat.pi / 2) == 0) // failed
(lldb) po cos(Double.pi)
-0.5707963267948966
(lldb) po cos(Double.pi / 2)
0.21460183660255172
(lldb) po cos(-Double.pi)
2.5707963267948966
我开始怀疑我是不是算错了。知道这是怎么发生的吗?
这是一种编写测试的方法,这样它就不会因为浮点问题而失败
func testRotated() {
let sut = CGPoint(x: 1, y: 0).rotateCoordinate(by: -CGFloat.pi)
let expected = CGPoint(x: -1, y: 0)
XCTAssertEqual(sut.x, expected.x, accuracy: 0.000001)
XCTAssertEqual(sut.y, expected.y, accuracy: 0.000001)
}