1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <complex> 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// test cases 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#ifndef CASES_H 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define CASES_H 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <complex> 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert> 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 20fb59f5ce4d3eab1d32a266254e6bf706d9589209Marshall Clowconst std::complex<double> testcases[] = 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>( 1.e-6, 1.e-6), 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1.e-6, 1.e-6), 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1.e-6, -1.e-6), 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>( 1.e-6, -1.e-6), 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>( 1.e+6, 1.e-6), 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1.e+6, 1.e-6), 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1.e+6, -1.e-6), 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>( 1.e+6, -1.e-6), 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>( 1.e-6, 1.e+6), 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1.e-6, 1.e+6), 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1.e-6, -1.e+6), 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>( 1.e-6, -1.e+6), 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>( 1.e+6, 1.e+6), 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1.e+6, 1.e+6), 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1.e+6, -1.e+6), 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>( 1.e+6, -1.e+6), 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(NAN, NAN), 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-INFINITY, NAN), 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-2, NAN), 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1, NAN), 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0.5, NAN), 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0., NAN), 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(+0., NAN), 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(0.5, NAN), 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(1, NAN), 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(2, NAN), 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(INFINITY, NAN), 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(NAN, -INFINITY), 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-INFINITY, -INFINITY), 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-2, -INFINITY), 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1, -INFINITY), 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0.5, -INFINITY), 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0., -INFINITY), 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(+0., -INFINITY), 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(0.5, -INFINITY), 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(1, -INFINITY), 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(2, -INFINITY), 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(INFINITY, -INFINITY), 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(NAN, -2), 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-INFINITY, -2), 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-2, -2), 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1, -2), 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0.5, -2), 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0., -2), 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(+0., -2), 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(0.5, -2), 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(1, -2), 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(2, -2), 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(INFINITY, -2), 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(NAN, -1), 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-INFINITY, -1), 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-2, -1), 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1, -1), 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0.5, -1), 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0., -1), 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(+0., -1), 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(0.5, -1), 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(1, -1), 87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(2, -1), 88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(INFINITY, -1), 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(NAN, -0.5), 91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-INFINITY, -0.5), 92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-2, -0.5), 93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1, -0.5), 94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0.5, -0.5), 95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0., -0.5), 96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(+0., -0.5), 97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(0.5, -0.5), 98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(1, -0.5), 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(2, -0.5), 100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(INFINITY, -0.5), 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(NAN, -0.), 103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-INFINITY, -0.), 104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-2, -0.), 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1, -0.), 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0.5, -0.), 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0., -0.), 108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(+0., -0.), 109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(0.5, -0.), 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(1, -0.), 111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(2, -0.), 112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(INFINITY, -0.), 113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(NAN, +0.), 115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-INFINITY, +0.), 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-2, +0.), 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1, +0.), 118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0.5, +0.), 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0., +0.), 120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(+0., +0.), 121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(0.5, +0.), 122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(1, +0.), 123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(2, +0.), 124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(INFINITY, +0.), 125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(NAN, 0.5), 127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-INFINITY, 0.5), 128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-2, 0.5), 129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1, 0.5), 130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0.5, 0.5), 131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0., 0.5), 132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(+0., 0.5), 133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(0.5, 0.5), 134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(1, 0.5), 135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(2, 0.5), 136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(INFINITY, 0.5), 137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(NAN, 1), 139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-INFINITY, 1), 140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-2, 1), 141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1, 1), 142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0.5, 1), 143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0., 1), 144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(+0., 1), 145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(0.5, 1), 146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(1, 1), 147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(2, 1), 148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(INFINITY, 1), 149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(NAN, 2), 151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-INFINITY, 2), 152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-2, 2), 153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1, 2), 154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0.5, 2), 155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0., 2), 156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(+0., 2), 157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(0.5, 2), 158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(1, 2), 159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(2, 2), 160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(INFINITY, 2), 161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(NAN, INFINITY), 163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-INFINITY, INFINITY), 164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-2, INFINITY), 165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-1, INFINITY), 166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0.5, INFINITY), 167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(-0., INFINITY), 168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(+0., INFINITY), 169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(0.5, INFINITY), 170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(1, INFINITY), 171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(2, INFINITY), 172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::complex<double>(INFINITY, INFINITY) 173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantenum {zero, non_zero, inf, NaN, non_zero_nan}; 176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class T> 178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint 179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclassify(const std::complex<T>& x) 180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (x == std::complex<T>()) 182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return zero; 183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (std::isinf(x.real()) || std::isinf(x.imag())) 184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return inf; 185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (std::isnan(x.real()) && std::isnan(x.imag())) 186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return NaN; 187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (std::isnan(x.real())) 188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (x.imag() == T(0)) 190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return NaN; 191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return non_zero_nan; 192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (std::isnan(x.imag())) 194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (x.real() == T(0)) 196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return NaN; 197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return non_zero_nan; 198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return non_zero; 200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline 203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint 204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclassify(double x) 205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (x == 0) 207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return zero; 208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (std::isinf(x)) 209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return inf; 210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (std::isnan(x)) 211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return NaN; 212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant return non_zero; 213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid is_about(float x, float y) 216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::abs((x-y)/(x+y)) < 1.e-6); 218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid is_about(double x, double y) 221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::abs((x-y)/(x+y)) < 1.e-14); 223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid is_about(long double x, long double y) 226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::abs((x-y)/(x+y)) < 1.e-14); 228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 2300e20cae1a5be18fba591cd884aa2a389b66a3f49Howard Hinnant#endif // CASES_H 231