aboutsummaryrefslogtreecommitdiff
path: root/sys/fmtio/dtcscl.x
blob: afd6adc5952f871a0266719338f6dc866314d98b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.

# DTCSCL -- Scales a double precision real, maintaining maximum precision.
# Called by DTOC and CTOD.

procedure dtcscl (v, e, sense)

double	v		# value to be scaled
int	e		# exponent
int	sense		# sense of scaling (0=apply e to v;  1=calc e)

begin
	if (sense == 0) 		# scale v by 10 ** e
	    v = v * (10.0d0 ** e)

	else {				# scale number to 0.1 <= v < 1.0
	    if (v == 0.0d0)
		e = 0
	    else {
	        e = -1
	        while (v < 0.1d0) {
		    v = v * 10.0d0
		    e = e - 1
		    if (v == 0.0d0) {	# check for underflow to zero
			e = 0
			break
		    }
	        }
	        while (v >= 1.0d0) {
		    v = v / 10.0d0
		    e = e + 1
	        }
	    }
	}
end