# 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```