brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.8 KiB · b360e14 Raw
262 lines · c
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <complex>10 11// test cases12 13#ifndef CASES_H14#define CASES_H15 16#include <cassert>17#include <complex>18#include <type_traits>19 20#include "test_macros.h"21 22TEST_CONSTEXPR_CXX20 const std::complex<double> testcases[] =23{24    std::complex<double>( 1.e-6,  1.e-6),25    std::complex<double>(-1.e-6,  1.e-6),26    std::complex<double>(-1.e-6, -1.e-6),27    std::complex<double>( 1.e-6, -1.e-6),28 29    std::complex<double>( 1.e+6,  1.e-6),30    std::complex<double>(-1.e+6,  1.e-6),31    std::complex<double>(-1.e+6, -1.e-6),32    std::complex<double>( 1.e+6, -1.e-6),33 34    std::complex<double>( 1.e-6,  1.e+6),35    std::complex<double>(-1.e-6,  1.e+6),36    std::complex<double>(-1.e-6, -1.e+6),37    std::complex<double>( 1.e-6, -1.e+6),38 39    std::complex<double>( 1.e+6,  1.e+6),40    std::complex<double>(-1.e+6,  1.e+6),41    std::complex<double>(-1.e+6, -1.e+6),42    std::complex<double>( 1.e+6, -1.e+6),43 44    std::complex<double>(-0, -1.e-6),45    std::complex<double>(-0,  1.e-6),46    std::complex<double>(-0,  1.e+6),47    std::complex<double>(-0, -1.e+6),48    std::complex<double>( 0, -1.e-6),49    std::complex<double>( 0,  1.e-6),50    std::complex<double>( 0,  1.e+6),51    std::complex<double>( 0, -1.e+6),52 53    std::complex<double>(-1.e-6, -0),54    std::complex<double>( 1.e-6, -0),55    std::complex<double>( 1.e+6, -0),56    std::complex<double>(-1.e+6, -0),57    std::complex<double>(-1.e-6,  0),58    std::complex<double>( 1.e-6,  0),59    std::complex<double>( 1.e+6,  0),60    std::complex<double>(-1.e+6,  0),61 62    std::complex<double>(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN()),63    std::complex<double>(-std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN()),64    std::complex<double>(-2, std::numeric_limits<double>::quiet_NaN()),65    std::complex<double>(-1, std::numeric_limits<double>::quiet_NaN()),66    std::complex<double>(-0.5, std::numeric_limits<double>::quiet_NaN()),67    std::complex<double>(-0., std::numeric_limits<double>::quiet_NaN()),68    std::complex<double>(+0., std::numeric_limits<double>::quiet_NaN()),69    std::complex<double>(0.5, std::numeric_limits<double>::quiet_NaN()),70    std::complex<double>(1, std::numeric_limits<double>::quiet_NaN()),71    std::complex<double>(2, std::numeric_limits<double>::quiet_NaN()),72    std::complex<double>(std::numeric_limits<double>::infinity(), std::numeric_limits<double>::quiet_NaN()),73 74    std::complex<double>(std::numeric_limits<double>::quiet_NaN(), -std::numeric_limits<double>::infinity()),75    std::complex<double>(-std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity()),76    std::complex<double>(-2, -std::numeric_limits<double>::infinity()),77    std::complex<double>(-1, -std::numeric_limits<double>::infinity()),78    std::complex<double>(-0.5, -std::numeric_limits<double>::infinity()),79    std::complex<double>(-0., -std::numeric_limits<double>::infinity()),80    std::complex<double>(+0., -std::numeric_limits<double>::infinity()),81    std::complex<double>(0.5, -std::numeric_limits<double>::infinity()),82    std::complex<double>(1, -std::numeric_limits<double>::infinity()),83    std::complex<double>(2, -std::numeric_limits<double>::infinity()),84    std::complex<double>(std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity()),85 86    std::complex<double>(std::numeric_limits<double>::quiet_NaN(), -2),87    std::complex<double>(-std::numeric_limits<double>::infinity(), -2),88    std::complex<double>(-2, -2),89    std::complex<double>(-1, -2),90    std::complex<double>(-0.5, -2),91    std::complex<double>(-0., -2),92    std::complex<double>(+0., -2),93    std::complex<double>(0.5, -2),94    std::complex<double>(1, -2),95    std::complex<double>(2, -2),96    std::complex<double>(std::numeric_limits<double>::infinity(), -2),97 98    std::complex<double>(std::numeric_limits<double>::quiet_NaN(), -1),99    std::complex<double>(-std::numeric_limits<double>::infinity(), -1),100    std::complex<double>(-2, -1),101    std::complex<double>(-1, -1),102    std::complex<double>(-0.5, -1),103    std::complex<double>(-0., -1),104    std::complex<double>(+0., -1),105    std::complex<double>(0.5, -1),106    std::complex<double>(1, -1),107    std::complex<double>(2, -1),108    std::complex<double>(std::numeric_limits<double>::infinity(), -1),109 110    std::complex<double>(std::numeric_limits<double>::quiet_NaN(), -0.5),111    std::complex<double>(-std::numeric_limits<double>::infinity(), -0.5),112    std::complex<double>(-2, -0.5),113    std::complex<double>(-1, -0.5),114    std::complex<double>(-0.5, -0.5),115    std::complex<double>(-0., -0.5),116    std::complex<double>(+0., -0.5),117    std::complex<double>(0.5, -0.5),118    std::complex<double>(1, -0.5),119    std::complex<double>(2, -0.5),120    std::complex<double>(std::numeric_limits<double>::infinity(), -0.5),121 122    std::complex<double>(std::numeric_limits<double>::quiet_NaN(), -0.),123    std::complex<double>(-std::numeric_limits<double>::infinity(), -0.),124    std::complex<double>(-2, -0.),125    std::complex<double>(-1, -0.),126    std::complex<double>(-0.5, -0.),127    std::complex<double>(-0., -0.),128    std::complex<double>(+0., -0.),129    std::complex<double>(0.5, -0.),130    std::complex<double>(1, -0.),131    std::complex<double>(2, -0.),132    std::complex<double>(std::numeric_limits<double>::infinity(), -0.),133 134    std::complex<double>(std::numeric_limits<double>::quiet_NaN(), +0.),135    std::complex<double>(-std::numeric_limits<double>::infinity(), +0.),136    std::complex<double>(-2, +0.),137    std::complex<double>(-1, +0.),138    std::complex<double>(-0.5, +0.),139    std::complex<double>(-0., +0.),140    std::complex<double>(+0., +0.),141    std::complex<double>(0.5, +0.),142    std::complex<double>(1, +0.),143    std::complex<double>(2, +0.),144    std::complex<double>(std::numeric_limits<double>::infinity(), +0.),145 146    std::complex<double>(std::numeric_limits<double>::quiet_NaN(), 0.5),147    std::complex<double>(-std::numeric_limits<double>::infinity(), 0.5),148    std::complex<double>(-2, 0.5),149    std::complex<double>(-1, 0.5),150    std::complex<double>(-0.5, 0.5),151    std::complex<double>(-0., 0.5),152    std::complex<double>(+0., 0.5),153    std::complex<double>(0.5, 0.5),154    std::complex<double>(1, 0.5),155    std::complex<double>(2, 0.5),156    std::complex<double>(std::numeric_limits<double>::infinity(), 0.5),157 158    std::complex<double>(std::numeric_limits<double>::quiet_NaN(), 1),159    std::complex<double>(-std::numeric_limits<double>::infinity(), 1),160    std::complex<double>(-2, 1),161    std::complex<double>(-1, 1),162    std::complex<double>(-0.5, 1),163    std::complex<double>(-0., 1),164    std::complex<double>(+0., 1),165    std::complex<double>(0.5, 1),166    std::complex<double>(1, 1),167    std::complex<double>(2, 1),168    std::complex<double>(std::numeric_limits<double>::infinity(), 1),169 170    std::complex<double>(std::numeric_limits<double>::quiet_NaN(), 2),171    std::complex<double>(-std::numeric_limits<double>::infinity(), 2),172    std::complex<double>(-2, 2),173    std::complex<double>(-1, 2),174    std::complex<double>(-0.5, 2),175    std::complex<double>(-0., 2),176    std::complex<double>(+0., 2),177    std::complex<double>(0.5, 2),178    std::complex<double>(1, 2),179    std::complex<double>(2, 2),180    std::complex<double>(std::numeric_limits<double>::infinity(), 2),181 182    std::complex<double>(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::infinity()),183    std::complex<double>(-std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity()),184    std::complex<double>(-2, std::numeric_limits<double>::infinity()),185    std::complex<double>(-1, std::numeric_limits<double>::infinity()),186    std::complex<double>(-0.5, std::numeric_limits<double>::infinity()),187    std::complex<double>(-0., std::numeric_limits<double>::infinity()),188    std::complex<double>(+0., std::numeric_limits<double>::infinity()),189    std::complex<double>(0.5, std::numeric_limits<double>::infinity()),190    std::complex<double>(1, std::numeric_limits<double>::infinity()),191    std::complex<double>(2, std::numeric_limits<double>::infinity()),192    std::complex<double>(std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity())193};194 195enum {zero, non_zero, inf, NaN, non_zero_nan};196 197template <class T, typename std::enable_if<std::is_floating_point<T>::value, int>::type = 0>198TEST_CONSTEXPR_CXX20 bool test_isinf(T v) {199    return v == std::numeric_limits<T>::infinity() || v == -std::numeric_limits<T>::infinity();200}201 202template <class T, typename std::enable_if<std::is_arithmetic<T>::value, int>::type = 0>203TEST_CONSTEXPR_CXX20 bool test_isnan(T v) {204    return v != v;205}206 207template <class T>208TEST_CONSTEXPR_CXX20209int210classify(const std::complex<T>& x)211{212    if (x == std::complex<T>())213        return zero;214    if (test_isinf(x.real()) || test_isinf(x.imag()))215        return inf;216    if (test_isnan(x.real()) && test_isnan(x.imag()))217        return NaN;218    if (test_isnan(x.real()))219    {220        if (x.imag() == T(0))221            return NaN;222        return non_zero_nan;223    }224    if (test_isnan(x.imag()))225    {226        if (x.real() == T(0))227            return NaN;228        return non_zero_nan;229    }230    return non_zero;231}232 233inline234int235classify(double x)236{237    if (x == 0)238        return zero;239    if (std::isinf(x))240        return inf;241    if (std::isnan(x))242        return NaN;243    return non_zero;244}245 246void is_about(float x, float y)247{248    assert(std::abs((x-y)/(x+y)) < 1.e-6);249}250 251void is_about(double x, double y)252{253    assert(std::abs((x-y)/(x+y)) < 1.e-14);254}255 256void is_about(long double x, long double y)257{258    assert(std::abs((x-y)/(x+y)) < 1.e-14);259}260 261#endif // CASES_H262