From patchwork Thu May 9 00:47:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joe Simmons-Talbott X-Patchwork-Id: 1933298 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Q5JUlN+1; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4VZYKG296fz20fh for ; Thu, 9 May 2024 10:48:18 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E748C3849AD1 for ; Thu, 9 May 2024 00:48:15 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id CBDF73858C50 for ; Thu, 9 May 2024 00:47:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CBDF73858C50 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org CBDF73858C50 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715215679; cv=none; b=TvQlNGR5Tu8yktL2eIU2IW/Xyl1ThUkPbALYA0BDqViM9ZAdRWHWD76FPL6o0jvUNid30mtltnez2K0OUG5CDYUyUpq8CKfB5KhwWZrw5/ohDUhtbykOVTuv1n9VksMFmPt4Sa6e1q01789aUpHz2hLtrrOOoWO5WxPgJq3PGRc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715215679; c=relaxed/simple; bh=JGqWnYrlbYyrkk/B7F6/m0YEsygzgXr9bxAy2KlzQSg=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=fIIpSuDMYTyiHr3d7pL+GNjIQAaPECgNoOtkzbLlztOy6vwlw4vaBKt1B+2JGLCBS8KecFle1Eg2LFMhlvKWABNE1mAPAt4l34QV3WceAZiaq3p+GJAd/26vrHKFNQTnMWr7I/63Ors8/i2jCISUXpfoRqoEUUUZVxSlF49Wnxo= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1715215676; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=jcPP7/aAmJcJHKYKNryx908jnCv51W5Eusugnw/7s+s=; b=Q5JUlN+1LXYHbL9yzUU0kSLyF6slJ4aehQozvwRvyRgMC8v3gW5+wfbeYcv61iPM1sreMK cMClUS2tqng/orQYeQEQYxJBHLfEzTh6mVwkdOcIpqvqPAweoUKeegr16WkEooTlLLvop3 u3KRKTgZYQYmroGZpDtu2DzushX2O0w= Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-607-6ImEYoEKPX6QRruuwpeDuA-1; Wed, 08 May 2024 20:47:55 -0400 X-MC-Unique: 6ImEYoEKPX6QRruuwpeDuA-1 Received: by mail-qt1-f199.google.com with SMTP id d75a77b69052e-43d72d54a32so3702421cf.2 for ; Wed, 08 May 2024 17:47:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715215674; x=1715820474; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=jcPP7/aAmJcJHKYKNryx908jnCv51W5Eusugnw/7s+s=; b=Ek7NlxdSn008WsutZlnSNDZ2yXlwZQPD1H0YkI/G59SEm2ZnwSU+M1T6icdDLJRUaO uJgE4Vz/fTua/OepEEucu84Ys1dJIf0odlBLua7uRP4lvQmKNqkNd9zSYzonLMF+8lSS 59VZqy1zudvOD9LnsY4OBbWkNKdbQBUIf89C6DyjBKkww8E8Im965beT/aF84+tk6hZF CwL6A7fHgMCcnj/hSgcZWp87tKJwXYDGGDb34M3/2ITrw9HMA5YgdlJnqWgMQmcMmlnz 4ndo2LHWG+fZytXHUkpwkrTLvS0BczQWd3f4hD9vE47Af1k9GIBRE5i0nx7mLHkmVrec vedg== X-Gm-Message-State: AOJu0Yy7etRn23eAdwVw6fiGQ9txKb1m0LtduQN7mtrzC0yLaO9O9TJa iLUgvYkngzvTx/5YJcePTlYg7Z/Ed/nps1gSDB66HeUmJ54SRSz5Unon0CG8u4JGKlXGB0Qw9Us aMWedpexpCvSBmkPMjK34O2a4d9jnXUYIcMbxbVioIktNSi/OIa7BI+dFXbAQ4Uq/f7ZmyF9IWp uTMTQbj+XRxQ4qK+4+R0ooS3IzyYMeS5IXAyFwwtS+3w== X-Received: by 2002:a05:622a:181d:b0:437:a10c:3794 with SMTP id d75a77b69052e-43dbed1595fmr56357271cf.18.1715215673975; Wed, 08 May 2024 17:47:53 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGcL0KAdonUROZ4nc27kxh2SMxmY2TSMd5Cug2bZAwZzZR6YxMcPYRx8fZxeb9IeQtK5I81MA== X-Received: by 2002:a05:622a:181d:b0:437:a10c:3794 with SMTP id d75a77b69052e-43dbed1595fmr56357031cf.18.1715215673436; Wed, 08 May 2024 17:47:53 -0700 (PDT) Received: from oak.redhat.com (c-71-206-142-238.hsd1.va.comcast.net. [71.206.142.238]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-43df569a0dcsm1249671cf.71.2024.05.08.17.47.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 May 2024 17:47:53 -0700 (PDT) From: Joe Simmons-Talbott To: libc-alpha@sourceware.org Cc: Joe Simmons-Talbott , Carlos O'Donell Subject: [PATCH] math: Add more details to the test driver output. Date: Wed, 8 May 2024 20:47:46 -0400 Message-ID: <20240509004751.2481221-1-josimmon@redhat.com> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.0 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org Add start and end indicators that identify the test being run in the verbose output. Better identify the builtin tests for max errors in the summary output. Count each exception checked for each test. Remove double counting of tests for the check_ functions other than check_float_internal. Rename print_max_error and print_complex_max_error to check_max_error and check_complex_max_error respectively since they have side effects. Co-Authored-By: Carlos O'Donell --- math/libm-test-driver.c | 4 +- math/libm-test-support.c | 196 ++++++++++++++++++++++++++++++--------- math/libm-test-support.h | 4 +- 3 files changed, 158 insertions(+), 46 deletions(-) diff --git a/math/libm-test-driver.c b/math/libm-test-driver.c index 3356f9b10d..dfb56e8cde 100644 --- a/math/libm-test-driver.c +++ b/math/libm-test-driver.c @@ -1083,9 +1083,9 @@ struct test_Ff_b1_data = STR_CON3 (FUN, SUFF, TEST_SUFF) TEST_SUFF_STR; \ init_max_error (this_func, EXACT, TEST_COND_any_ibm128) #define END \ - print_max_error (this_func) + check_max_error (this_func) #define END_COMPLEX \ - print_complex_max_error (this_func) + check_complex_max_error (this_func) /* Run tests for a given function in all rounding modes. */ #define ALL_RM_TEST(FUNC, EXACT, ARRAY, LOOP_MACRO, END_MACRO, ...) \ diff --git a/math/libm-test-support.c b/math/libm-test-support.c index 1d60ac783b..073560ae0c 100644 --- a/math/libm-test-support.c +++ b/math/libm-test-support.c @@ -112,6 +112,7 @@ #include #include #include +#include /* This header defines func_ulps, func_real_ulps and func_imag_ulps arrays. */ @@ -125,10 +126,13 @@ static FILE *ulps_file; /* File to document difference. */ static int output_ulps; /* Should ulps printed? */ static char *output_dir; /* Directory where generated files will be written. */ -static int noErrors; /* number of errors */ -static int noTests; /* number of tests (without testing exceptions) */ -static int noExcTests; /* number of tests for exception flags */ -static int noErrnoTests;/* number of tests for errno values */ +#define TEST_INPUT 1 +#define TEST_BUILTIN 2 +static int noErrors; /* number of errors */ +static int noTests; /* number of tests (without testing exceptions) */ +static int noBuiltinTests; /* number of builtin tests */ +static int noExcTests; /* number of tests for exception flags */ +static int noErrnoTests; /* number of tests for errno values */ static int verbose; static int output_max_error; /* Should the maximal errors printed? */ @@ -299,9 +303,19 @@ print_screen_max_error (int ok) /* Update statistic counters. */ static void -update_stats (int ok) +update_stats (int ok, int testType) { - ++noTests; + switch (testType) + { + case TEST_INPUT: + ++noTests; + break; + case TEST_BUILTIN: + ++noBuiltinTests; + break; + default: + abort(); + } if (!ok) ++noErrors; } @@ -367,11 +381,30 @@ fpstack_test (const char *test_name) #endif } +static void +print_test_start (int test_num, const char *test_name, int test_type) +{ + if (print_screen(1)) + printf ("--- Start of%s test # %d, named \"%s\" ---\n", + test_type == TEST_BUILTIN ? " builtin" : "", test_num, test_name); +} +static void +print_test_end (int test_num, const char *test_name, int test_type) +{ + if (print_screen(1)) + printf ("--- End of%s test # %d, named \"%s\" ---\n", + test_type == TEST_BUILTIN ? " builtin" : "", test_num, test_name); +} + +/* This is a builtin test of overall max error. */ void -print_max_error (const char *func_name) +check_max_error (const char *func_name) { int ok = 0; + int thisTest = noBuiltinTests; + + print_test_start (thisTest, func_name, TEST_BUILTIN); if (max_error == 0.0 || (max_error <= prev_max_error && !ignore_max_ulp)) { @@ -392,14 +425,19 @@ print_max_error (const char *func_name) printf (" accepted: %s ulp\n", pmestr); } - update_stats (ok); -} + update_stats (ok, TEST_BUILTIN); + print_test_end (thisTest, func_name, TEST_BUILTIN); +} +/* This is a builtin test of overall max error. */ void -print_complex_max_error (const char *func_name) +check_complex_max_error (const char *func_name) { int real_ok = 0, imag_ok = 0, ok; + int thisTest = noBuiltinTests; + + print_test_start (thisTest, func_name, TEST_BUILTIN); if (real_max_error == 0 || (real_max_error <= prev_real_max_error && !ignore_max_ulp)) @@ -436,7 +474,8 @@ print_complex_max_error (const char *func_name) printf (" accepted: %s ulp\n", pimestr); } - update_stats (ok); + update_stats (ok, TEST_BUILTIN); + print_test_end (thisTest, func_name, TEST_BUILTIN); } @@ -477,12 +516,13 @@ test_single_exception (const char *test_name, else { if (print_screen (1)) - printf ("%s: Exception \"%s\" not set\n", test_name, + printf ("Pass: %s: Exception \"%s\" not set\n", test_name, flag_name); } } if (!ok) ++noErrors; + ++noExcTests; } #endif @@ -494,7 +534,7 @@ test_exceptions (const char *test_name, int exception) { if (flag_test_exceptions && EXCEPTION_TESTS (FLOAT)) { - ++noExcTests; + int ran = 0; #ifdef FE_DIVBYZERO if ((exception & DIVIDE_BY_ZERO_EXCEPTION_OK) == 0) test_single_exception (test_name, exception, @@ -503,14 +543,20 @@ test_exceptions (const char *test_name, int exception) #endif #ifdef FE_INVALID if ((exception & INVALID_EXCEPTION_OK) == 0) - test_single_exception (test_name, exception, - INVALID_EXCEPTION, FE_INVALID, - "Invalid operation"); + { + test_single_exception (test_name, exception, + INVALID_EXCEPTION, FE_INVALID, + "Invalid operation"); + ran = 1; + } #endif #ifdef FE_OVERFLOW if ((exception & OVERFLOW_EXCEPTION_OK) == 0) - test_single_exception (test_name, exception, OVERFLOW_EXCEPTION, - FE_OVERFLOW, "Overflow"); + { + test_single_exception (test_name, exception, OVERFLOW_EXCEPTION, + FE_OVERFLOW, "Overflow"); + ran = 1; + } #endif /* Spurious "underflow" and "inexact" exceptions are always allowed for IBM long double, in line with the underlying @@ -519,17 +565,30 @@ test_exceptions (const char *test_name, int exception) if ((exception & UNDERFLOW_EXCEPTION_OK) == 0 && !(test_ibm128 && (exception & UNDERFLOW_EXCEPTION) == 0)) - test_single_exception (test_name, exception, UNDERFLOW_EXCEPTION, - FE_UNDERFLOW, "Underflow"); + { + test_single_exception (test_name, exception, UNDERFLOW_EXCEPTION, + FE_UNDERFLOW, "Underflow"); + ran = 1; + } + #endif #ifdef FE_INEXACT if ((exception & (INEXACT_EXCEPTION | NO_INEXACT_EXCEPTION)) != 0 && !(test_ibm128 && (exception & NO_INEXACT_EXCEPTION) != 0)) - test_single_exception (test_name, exception, INEXACT_EXCEPTION, - FE_INEXACT, "Inexact"); + { + test_single_exception (test_name, exception, INEXACT_EXCEPTION, + FE_INEXACT, "Inexact"); + ran = 1; + } #endif + assert (ran == 1); } + else + { + if (print_screen (1)) + printf ("Info: %s: No exceptions tested\n", test_name); + } feclearexcept (FE_ALL_EXCEPT); } @@ -561,13 +620,42 @@ test_errno (const char *test_name, int errno_value, int exceptions) { if (flag_test_errno) { - ++noErrnoTests; + int ran = 0; + + if ((exceptions & (ERRNO_UNCHANGED|ERRNO_EDOM|ERRNO_ERANGE)) == 0) + { + if (print_screen (1)) + printf ("Info: %s: The value of errno was not tested\n", + test_name); + return; + } + + if (exceptions & ERRNO_UNCHANGED) - test_single_errno (test_name, errno_value, 0, "unchanged"); + { + test_single_errno (test_name, errno_value, 0, "unchanged"); + ran = 1; + ++noErrnoTests; + } if (exceptions & ERRNO_EDOM) - test_single_errno (test_name, errno_value, EDOM, "EDOM"); + { + test_single_errno (test_name, errno_value, EDOM, "EDOM"); + ran = 1; + ++noErrnoTests; + } if (exceptions & ERRNO_ERANGE) - test_single_errno (test_name, errno_value, ERANGE, "ERANGE"); + { + test_single_errno (test_name, errno_value, ERANGE, "ERANGE"); + ran = 1; + ++noErrnoTests; + } + + assert (ran == 1); + } + else + { + if (print_screen (1)) + printf ("Info: %s: No errno tests\n", test_name); } } @@ -619,6 +707,9 @@ check_float_internal (const char *test_name, FLOAT computed, FLOAT expected, FLOAT diff = 0; FLOAT ulps = 0; int errno_value = errno; + int thisTest = noTests; + + print_test_start (thisTest, test_name, TEST_INPUT); test_exceptions (test_name, exceptions); test_errno (test_name, errno_value, exceptions); @@ -716,12 +807,13 @@ check_float_internal (const char *test_name, FLOAT computed, FLOAT expected, printf (" max.ulp : %s\n", mustrn); } } - update_stats (ok); + update_stats (ok, TEST_INPUT); out: fpstack_test (test_name); feclearexcept (FE_ALL_EXCEPT); errno = 0; + print_test_end (thisTest, test_name, TEST_INPUT); } @@ -776,12 +868,14 @@ check_int (const char *test_name, int computed, int expected, { int ok = 0; int errno_value = errno; + int thisTest = noTests; + + print_test_start (thisTest, test_name, TEST_INPUT); test_exceptions (test_name, exceptions); test_errno (test_name, errno_value, exceptions); if (exceptions & IGNORE_RESULT) goto out; - noTests++; if (computed == expected) ok = 1; @@ -795,11 +889,12 @@ check_int (const char *test_name, int computed, int expected, printf (" should be: %d\n", expected); } - update_stats (ok); + update_stats (ok, TEST_INPUT); out: fpstack_test (test_name); feclearexcept (FE_ALL_EXCEPT); errno = 0; + print_test_end (thisTest, test_name, TEST_INPUT); } @@ -810,12 +905,14 @@ check_long (const char *test_name, long int computed, long int expected, { int ok = 0; int errno_value = errno; + int thisTest = noTests; + + print_test_start (thisTest, test_name, TEST_INPUT); test_exceptions (test_name, exceptions); test_errno (test_name, errno_value, exceptions); if (exceptions & IGNORE_RESULT) goto out; - noTests++; if (computed == expected) ok = 1; @@ -829,11 +926,12 @@ check_long (const char *test_name, long int computed, long int expected, printf (" should be: %ld\n", expected); } - update_stats (ok); + update_stats (ok, TEST_INPUT); out: fpstack_test (test_name); feclearexcept (FE_ALL_EXCEPT); errno = 0; + print_test_end (thisTest, test_name, TEST_INPUT); } @@ -844,12 +942,14 @@ check_bool (const char *test_name, int computed, int expected, { int ok = 0; int errno_value = errno; + int thisTest = noTests; + + print_test_start (thisTest, test_name, TEST_INPUT); test_exceptions (test_name, exceptions); test_errno (test_name, errno_value, exceptions); if (exceptions & IGNORE_RESULT) goto out; - noTests++; if ((computed == 0) == (expected == 0)) ok = 1; @@ -863,11 +963,12 @@ check_bool (const char *test_name, int computed, int expected, printf (" should be: %d\n", expected); } - update_stats (ok); + update_stats (ok, TEST_INPUT); out: fpstack_test (test_name); feclearexcept (FE_ALL_EXCEPT); errno = 0; + print_test_end (thisTest, test_name, TEST_INPUT); } @@ -879,12 +980,14 @@ check_longlong (const char *test_name, long long int computed, { int ok = 0; int errno_value = errno; + int thisTest = noTests; + + print_test_start (thisTest, test_name, TEST_INPUT); test_exceptions (test_name, exceptions); test_errno (test_name, errno_value, exceptions); if (exceptions & IGNORE_RESULT) goto out; - noTests++; if (computed == expected) ok = 1; @@ -898,11 +1001,12 @@ check_longlong (const char *test_name, long long int computed, printf (" should be: %lld\n", expected); } - update_stats (ok); + update_stats (ok, TEST_INPUT); out: fpstack_test (test_name); feclearexcept (FE_ALL_EXCEPT); errno = 0; + print_test_end (thisTest, test_name, TEST_INPUT); } @@ -913,12 +1017,14 @@ check_intmax_t (const char *test_name, intmax_t computed, { int ok = 0; int errno_value = errno; + int thisTest = noTests; + + print_test_start (thisTest, test_name, TEST_INPUT); test_exceptions (test_name, exceptions); test_errno (test_name, errno_value, exceptions); if (exceptions & IGNORE_RESULT) goto out; - noTests++; if (computed == expected) ok = 1; @@ -932,11 +1038,12 @@ check_intmax_t (const char *test_name, intmax_t computed, printf (" should be: %jd\n", expected); } - update_stats (ok); + update_stats (ok, TEST_INPUT); out: fpstack_test (test_name); feclearexcept (FE_ALL_EXCEPT); errno = 0; + print_test_end (thisTest, test_name, TEST_INPUT); } @@ -947,12 +1054,14 @@ check_uintmax_t (const char *test_name, uintmax_t computed, { int ok = 0; int errno_value = errno; + int thisTest = noTests; + + print_test_start (thisTest, test_name, TEST_INPUT); test_exceptions (test_name, exceptions); test_errno (test_name, errno_value, exceptions); if (exceptions & IGNORE_RESULT) goto out; - noTests++; if (computed == expected) ok = 1; @@ -966,11 +1075,12 @@ check_uintmax_t (const char *test_name, uintmax_t computed, printf (" should be: %ju\n", expected); } - update_stats (ok); + update_stats (ok, TEST_INPUT); out: fpstack_test (test_name); feclearexcept (FE_ALL_EXCEPT); errno = 0; + print_test_end (thisTest, test_name, TEST_INPUT); } /* Return whether a test with flags EXCEPTIONS should be run. */ @@ -1192,9 +1302,11 @@ libm_test_finish (void) fclose (ulps_file); printf ("\nTest suite completed:\n"); - printf (" %d test cases plus %d tests for exception flags and\n" - " %d tests for errno executed.\n", - noTests, noExcTests, noErrnoTests); + printf (" %d builtin test cases,\n", noBuiltinTests); + printf (" %d input tests,\n", noTests); + printf (" - with %d tests for exception flags,\n", noExcTests); + printf (" - with %d tests for errno executed.\n", noErrnoTests); + if (noErrors) { printf (" %d errors occurred.\n", noErrors); diff --git a/math/libm-test-support.h b/math/libm-test-support.h index 8baf7e1817..efb9523e9e 100644 --- a/math/libm-test-support.h +++ b/math/libm-test-support.h @@ -170,8 +170,8 @@ extern const char doc[]; int enable_test (int); void init_max_error (const char *, int, int); -void print_max_error (const char *); -void print_complex_max_error (const char *); +void check_max_error (const char *); +void check_complex_max_error (const char *); void check_float (const char *, FLOAT, FLOAT, int); void check_complex (const char *, CFLOAT, CFLOAT, int); void check_int (const char *, int, int, int);