如何识别具有潜在精度损失的Double?

时间:2019-10-01 17:04:33

标签: swift double precision

(在Xcode 11.1中使用Swift 5.1),如何防止以下失败的测试场景?基本上,我希望能够在Double上写一个扩展名,这是一个计算属性potentiallyLostPrecision,可以在通过测试用例Double的“好” testPrecision17Decimals和“失败的测试案例Double中的错误” testPrecision18Decimals

我尝试查看ulp,有效位数,将nextUp与自身进行比较,并查看mantissaexponent等,但是我无法提出任何可行的方法。

import Foundation
import XCTest

class DecimalPrecisionTests: XCTestCase {

    func testPrecision13Decimals() {

        doTestSmallDecimals(
            smallest: 0.0102030405054,
            aDecimal: 0.0102030405055,
            greatest: 0.0102030405056
        )
    }

    func testPrecision16Decimals() {

        doTestSmallDecimals(
            smallest: 0.0102030405060705,
            aDecimal: 0.0102030405060706,
            greatest: 0.0102030405060707
        )
    }

    func testPrecision17Decimals() {

        doTestSmallDecimals(
            smallest: 0.01020304050607065,
            aDecimal: 0.01020304050607066,
            greatest: 0.01020304050607067
        )
    }

    // This test fails
    func testPrecision18Decimals() {

        doTestSmallDecimals(
            smallest: 0.010203040506070805,
            aDecimal: 0.010203040506070806,
            greatest: 0.010203040506070807
        )
    }

}

private extension DecimalPrecisionTests {

    func doTestSmallDecimals(
        smallest: Double,
        aDecimal: Double,
        greatest: Double
    ) {

        XCTAssertGreaterThan(greatest, aDecimal)
        XCTAssertGreaterThan(aDecimal, smallest)

        XCTAssertLessThan(smallest, aDecimal)
        XCTAssertLessThan(aDecimal, greatest)
    }

}

0 个答案:

没有答案