(Используя 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)
}
}