Skip to content

Commit 6fdf4a6

Browse files
committed
+1
1 parent a568c94 commit 6fdf4a6

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

Objects/floatobject.c

+15-5
Original file line numberDiff line numberDiff line change
@@ -2503,17 +2503,27 @@ PyFloat_Unpack4(const char *data, int le)
25032503

25042504
/* return sNaN double if x was sNaN float */
25052505
if (isnan(x)) {
2506+
double y = x; /* will make qNaN double */
25062507
uint32_t v;
2508+
uint64_t u64;
2509+
25072510
memcpy(&v, &x, 4);
2511+
memcpy(&u64, &y, 8);
25082512

25092513
if ((v & (1 << 22)) == 0) {
2510-
double y = x; /* will make qNaN double */
2511-
uint64_t u64;
2512-
memcpy(&u64, &y, 8);
25132514
u64 &= ~(1ULL << 51); /* make sNaN */
2514-
memcpy(&y, &u64, 8);
2515-
return y;
25162515
}
2516+
2517+
/* Workaround RISC-V, see PyFloat_Pack4() */
2518+
if (v & (1 << 31)) {
2519+
u64 |= (1ULL << 63); /* set sign */
2520+
}
2521+
/* add payload */
2522+
u64 -= (u64 & 0x7ffffffffffffULL);
2523+
u64 += ((v & 0x3fffffULL) << 29);
2524+
2525+
memcpy(&y, &u64, 8);
2526+
return y;
25172527
}
25182528

25192529
return x;

0 commit comments

Comments
 (0)