/* { dg-options "-O0" } */ /* N1150 5.2 Conversions among decimal floating types and between decimal floating types and generic floating types. C99 6.3.1.5(3) New. Test various conversions involving decimal floating types. */ #ifndef __STDC_WANT_DEC_FP__ #define __STDC_WANT_DEC_FP__ 1 #endif #include "dfp-dbg.h" #include volatile _Decimal32 d32; volatile _Decimal64 d64; volatile _Decimal128 d128; int main () { /* Conversions to larger types. */ d32 = 123.4df; d64 = d32; if (d64 != 123.4dd) FAILURE d128 = d32; if (d128 != 123.4dl) FAILURE d64 = 345.678dd; d128 = d64; if (d128 != 345.678dl) FAILURE /* Conversions to smaller types for which the value fits. */ d64 = 3456.789dd; d32 = d64; if (d32 != 3456.789df) FAILURE d128 = 123.4567dl; d32 = d128; if (d32 != 123.4567df) FAILURE d128 = 1234567890.123456dl; d64 = d128; if (d64 != 1234567890.123456dd) FAILURE /* Test demotion to non-representable decimal floating type. */ /* Assumes a default rounding mode of 'near'. This uses the rules describe in the 27 July 2005 draft of IEEE 754r, which are much more clear that what's described in draft 5 of N1107. */ /* Rounds to what _Decimal32 can handle. */ d64 = 9.99999949E96DD; d32 = d64; if (d32 != DEC32_MAX) FAILURE /* Rounds to more than _Decimal32 can handle. */ d64 = 9.9999995E96DD; d32 = d64; if (d32 != __builtin_infd32()) FAILURE /* Rounds to what _Decimal32 can handle. */ d128 = 9.99999949E96DD; d32 = d128; if (d32 != DEC32_MAX) FAILURE /* Rounds to more than _Decimal32 can handle. */ d128= 9.9999995E96DD; d32 = d128; if (d32 != __builtin_infd32()) FAILURE /* Rounds to what _Decimal64 can handle. */ d128 = 9.99999999999999949E384DL; d64 = d128; if (d64 != DEC64_MAX) FAILURE /* Rounds to more than _Decimal64 can handle. */ d128 = 9.9999999999999995E384DL; d64 = d128; if (d64 != __builtin_infd64()) FAILURE FINISH }