1151497Sru// Copyright (C) 2009 Free Software Foundation, Inc.
2151497Sru//
3151497Sru// This file is part of the GNU ISO C++ Library.  This library is free
4151497Sru// software; you can redistribute it and/or modify it under the
5151497Sru// terms of the GNU General Public License as published by the
6151497Sru// Free Software Foundation; either version 3, or (at your option)
7151497Sru// any later version.
8151497Sru
9151497Sru// This library is distributed in the hope that it will be useful,
10151497Sru// but WITHOUT ANY WARRANTY; without even the implied warranty of
11151497Sru// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12151497Sru// GNU General Public License for more details.
13151497Sru
14151497Sru// You should have received a copy of the GNU General Public License along
15151497Sru// with this library; see the file COPYING3.  If not see
16151497Sru// <http://www.gnu.org/licenses/>.
17151497Sru
18151497Sru// { dg-require-effective-target dfp }
19151497Sru
20151497Sru// ISO/IEC TR 24733  3.2.6  Conversion to generic floating-point type.
21151497Sru
22151497Sru#include <decimal/decimal>
23151497Sru#include <testsuite_hooks.h>
24151497Sru
25151497Sruusing namespace std::decimal;
26151497Sru
27151497Sruvoid
28151497Sruconversion_to_generic_float_32 ()
29151497Sru{
30151497Sru  std::decimal::decimal32 d32(123);
31151497Sru  float f;
32151497Sru  double d;
33151497Sru  long double ld;
34151497Sru
35151497Sru  f = decimal32_to_float (d32);
36151497Sru  VERIFY (f == 123.F);
37151497Sru  d = decimal32_to_double (d32);
38151497Sru  VERIFY (d == 123.);
39151497Sru  ld = decimal32_to_long_double (d32);
40151497Sru  VERIFY (ld == 123.L);
41151497Sru
42151497Sru  d32++;
43151497Sru  f = decimal_to_float (d32);
44151497Sru  VERIFY (f == 124.F);
45151497Sru  d = decimal_to_double (d32);
46151497Sru  VERIFY (d == 124.);
47151497Sru  ld = decimal_to_long_double (d32);
48151497Sru  VERIFY (ld == 124.L);
49151497Sru}
50151497Sru
51151497Sruvoid
52151497Sruconversion_to_generic_float_64 ()
53151497Sru{
54151497Sru  std::decimal::decimal64 d64(234);
55151497Sru  float f;
56151497Sru  double d;
57151497Sru  long double ld;
58151497Sru
59151497Sru  f = decimal64_to_float (d64);
60151497Sru  VERIFY (f == 234.F);
61151497Sru  d = decimal64_to_double (d64);
62151497Sru  VERIFY (d == 234.);
63151497Sru  ld = decimal64_to_long_double (d64);
64151497Sru  VERIFY (ld == 234.L);
65151497Sru
66151497Sru  d64++;
67151497Sru  f = decimal_to_float (d64);
68151497Sru  VERIFY (f == 235.F);
69151497Sru  d = decimal_to_double (d64);
70151497Sru  VERIFY (d == 235.);
71151497Sru  ld = decimal_to_long_double (d64);
72151497Sru  VERIFY (ld == 235.L);
73151497Sru}
74151497Sru
75151497Sruvoid
76151497Sruconversion_to_generic_float_128 ()
77151497Sru{
78151497Sru  std::decimal::decimal128 d128(345);
79151497Sru  float f;
80151497Sru  double d;
81151497Sru  long double ld;
82151497Sru
83151497Sru  f = decimal128_to_float (d128);
84151497Sru  VERIFY (f == 345.F);
85151497Sru  d = decimal128_to_double (d128);
86151497Sru  VERIFY (d == 345.);
87151497Sru  ld = decimal128_to_long_double (d128);
88151497Sru  VERIFY (ld == 345.L);
89151497Sru
90151497Sru  d128++;
91151497Sru  f = decimal_to_float (d128);
92151497Sru  VERIFY (f == 346.F);
93151497Sru  d = decimal_to_double (d128);
94151497Sru  VERIFY (d == 346.);
95151497Sru  ld = decimal_to_long_double (d128);
96151497Sru  VERIFY (ld == 346.L);
97151497Sru}
98151497Sru
99151497Sruint
100151497Srumain ()
101151497Sru{
102151497Sru  conversion_to_generic_float_32 ();
103151497Sru  conversion_to_generic_float_64 ();
104151497Sru  conversion_to_generic_float_128 ();
105151497Sru}
106151497Sru