Understanding the Synergy floating point API
The floating point API consists of single- and double-operand routines that enable you to perform floating-point calculations. Because DIBOL has no native floating-point data type, we have implemented this support as routines, and data (the binary representation of the double result) is stored in a8 fields.
The floating-point routines require that you follow these steps to perform floating-point calculations:
1. | Initialize your floating-point a8 fields using the FP_FROM_NUM subroutine. |
2. | Perform the calculation using the appropriate FP_ routine. |
3. | Return the floating-point a8 field to usable data using the FP_TO_NUM subroutine. |
Sample program
The following example contains several of the FP_ routines.
subroutine calc_stats ;Returns mean and standard deviation for a set of numbers. This routine ;requires that the set's sum and sum of squares have been calculated and ;are passed as arguments. This eliminates the need for the caller to ;build an array of the set -- handy for report writers etc. a_size ,n ;Number of entries a_sum ,n ;Sum of the entries a_sqs ,n ;Sum of the squares a_mean ,n ;Returned mean a_stdd ,n ;Returned standard deviation a_sample ,n ;(Optional) flag. If TRUE, requests an ; unbiased standard deviation -- use this ; if estimating for the population based on ; the sample provided. record fval ,a8 fn_1 ,a8 ;Needed for nonbiased calculation fmean ,a8 fsum ,a8 fsqs ,a8 fstd ,a8 proc if (a_size .lt. 2) begin if (a_size .eq. 1) then a_mean = a_sum else a_mean = 0 a_stdd = 0 xreturn end ;Get count, sum and sum of squares into floating-point ; variables for the standard deviation calculation: xcall fp_from_num(fval, %implied(a_size)) xcall fp_from_num(fsum, %implied(a_sum)) xcall fp_from_num(fsqs, %implied(a_sqs)) if (^passed(a_sample) .and. a_sample) then begin ;Does user want a sample-based estimate? xcall fp_from_num(fn_1, %implied(a_size – 1)) xcall fp_div(fsqs, fsqs, fn_1) ;Divide by n–1 instead of n xcall fp_div(fmean, fsum, fval) ; for samples (instead of xcall fp_mul(fsum, fsum, fsum) ; the whole population). xcall fp_mul(fval, fval, fn_1) ; The n-1 denominator yields xcall fp_div(fsum, fsum, fval) ; a larger estimate for small end ; samples. else begin ;This is the whole "population" xcall fp_div(fsqs, fsqs, fval) xcall fp_div(fsum, fsum, fval) fmean = fsum xcall fp_mul(fsum, fsum, fsum) end xcall fp_to_num(fmean, a_mean) xcall fp_sub(fval, fsqs, fsum) xcall fp_sqrt(fval, fval) xcall fp_to_num(fval, a_stdd) xreturn endsubroutine