@@ -2406,7 +2406,7 @@ T frexp(T)(const T value, out int exp) @trusted pure nothrow @nogc
2406
2406
vf *= F.RECIP_EPSILON ;
2407
2407
ex = vu[F.EXPPOS_SHORT ] & F.EXPMASK ;
2408
2408
exp = ex - F.EXPBIAS - T.mant_dig + 1 ;
2409
- vu[F.EXPPOS_SHORT ] = (0x8000 & vu[F.EXPPOS_SHORT ]) | 0x3FFE ;
2409
+ vu[F.EXPPOS_SHORT ] = (~ F. EXPMASK & vu[F.EXPPOS_SHORT ]) | 0x3FFE ;
2410
2410
}
2411
2411
return vf;
2412
2412
}
@@ -2449,7 +2449,7 @@ T frexp(T)(const T value, out int exp) @trusted pure nothrow @nogc
2449
2449
ex = vu[F.EXPPOS_SHORT ] & F.EXPMASK ;
2450
2450
exp = ex - F.EXPBIAS - T.mant_dig + 1 ;
2451
2451
vu[F.EXPPOS_SHORT ] =
2452
- cast (ushort )((0x8000 & vu[F.EXPPOS_SHORT ]) | 0x3FFE );
2452
+ cast (ushort )((~ F. EXPMASK & vu[F.EXPPOS_SHORT ]) | 0x3FFE );
2453
2453
}
2454
2454
return vf;
2455
2455
}
@@ -2489,7 +2489,7 @@ T frexp(T)(const T value, out int exp) @trusted pure nothrow @nogc
2489
2489
ex = vu[F.EXPPOS_SHORT ] & F.EXPMASK ;
2490
2490
exp = ((ex - F.EXPBIAS ) >> 4 ) - T.mant_dig + 1 ;
2491
2491
vu[F.EXPPOS_SHORT ] =
2492
- cast (ushort )((0x8000 & vu[F.EXPPOS_SHORT ]) | 0x3FE0 );
2492
+ cast (ushort )((~ F. EXPMASK & vu[F.EXPPOS_SHORT ]) | 0x3FE0 );
2493
2493
}
2494
2494
return vf;
2495
2495
}
@@ -2529,7 +2529,7 @@ T frexp(T)(const T value, out int exp) @trusted pure nothrow @nogc
2529
2529
ex = vu[F.EXPPOS_SHORT ] & F.EXPMASK ;
2530
2530
exp = ((ex - F.EXPBIAS ) >> 7 ) - T.mant_dig + 1 ;
2531
2531
vu[F.EXPPOS_SHORT ] =
2532
- cast (ushort )((0x8000 & vu[F.EXPPOS_SHORT ]) | 0x3F00 );
2532
+ cast (ushort )((~ F. EXPMASK & vu[F.EXPPOS_SHORT ]) | 0x3F00 );
2533
2533
}
2534
2534
return vf;
2535
2535
}
@@ -2574,6 +2574,9 @@ unittest
2574
2574
tuple(- T.infinity, - T.infinity, int .min),
2575
2575
tuple(T.nan, T.nan, int .min),
2576
2576
tuple(- T.nan, - T.nan, int .min),
2577
+
2578
+ // Phobos issue #16026:
2579
+ tuple(3 * (T.min_normal * T.epsilon), T( .75 ), (T.min_exp - T.mant_dig) + 2 )
2577
2580
];
2578
2581
2579
2582
foreach (elem; vals)
@@ -2591,10 +2594,10 @@ unittest
2591
2594
static if (floatTraits! (T).realFormat == RealFormat.ieeeExtended)
2592
2595
{
2593
2596
static T[3 ][] extendedvals = [ // x,frexp,exp
2594
- [0x1 .a5f1c2eb3fe4efp+ 73L , 0x1 .A5F1C2EB3FE4EFp- 1L , 74 ], // normal
2595
- [0x1 .fa01712e8f0471ap- 1064L , 0x1 .fa01712e8f0471ap- 1L , - 1063 ],
2596
- [T.min_normal, . 5 , - 16381 ],
2597
- [T.min_normal/ 2.0L , .5 , - 16382 ] // subnormal
2597
+ [0x1 .a5f1c2eb3fe4efp+ 73L , 0x1 .A5F1C2EB3FE4EFp- 1L , 74 ], // normal
2598
+ [0x1 .fa01712e8f0471ap- 1064L , 0x1 .fa01712e8f0471ap- 1L , - 1063 ],
2599
+ [T.min_normal, . 5 , - 16381 ],
2600
+ [T.min_normal/ 2.0L , .5 , - 16382 ] // subnormal
2598
2601
];
2599
2602
foreach (elem; extendedvals)
2600
2603
{
0 commit comments