Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!mnetor!uunet!seismo!rutgers!ucla-cs!zen!ucbvax!siri.uio.no!ik.naggum-erik
From: ik.naggum-erik@siri.uio.no
Newsgroups: comp.os.vms
Subject: C help
Message-ID: <6123.8707122219@verdande.UIO.NO>
Date: Mon, 13-Jul-87 08:20:44 EDT
Article-I.D.: verdande.6123.8707122219
Posted: Mon Jul 13 08:20:44 1987
Date-Received: Tue, 14-Jul-87 02:10:59 EDT
Sender: daemon@ucbvax.BERKELEY.EDU
Distribution: world
Organization: The ARPA Internet
Lines: 106

C makes me nervous! Below is an example of the dangers involved with
floating point square roots. Is something wrong here or does one just
have to be extremely careful in C with:
 
1) assigning the proper lnk$libraries for your specific case
2) doing the type conversions explicitly, extra care for read in
   variables
3) being extremly careful with the /G switch, when needed vs. not
   needed.
 
Is there a bug here or is it just that C must never, ever be treated
as a high level language for floating point operations?
 
$ ty gsqrt.c
/*  This program gives an example of a G floating problem when a variable
    is input with scanf . First, the lnk$library logicals must be set
    in the proper order to get the G code, second, when this is done
    and the CC/G compiles the program, input variables evidently are
    NOT G type, you must use mth$cvt_d_g() to convert them!
 
$! The following logicals allow /G_Float qualifier to be used
$! with the CC command and Curses (a screen management package)
$!
$ define lnk$library     sys$library:vaxccurse
$ define lnk$library_1   sys$library:vaxcrtlg
$ define lnk$library_2   sys$library:vaxcrtl
     and use
$ cc/g gsqrt
$ link gsqrt
     to compile and link the code.
 
*/
 
#include math
#include stdio
 
main( )
 
{
 	double x1 ,x2, y1, y2, x3, y3;
        extern double mth$cvt_d_g();
        double sqrt();
 
        printf("Enter 9.0 for this test: ");
        scanf("%f", &x1);
        y1 = sqrt(x1);
 
        x2 = 9.0;
        y2 = sqrt(x2);
 
        x3 = mth$cvt_d_g(&x1);
        y3 = sqrt(x3);
 
        printf("\n\nsqrt of input number        %e = %e\n",x1, y1);
        printf("sqrt of hardwired number    %e = %e\n",x2, y2);
        printf("sqrt of d->g input number   %e = %e\n",x3, y3);
      
}
$ ty assign1.com
$! The following logicals allow /G_Float qualifier to be used
$! with the CC command and Curses (a screen management package)
$! according to the C manual, anyway
$!
$ define lnk$library   sys$library:vaxccurse
$ define lnk$library_1   sys$library:vaxcrtlg
$ define lnk$library_2 sys$library:vaxcrtl
 
$ @assign1
$ sh log lnk$*
 
(LNM$PROCESS_TABLE)
 
  "LNK$LIBRARY" = "SYS$LIBRARY:VAXCCURSE"
  "LNK$LIBRARY_1" = "SYS$LIBRARY:VAXCRTLG"
  "LNK$LIBRARY_2" = "SYS$LIBRARY:VAXCRTL"
 
(LNM$JOB_8028F360)
 
(LNM$GROUP_000011)
 
(LNM$SYSTEM_TABLE)
$ cc/lis gsqrt
$ link gsqrt
$ run gsqrt
Enter 9.0 for this test: 
9.0
sqrt of input number        9.000000e+00 = 2.250000e+00
sqrt of hardwired number    9.000000e+00 = 2.250000e+00
sqrt of d->g input number   7.578125e-01 = 6.562500e-01
$ cc/g gsqrt
$ link gsqrt
$ run gsqrt
Enter 9.0 for this test: 
9.0
sqrt of input number        4.294967e+09 = 6.553600e+04
sqrt of hardwired number    9.000000e+00 = 3.000000e+00
sqrt of d->g input number   9.000000e+00 = 3.000000e+00
$ ty gsqrt.lis       (to show C version no.)
 
GSQRT                                                            9-JUL-1987
 23:59:39    VAX C      V2.2-015                 Page 1
V1.0                                                             9-JUL-1987
 23:52:57    SYS$SYSDEVICE:[JY.CBUG]GSQRT.C;1 (1)
 
 
Is it any wonder I keep putting away my K and R? John