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