Skip to content

Commit 949a6b9

Browse files
rintarostephentyrone
authored andcommitted
[stdlib] Add default payload to Signaling NaN (#2494)
* [stdlib] Add default payload to Signaling NaN Or it will have inifinity bit pattern. * [stdlib] Skip isSignaling test on i386 arch see: #2494 * [stdlib] Allow 0 payload for signaling NaN Instead, use `_quietNaNMask >> 1` as the payload. That is, we use only significandBitCount - 2 bits for NaN payload.
1 parent d0f627c commit 949a6b9

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

stdlib/public/core/FloatingPointTypes.swift.gyb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,10 +459,11 @@ extension ${Self}: BinaryFloatingPoint {
459459
/// Compares not equal to every value, including itself. Most operations
460460
/// with a NaN operand will produce a NaN result.
461461
public init(nan payload: RawSignificand, signaling: Bool) {
462-
_precondition(payload < ${Self}._quietNaNMask,
462+
// We use significandBitCount - 2 bits for NaN payload.
463+
_precondition(payload < (${Self}._quietNaNMask >> 1),
463464
"NaN payload is not encodable.")
464465
var significand = payload
465-
if !signaling { significand |= ${Self}._quietNaNMask }
466+
significand |= ${Self}._quietNaNMask >> (signaling ? 1 : 0)
466467
self.init(sign: .plus,
467468
exponentBitPattern: ${Self}._infinityExponent,
468469
significandBitPattern: significand)

test/1_stdlib/Float.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,13 +222,24 @@ func checkQNaN(_ qnan: TestFloat) {
222222
_precondition(qnan.floatingPointClass == .quietNaN)
223223
}
224224

225+
func checkSNaN(_ snan: TestFloat) {
226+
checkNaN(snan)
227+
// sNaN cannot be fully supported on i386.
228+
#if !arch(i386)
229+
_precondition(snan.isSignaling)
230+
_precondition(snan.floatingPointClass == .signalingNaN)
231+
#endif
232+
}
233+
225234
func testNaN() {
226235
var stdlibDefaultNaN = TestFloat.nan
227236
checkQNaN(stdlibDefaultNaN)
228237

229238
var stdlibQNaN = TestFloat.quietNaN
230239
checkQNaN(stdlibQNaN)
231240

241+
var stdlibSNaN = TestFloat.signalingNaN
242+
checkSNaN(stdlibSNaN)
232243
print("testNaN done")
233244
}
234245
testNaN()

0 commit comments

Comments
 (0)