summaryrefslogtreecommitdiff
path: root/gcc/testsuite/ada/acats/tests/cxg/cxg2005.a
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/ada/acats/tests/cxg/cxg2005.a
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/ada/acats/tests/cxg/cxg2005.a')
-rw-r--r--gcc/testsuite/ada/acats/tests/cxg/cxg2005.a204
1 files changed, 204 insertions, 0 deletions
diff --git a/gcc/testsuite/ada/acats/tests/cxg/cxg2005.a b/gcc/testsuite/ada/acats/tests/cxg/cxg2005.a
new file mode 100644
index 000000000..4054b83d8
--- /dev/null
+++ b/gcc/testsuite/ada/acats/tests/cxg/cxg2005.a
@@ -0,0 +1,204 @@
+-- CXG2005.A
+--
+-- Grant of Unlimited Rights
+--
+-- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
+-- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
+-- unlimited rights in the software and documentation contained herein.
+-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
+-- this public release, the Government intends to confer upon all
+-- recipients unlimited rights equal to those held by the Government.
+-- These rights include rights to use, duplicate, release or disclose the
+-- released technical data and computer software in whole or in part, in
+-- any manner and for any purpose whatsoever, and to have or permit others
+-- to do so.
+--
+-- DISCLAIMER
+--
+-- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
+-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
+-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
+-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
+-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
+-- PARTICULAR PURPOSE OF SAID MATERIAL.
+--*
+--
+-- OBJECTIVE:
+-- Check that floating point addition and multiplication
+-- have the required accuracy.
+--
+-- TEST DESCRIPTION:
+-- The check for the required precision is essentially a
+-- check that a guard digit is used for the operations.
+-- This test uses a generic package to check the addition
+-- and multiplication results. The
+-- generic package is instantiated with the standard FLOAT
+-- type and a floating point type for the maximum number
+-- of digits of precision.
+--
+-- APPLICABILITY CRITERIA:
+-- This test applies only to implementations supporting the
+-- Numerics Annex.
+--
+--
+-- CHANGE HISTORY:
+-- 14 FEB 96 SAIC Initial Release for 2.1
+-- 16 SEP 99 RLB Repaired to avoid printing thousands of (almost)
+-- identical failure messages.
+--!
+
+-- References:
+--
+-- Basic Concepts for Computational Software
+-- W. J. Cody
+-- Problems and Methodologies in Mathematical Software Production
+-- editors P. C. Messina and A. Murli
+-- Lecture Notes in Computer Science Vol 142
+-- Springer Verlag, 1982
+--
+-- Software Manual for the Elementary Functions
+-- William J. Cody and William Waite
+-- Prentice-Hall, 1980
+--
+
+with System;
+with Report;
+procedure CXG2005 is
+ Verbose : constant Boolean := False;
+
+ generic
+ type Real is digits <>;
+ package Guard_Digit_Check is
+ procedure Do_Test;
+ end Guard_Digit_Check;
+
+ package body Guard_Digit_Check is
+ -- made global so that the compiler will be more likely
+ -- to keep the values in memory instead of in higher
+ -- precision registers.
+ X, Y, Z : Real;
+ OneX : Real;
+ Eps, BN : Real;
+
+ -- special constants - not declared as constants so that
+ -- the "stored" precision will be used instead of a "register"
+ -- precision.
+ Zero : Real := 0.0;
+ One : Real := 1.0;
+ Two : Real := 2.0;
+
+ Failure_Count : Natural := 0;
+
+ procedure Thwart_Optimization is
+ -- the purpose of this procedure is to reference the
+ -- global variables used by the test so
+ -- that the compiler is not likely to keep them in
+ -- a higher precision register for their entire lifetime.
+ begin
+ if Report.Ident_Bool (False) then
+ -- never executed
+ X := X + 5.0;
+ Y := Y + 6.0;
+ Z := Z + 1.0;
+ Eps := Eps + 2.0;
+ BN := BN + 2.0;
+ OneX := X + Y;
+ One := 12.34; Two := 56.78; Zero := 90.12;
+ end if;
+ end Thwart_Optimization;
+
+
+ procedure Addition_Test is
+ begin
+ for K in 1..10 loop
+ Eps := Real (K) * Real'Model_Epsilon;
+ for N in 1.. Real'Machine_EMax - 1 loop
+ BN := Real(Real'Machine_Radix) ** N;
+ X := (One + Eps) * BN;
+ Y := (One - Eps) * BN;
+ Z := X - Y; -- true value for Z is 2*Eps*BN
+
+ if Z /= Eps*BN + Eps*BN then
+ Report.Failed ("addition check failed. K=" &
+ Integer'Image (K) &
+ " N=" & Integer'Image (N) &
+ " difference=" & Real'Image (Z - 2.0*Eps*BN) &
+ " Eps*BN=" & Real'Image (Eps*BN) );
+ Failure_Count := Failure_Count + 1;
+ exit when Failure_Count > K*4; -- Avoid displaying dozens of messages.
+ end if;
+ end loop;
+ end loop;
+ exception
+ when others =>
+ Thwart_Optimization;
+ Report.Failed ("unexpected exception in addition test");
+ end Addition_Test;
+
+
+ procedure Multiplication_Test is
+ begin
+ X := Real (Real'Machine_Radix) ** (Real'Machine_EMax - 1);
+ OneX := One * X;
+ Thwart_Optimization;
+ if OneX /= X then
+ Report.Failed ("multiplication for large values");
+ end if;
+
+ X := Real (Real'Machine_Radix) ** (Real'Model_EMin + 1);
+ OneX := One * X;
+ Thwart_Optimization;
+ if OneX /= X then
+ Report.Failed ("multiplication for small values");
+ end if;
+
+ -- selection of "random" values between 1/radix and radix
+ Y := One / Real (Real'Machine_Radix);
+ Z := Real(Real'Machine_Radix) - One/Real(Real'Machine_Radix);
+ for I in 0..100 loop
+ X := Y + Real (I) / 100.0 * Z;
+ OneX := One * X;
+ Thwart_Optimization;
+ if OneX /= X then
+ Report.Failed ("multiplication for case" & Integer'Image (I));
+ exit when Failure_Count > 40+8; -- Avoid displaying dozens of messages.
+ end if;
+ end loop;
+ exception
+ when others =>
+ Thwart_Optimization;
+ Report.Failed ("unexpected exception in multiplication test");
+ end Multiplication_Test;
+
+
+ procedure Do_Test is
+ begin
+ Addition_Test;
+ Multiplication_Test;
+ end Do_Test;
+ end Guard_Digit_Check;
+
+ package Chk_Float is new Guard_Digit_Check (Float);
+
+ -- check the floating point type with the most digits
+ type A_Long_Float is digits System.Max_Digits;
+ package Chk_A_Long_Float is new Guard_Digit_Check (A_Long_Float);
+begin
+ Report.Test ("CXG2005",
+ "Check the accuracy of floating point" &
+ " addition and multiplication");
+
+ if Verbose then
+ Report.Comment ("checking Standard.Float");
+ end if;
+ Chk_Float.Do_Test;
+
+ if Verbose then
+ Report.Comment ("checking a digits" &
+ Integer'Image (System.Max_Digits) &
+ " floating point type");
+ end if;
+ Chk_A_Long_Float.Do_Test;
+
+ Report.Result;
+end CXG2005;