Как я могу определить Double с потенциально потерянной точностью? - PullRequest
0 голосов
/ 01 октября 2019

(Используя Swift 5.1 в Xcode 11.1), как я могу защититься от неудачного сценария тестирования ниже? По сути, я хочу иметь возможность написать расширение для Double, вычисляемое свойство potentiallyLostPrecision, которое может определять между "хорошим" Double в проходящем тестовом случае testPrecision17Decimals и "плохим" Double в случае неудачиконтрольный пример testPrecision18Decimals.

Я пытался посмотреть на ulp, значительно и сравнивать nextUp с собой и смотреть на mantissa, exponent и т. д., но я не смог придумать ничего, что сработало.

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

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...