cxg2005.a
来自「xml大全 可读写调用率很高 xml大全 可读写调用率很高」· A 代码 · 共 205 行
A
205 行
-- 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;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?