11#include <stdbool.h>
22#include <stdint.h>
3+ #include <math.h>
34
45typedef union F64_pun {
56 long double flt ;
@@ -91,6 +92,9 @@ static uint64_t f64_to_unsigned(F64_pun val) {
9192}
9293
9394uint64_t _dtoull_c (long double x ) {
95+ if (signbit (x )) {
96+ return 0 ;
97+ }
9498 F64_pun val ;
9599 val .flt = x ;
96100 /* overflow || signbit(x) || isinf(x) || isnan(x) */
@@ -102,6 +106,9 @@ uint64_t _dtoull_c(long double x) {
102106}
103107
104108uint32_t _dtoul_c (long double x ) {
109+ if (signbit (x )) {
110+ return 0 ;
111+ }
105112 F64_pun val ;
106113 val .flt = x ;
107114 /* overflow || signbit(x) || isinf(x) || isnan(x) */
@@ -114,11 +121,9 @@ uint32_t _dtoul_c(long double x) {
114121
115122int64_t _dtoll_c (long double x ) {
116123 F64_pun val ;
117- val .flt = x ;
118- // tests for signbit(x)
119- bool x_sign = (val .reg .BC >= 0x8000 );
120- // clears the signbit
121- val .reg .BC &= 0x7FFF ;
124+ bool x_sign = signbit (x );
125+ val .flt = fabsl (x );
126+
122127 /* overflow || isinf(x) || isnan(x) */
123128 if (val .reg .BC >= ((Float64_bias + Float64_i64_max_exp ) << Float64_exp_BC_shift )) {
124129 /* undefined return value for inf/NaN values of x */
@@ -131,11 +136,9 @@ int64_t _dtoll_c(long double x) {
131136
132137int32_t _dtol_c (long double x ) {
133138 F64_pun val ;
134- val .flt = x ;
135- // tests for signbit(x)
136- bool x_sign = (val .reg .BC >= 0x8000 );
137- // clears the signbit
138- val .reg .BC &= 0x7FFF ;
139+ bool x_sign = signbit (x );
140+ val .flt = fabsl (x );
141+
139142 /* overflow || isinf(x) || isnan(x) */
140143 if (val .reg .BC >= ((Float64_bias + Float64_i32_max_exp ) << Float64_exp_BC_shift )) {
141144 /* undefined return value for inf/NaN values of x */
0 commit comments