Skip to content

Commit d7d05e1

Browse files
hoomanstephentyrone
authored andcommitted
Make .significandWidth do the right thing for exact powers of two
Resolves SR-2868.
1 parent 41a84bb commit d7d05e1

File tree

2 files changed

+13
-0
lines changed

2 files changed

+13
-0
lines changed

stdlib/public/core/FloatingPointTypes.swift.gyb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,7 @@ extension ${Self}: BinaryFloatingPoint {
668668
public var significandWidth: Int {
669669
let trailingZeros = significandBitPattern.countTrailingZeros
670670
if isNormal {
671+
guard significandBitPattern != 0 else { return 0 }
671672
return ${Self}.significandBitCount - trailingZeros
672673
}
673674
if isSubnormal {

test/stdlib/FloatingPoint.swift.gyb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,18 @@ FloatingPoint.test("${Self}/LosslessStringConvertible") {
395395
checkLosslessStringConvertible(instances)
396396
expectTrue(Float(String(Float.nan))!.isNaN)
397397
}
398+
399+
FloatingPoint.test("${Self}.significandWidth") {
400+
expectEqual(-1, ${Self}(0).significandWidth)
401+
expectEqual(-1, ${Self}.infinity.significandWidth)
402+
expectEqual(-1, ${Self}.nan.significandWidth)
403+
expectEqual(${Self}.significandBitCount, ${Self}(1).nextUp.significandWidth)
404+
expectEqual(${Self}.significandBitCount, ${Self}(1).nextDown.significandWidth)
405+
expectEqual(0, ${Self}.ulpOfOne.significandWidth)
406+
expectEqual(0, ${Self}(1).significandWidth)
407+
expectEqual(0, ${Self}(2).significandWidth)
408+
expectEqual(1, ${Self}(3).significandWidth)
409+
}
398410
% if Self == 'Float80':
399411
#endif
400412
% end

0 commit comments

Comments
 (0)