【问题标题】:Weird math operator when unit test单元测试时奇怪的数学运算符
【发布时间】:2021-05-08 15:48:20
【问题描述】:

我正在尝试为这个简单的函数编写单元测试:

/// 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) == 0cos(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

我开始怀疑我是否算错了。知道这是怎么发生的吗?

【问题讨论】:

  • 这能回答你的问题吗? Is floating point math broken?
  • 我之前的评论是指测试的问题(在屏幕截图中),我无法在操场上重现po cos(...) 的问题
  • @JoakimDanielson 这可能是相关的,但我不这么认为。浮点损坏不应该是sin(pi) = nan 的原因,对吧?我认为这是苹果的问题。

标签: ios swift xctest calculation xctestcase


【解决方案1】:

这是一种编写测试的方法,因此它不会因为浮点问题而失败

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)
}

【讨论】:

  • 这似乎可行,但对于向量和矩阵来说不是很方便,对吧?
猜你喜欢
  • 2015-12-11
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
相关资源
最近更新 更多