t_infinity.c revision 1.4
1/* $NetBSD: t_infinity.c,v 1.4 2011/07/07 11:04:30 jruoho Exp $ */ 2 3/*- 4 * Copyright (c) 2002, 2008 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Martin Husemann <martin@NetBSD.org>. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31#include <sys/cdefs.h> 32__RCSID("$NetBSD: t_infinity.c,v 1.4 2011/07/07 11:04:30 jruoho Exp $"); 33 34#include <sys/utsname.h> 35 36#include <atf-c.h> 37#include <math.h> 38#include <float.h> 39#include <stdlib.h> 40#include <string.h> 41 42ATF_TC(infinity_float); 43ATF_TC_HEAD(infinity_float, tc) 44{ 45 atf_tc_set_md_var(tc, "descr", 46 "check FPU generated infinite float values"); 47} 48 49ATF_TC_BODY(infinity_float, tc) 50{ 51 float v; 52 53 v = FLT_MAX; 54 v *= v; 55 ATF_REQUIRE(isinf(v)); 56 ATF_REQUIRE(fpclassify(v) == FP_INFINITE); 57 58 v = -FLT_MAX; 59 v *= v; 60 ATF_REQUIRE(isinf(v)); 61 ATF_REQUIRE(fpclassify(v) == FP_INFINITE); 62} 63 64ATF_TC(infinity_double); 65ATF_TC_HEAD(infinity_double, tc) 66{ 67 atf_tc_set_md_var(tc, "descr", 68 "check FPU generated infinite double values"); 69} 70 71ATF_TC_BODY(infinity_double, tc) 72{ 73 double v; 74 75 v = DBL_MAX; 76 v *= v; 77 ATF_REQUIRE(isinf(v)); 78 ATF_REQUIRE(fpclassify(v) == FP_INFINITE); 79 80 v = -DBL_MAX; 81 v *= v; 82 ATF_REQUIRE(isinf(v)); 83 ATF_REQUIRE(fpclassify(v) == FP_INFINITE); 84} 85 86ATF_TC(infinity_long_double); 87ATF_TC_HEAD(infinity_long_double, tc) 88{ 89 atf_tc_set_md_var(tc, "descr", 90 "check FPU generated infinite long double values"); 91} 92 93ATF_TC_BODY(infinity_long_double, tc) 94{ 95 struct utsname utsname; 96 97 /* 98 * May fail under QEMU; cf. PR misc/44767. 99 */ 100 ATF_REQUIRE(uname(&utsname) == 0); 101 102 if (strcmp(utsname.machine, "amd64") == 0 && 103 system("cpuctl identify 0 | grep -q QEMU") == 0) 104 atf_tc_expect_fail("PR misc/44767"); 105 106#ifndef LDBL_MAX 107 atf_tc_skip("no long double support on this architecture"); 108 return; 109#else 110 long double v; 111 112 v = LDBL_MAX; 113 v *= v; 114 ATF_REQUIRE(isinf(v)); 115 ATF_REQUIRE(fpclassify(v) == FP_INFINITE); 116 117 v = -LDBL_MAX; 118 v *= v; 119 ATF_REQUIRE(isinf(v)); 120 ATF_REQUIRE(fpclassify(v) == FP_INFINITE); 121#endif 122} 123 124ATF_TP_ADD_TCS(tp) 125{ 126 127 ATF_TP_ADD_TC(tp, infinity_float); 128 ATF_TP_ADD_TC(tp, infinity_double); 129 ATF_TP_ADD_TC(tp, infinity_long_double); 130 131 return atf_no_error(); 132} 133