Skip to content

Commit 218f6b3

Browse files
committed
+ different fix for Pack/Unpack2 (works as for floats)
1 parent f513b14 commit 218f6b3

File tree

2 files changed

+4
-12
lines changed

2 files changed

+4
-12
lines changed

Lib/test/test_struct.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -935,9 +935,8 @@ def test_half_float(self):
935935
self.assertTrue(math.isnan(struct.unpack('<e', bits)[0]))
936936
self.assertTrue(math.isnan(struct.unpack('>e', bits[::-1])[0]))
937937

938-
# Check round-trip for NaN's:
939-
if sys.platform != 'win32':
940-
for formatcode, bits in format_bits__nan_list:
938+
if sys.platform != 'win32':
939+
# Check round-trip for NaN's:
941940
nan = struct.unpack('<e', bits)[0]
942941
self.assertEqual(struct.pack('<e', nan), bits)
943942
nan = struct.unpack('>e', bits[::-1])[0]

Objects/floatobject.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2054,10 +2054,7 @@ PyFloat_Pack2(double x, char *data, int le)
20542054
uint64_t v;
20552055

20562056
memcpy(&v, &x, sizeof(v));
2057-
bits = v & 0x1ffULL; /* NaN's payload */
2058-
if (v & 0x8000000000000ULL) { /* is a quiet NaN? */
2059-
bits += 0x200;
2060-
}
2057+
bits = ((v & 0xffc0000000000ULL)>>42); /* NaN's payload */
20612058
}
20622059
else {
20632060
sign = (x < 0.0);
@@ -2416,11 +2413,7 @@ PyFloat_Unpack2(const char *data, int le)
24162413
/* NaN */
24172414
uint64_t v = sign ? 0xfff0000000000000ULL : 0x7ff0000000000000ULL;
24182415

2419-
if (f & 0x200) { /* is a quiet NaN? */
2420-
v += 0x8000000000000ULL;
2421-
f -= 0x200;
2422-
}
2423-
v += f; /* add NaN's payload */
2416+
v += ((uint64_t)f << 42); /* add NaN's payload */
24242417
memcpy(&x, &v, sizeof(v));
24252418
return x;
24262419
}

0 commit comments

Comments
 (0)