1// Copyright (C) 2009 Free Software Foundation, Inc. 2// 3// This file is part of the GNU ISO C++ Library. This library is free 4// software; you can redistribute it and/or modify it under the 5// terms of the GNU General Public License as published by the 6// Free Software Foundation; either version 3, or (at your option) 7// any later version. 8 9// This library is distributed in the hope that it will be useful, 10// but WITHOUT ANY WARRANTY; without even the implied warranty of 11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12// GNU General Public License for more details. 13 14// You should have received a copy of the GNU General Public License along 15// with this library; see the file COPYING3. If not see 16// <http://www.gnu.org/licenses/>. 17 18// { dg-require-effective-target dfp } 19 20// ISO/IEC TR 24733 3.2.8 Binary arithmetic operators. 21 22#include <decimal/decimal> 23#include <testsuite_hooks.h> 24 25using namespace std::decimal; 26 27decimal32 d32 (5); 28decimal64 d64 (-10); 29decimal128 d128 (25); 30int si = -20; 31unsigned int ui = 50; 32long sl = -10; 33unsigned long ul = 20; 34long long sll = -25; 35unsigned long long ull = 50; 36 37void 38binary_add_32 (void) 39{ 40 decimal32 a (1000), b; 41 42 b = si + a; VERIFY (b == 980); 43 b = ui + a; VERIFY (b == 1050); 44 b = sl + a; VERIFY (b == 990); 45 b = ul + a; VERIFY (b == 1020); 46 b = sll + a; VERIFY (b == 975); 47 b = ull + a; VERIFY (b == 1050); 48 b = d32 + a; VERIFY (b == 1005); 49 b = (decimal32)(d64 + a); VERIFY (b == 990); 50 b = (decimal32)(d128 + a); VERIFY (b == 1025); 51 52 b = a + si; VERIFY (b == 980); 53 b = a + ui; VERIFY (b == 1050); 54 b = a + sl; VERIFY (b == 990); 55 b = a + ul; VERIFY (b == 1020); 56 b = a + sll; VERIFY (b == 975); 57 b = a + ull; VERIFY (b == 1050); 58 b = a + d32; VERIFY (b == 1005); 59 b = (decimal32)(a + d64); VERIFY (b == 990); 60 b = (decimal32)(a + d128); VERIFY (b == 1025); 61} 62 63void 64binary_subtract_32 (void) 65{ 66 decimal32 a (1000), b; 67 68 b = a - si; VERIFY (b == 1020); 69 b = a - ui; VERIFY (b == 950); 70 b = a - sl; VERIFY (b == 1010); 71 b = a - ul; VERIFY (b == 980); 72 b = a - sll; VERIFY (b == 1025); 73 b = a - ull; VERIFY (b == 950); 74 b = a - d32; VERIFY (b == 995); 75 b = (decimal32)(a - d64); VERIFY (b == 1010); 76 b = (decimal32)(a - d128); VERIFY (b == 975); 77 78 a = -1000; 79 b = si - a; VERIFY (b == 980); 80 b = ui - a; VERIFY (b == 1050); 81 b = sl - a; VERIFY (b == 990); 82 b = ul - a; VERIFY (b == 1020); 83 b = sll - a; VERIFY (b == 975); 84 b = ull - a; VERIFY (b == 1050); 85 b = d32 - a; VERIFY (b == 1005); 86 b = (decimal32)(d64 - a); VERIFY (b == 990); 87 b = (decimal32)(d128 - a); VERIFY (b == 1025); 88} 89 90void 91binary_multiply_32 (void) 92{ 93 decimal32 a (1000), b; 94 95 b = a * si; VERIFY (b == -20000); 96 b = a * ui; VERIFY (b == 50000); 97 b = a * sl; VERIFY (b == -10000); 98 b = a * ul; VERIFY (b == 20000); 99 b = a * sll; VERIFY (b == -25000); 100 b = a * ull; VERIFY (b == 50000); 101 b = a * d32; VERIFY (b == 5000); 102 b = (decimal32)(a * d64); VERIFY (b == -10000); 103 b = (decimal32)(a * d128); VERIFY (b == 25000); 104 105 b = si * a; VERIFY (b == -20000); 106 b = ui * a; VERIFY (b == 50000); 107 b = sl * a; VERIFY (b == -10000); 108 b = ul * a; VERIFY (b == 20000); 109 b = sll * a; VERIFY (b == -25000); 110 b = ull * a; VERIFY (b == 50000); 111 b = d32 * a; VERIFY (b == 5000); 112 b = (decimal32)(d64 * a); VERIFY (b == -10000); 113 b = (decimal32)(d128 * a); VERIFY (b == 25000); 114} 115 116void 117binary_divide_32 (void) 118{ 119 decimal32 a (1000), b; 120 121 b = a / si; VERIFY (b == -50); 122 b = a / ui; VERIFY (b == 20); 123 b = a / sl; VERIFY (b == -100); 124 b = a / ul; VERIFY (b == 50); 125 b = a / sll; VERIFY (b == -40); 126 b = a / ull; VERIFY (b == 20); 127 b = a / d32; VERIFY (b == 200); 128 b = (decimal32)(a / d64); VERIFY (b == -100); 129 b = (decimal32)(a / d128); VERIFY (b == 40); 130 131 a = 5; 132 b = si / a; VERIFY (b == -4); 133 b = ui / a; VERIFY (b == 10); 134 b = sl / a; VERIFY (b == -2); 135 b = ul / a; VERIFY (b == 4); 136 b = sll / a; VERIFY (b == -5); 137 b = ull / a; VERIFY (b == 10); 138 b = d32 / a; VERIFY (b == 1); 139 b = (decimal32)(d64 / a); VERIFY (b == -2); 140 b = (decimal32)(d128 / a); VERIFY (b == 5); 141} 142 143void 144binary_add_64 (void) 145{ 146 decimal64 a (1000), b; 147 148 b = a + si; VERIFY (b == 980); 149 b = a + ui; VERIFY (b == 1050); 150 b = a + sl; VERIFY (b == 990); 151 b = a + ul; VERIFY (b == 1020); 152 b = a + sll; VERIFY (b == 975); 153 b = a + ull; VERIFY (b == 1050); 154 b = a + d32; VERIFY (b == 1005); 155 b = a + d64; VERIFY (b == 990); 156 b = (decimal64)(a + d128); VERIFY (b == 1025); 157 158 b = a + si; VERIFY (b == 980); 159 b = a + ui; VERIFY (b == 1050); 160 b = a + sl; VERIFY (b == 990); 161 b = a + ul; VERIFY (b == 1020); 162 b = a + sll; VERIFY (b == 975); 163 b = a + ull; VERIFY (b == 1050); 164 b = a + d32; VERIFY (b == 1005); 165 b = a + d64; VERIFY (b == 990); 166 b = (decimal64)(a + d128); VERIFY (b == 1025); 167} 168 169void 170binary_subtract_64 (void) 171{ 172 decimal64 a (1000), b; 173 174 b = a - si; VERIFY (b == 1020); 175 b = a - ui; VERIFY (b == 950); 176 b = a - sl; VERIFY (b == 1010); 177 b = a - ul; VERIFY (b == 980); 178 b = a - sll; VERIFY (b == 1025); 179 b = a - ull; VERIFY (b == 950); 180 b = a - d32; VERIFY (b == 995); 181 b = a - d64; VERIFY (b == 1010); 182 b = (decimal64)(a - d128); VERIFY (b == 975); 183 184 a = -1000; 185 b = si - a; VERIFY (b == 980); 186 b = ui - a; VERIFY (b == 1050); 187 b = sl - a; VERIFY (b == 990); 188 b = ul - a; VERIFY (b == 1020); 189 b = sll - a; VERIFY (b == 975); 190 b = ull - a; VERIFY (b == 1050); 191 b = d32 - a; VERIFY (b == 1005); 192 b = d64 - a; VERIFY (b == 990); 193 b = (decimal64)(d128 - a); VERIFY (b == 1025); 194} 195 196void 197binary_multiply_64 (void) 198{ 199 decimal64 a (1000), b; 200 201 b = a * si; VERIFY (b == -20000); 202 b = a * ui; VERIFY (b == 50000); 203 b = a * sl; VERIFY (b == -10000); 204 b = a * ul; VERIFY (b == 20000); 205 b = a * sll; VERIFY (b == -25000); 206 b = a * ull; VERIFY (b == 50000); 207 b = a * d32; VERIFY (b == 5000); 208 b = a * d64; VERIFY (b == -10000); 209 b = (decimal64)(a * d128); VERIFY (b == 25000); 210 211 b = si * a; VERIFY (b == -20000); 212 b = ui * a; VERIFY (b == 50000); 213 b = sl * a; VERIFY (b == -10000); 214 b = ul * a; VERIFY (b == 20000); 215 b = sll * a; VERIFY (b == -25000); 216 b = ull * a; VERIFY (b == 50000); 217 b = d32 * a; VERIFY (b == 5000); 218 b = d64 * a; VERIFY (b == -10000); 219 b = (decimal64)(d128 * a); VERIFY (b == 25000); 220} 221 222void 223binary_divide_64 (void) 224{ 225 decimal64 a (1000), b; 226 227 b = a / si; VERIFY (b == -50); 228 b = a / ui; VERIFY (b == 20); 229 b = a / sl; VERIFY (b == -100); 230 b = a / ul; VERIFY (b == 50); 231 b = a / sll; VERIFY (b == -40); 232 b = a / ull; VERIFY (b == 20); 233 b = a / d32; VERIFY (b == 200); 234 b = a / d64; VERIFY (b == -100); 235 b = (decimal64)(a / d128); VERIFY (b == 40); 236 237 a = 5; 238 b = si / a; VERIFY (b == -4); 239 b = ui / a; VERIFY (b == 10); 240 b = sl / a; VERIFY (b == -2); 241 b = ul / a; VERIFY (b == 4); 242 b = sll / a; VERIFY (b == -5); 243 b = ull / a; VERIFY (b == 10); 244 b = d32 / a; VERIFY (b == 1); 245 b = d64 / a; VERIFY (b == -2); 246 b = (decimal64)(d128 / a); VERIFY (b == 5); 247} 248 249void 250binary_add_128 (void) 251{ 252 decimal128 a (1000), b; 253 254 b = a + si; VERIFY (b == 980); 255 b = a + ui; VERIFY (b == 1050); 256 b = a + sl; VERIFY (b == 990); 257 b = a + ul; VERIFY (b == 1020); 258 b = a + sll; VERIFY (b == 975); 259 b = a + ull; VERIFY (b == 1050); 260 b = a + d32; VERIFY (b == 1005); 261 b = a + d64; VERIFY (b == 990); 262 b = a + d128; VERIFY (b == 1025); 263 264 b = a + si; VERIFY (b == 980); 265 b = a + ui; VERIFY (b == 1050); 266 b = a + sl; VERIFY (b == 990); 267 b = a + ul; VERIFY (b == 1020); 268 b = a + sll; VERIFY (b == 975); 269 b = a + ull; VERIFY (b == 1050); 270 b = a + d32; VERIFY (b == 1005); 271 b = a + d64; VERIFY (b == 990); 272 b = a + d128; VERIFY (b == 1025); 273} 274 275void 276binary_subtract_128 (void) 277{ 278 decimal128 a (1000), b; 279 280 b = a - si; VERIFY (b == 1020); 281 b = a - ui; VERIFY (b == 950); 282 b = a - sl; VERIFY (b == 1010); 283 b = a - ul; VERIFY (b == 980); 284 b = a - sll; VERIFY (b == 1025); 285 b = a - ull; VERIFY (b == 950); 286 b = a - d32; VERIFY (b == 995); 287 b = a - d64; VERIFY (b == 1010); 288 b = a - d128; VERIFY (b == 975); 289 290 a = -1000; 291 b = si - a; VERIFY (b == 980); 292 b = ui - a; VERIFY (b == 1050); 293 b = sl - a; VERIFY (b == 990); 294 b = ul - a; VERIFY (b == 1020); 295 b = sll - a; VERIFY (b == 975); 296 b = ull - a; VERIFY (b == 1050); 297 b = d32 - a; VERIFY (b == 1005); 298 b = d64 - a; VERIFY (b == 990); 299 b = d128 - a; VERIFY (b == 1025); 300} 301 302void 303binary_multiply_128 (void) 304{ 305 decimal128 a (1000), b; 306 307 b = a * si; VERIFY (b == -20000); 308 b = a * ui; VERIFY (b == 50000); 309 b = a * sl; VERIFY (b == -10000); 310 b = a * ul; VERIFY (b == 20000); 311 b = a * sll; VERIFY (b == -25000); 312 b = a * ull; VERIFY (b == 50000); 313 b = a * d32; VERIFY (b == 5000); 314 b = a * d64; VERIFY (b == -10000); 315 b = a * d128; VERIFY (b == 25000); 316 317 b = si * a; VERIFY (b == -20000); 318 b = ui * a; VERIFY (b == 50000); 319 b = sl * a; VERIFY (b == -10000); 320 b = ul * a; VERIFY (b == 20000); 321 b = sll * a; VERIFY (b == -25000); 322 b = ull * a; VERIFY (b == 50000); 323 b = d32 * a; VERIFY (b == 5000); 324 b = d64 * a; VERIFY (b == -10000); 325 b = d128 * a; VERIFY (b == 25000); 326} 327 328void 329binary_divide_128 (void) 330{ 331 decimal128 a (1000), b; 332 333 b = a / si; VERIFY (b == -50); 334 b = a / ui; VERIFY (b == 20); 335 b = a / sl; VERIFY (b == -100); 336 b = a / ul; VERIFY (b == 50); 337 b = a / sll; VERIFY (b == -40); 338 b = a / ull; VERIFY (b == 20); 339 b = a / d32; VERIFY (b == 200); 340 b = a / d64; VERIFY (b == -100); 341 b = a / d128; VERIFY (b == 40); 342 343 a = 5; 344 b = si / a; VERIFY (b == -4); 345 b = ui / a; VERIFY (b == 10); 346 b = sl / a; VERIFY (b == -2); 347 b = ul / a; VERIFY (b == 4); 348 b = sll / a; VERIFY (b == -5); 349 b = ull / a; VERIFY (b == 10); 350 b = d32 / a; VERIFY (b == 1); 351 b = d64 / a; VERIFY (b == -2); 352 b = d128 / a; VERIFY (b == 5); 353} 354 355int 356main () 357{ 358 binary_add_32 (); 359 binary_subtract_32 (); 360 binary_multiply_32 (); 361 binary_divide_32 (); 362 363 binary_add_64 (); 364 binary_subtract_64 (); 365 binary_multiply_64 (); 366 binary_divide_64 (); 367 368 binary_add_128 (); 369 binary_subtract_128 (); 370 binary_multiply_128 (); 371 binary_divide_128 (); 372} 373