aboutsummaryrefslogtreecommitdiff
path: root/sys/gio/fpequalr.x
blob: 8e9a93541a9a3a17c1b53dd3db640e6f1bf0e9ae (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
36
37
38
39
40
41
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.

include	<mach.h>

# FP_EQUALR -- The following procedure is used to compare two single precision
# numbers for equality to within the machine precision for single.  A simple
# comparison of the difference of the two numbers with the machine epsilon
# does not suffice unless the numbers are first normalized to near 1.0, the
# constant used to compute the machine epsilon (epsilon is the smallest number
# such that 1.0 + epsilon > 1.0).

bool procedure fp_equalr (x, y)

real	x, y
real	x1, x2, normx, normy, tol
int	ex, ey

begin
	# Check for the obvious first.
	if (x == y)
	    return (true)

	# We can't normalize zero, so handle the zero operand cases first.
	# Note that the case 0 equals 0 is handled above.

	if (x == 0.0D0 || y == 0.0D0)
	    return (false)

	# Normalize operands and do an epsilon compare.
	call fp_normr (x, normx, ex)
	call fp_normr (y, normy, ey)

	if (ex != ey)
	    return (false)
	else {
	    tol = EPSILONR * 32.0
	    x1 = 1.0E0 + abs (normx - normy)
	    x2 = 1.0E0 + tol
	    return (x1 <= x2)
	}
end