Annotation of 43BSDReno/lib/libm/common_source/ieee.3, revision 1.1.1.1

1.1       root        1: .\" Copyright (c) 1985 Regents of the University of California.
                      2: .\" All rights reserved.  The Berkeley software License Agreement
                      3: .\" specifies the terms and conditions for redistribution.
                      4: .\"
                      5: .\"    @(#)ieee.3      6.2 (Berkeley) 5/12/86
                      6: .\"
                      7: .TH IEEE 3M  "May 12, 1986"
                      8: .UC 6
                      9: .ds nn \fINaN\fR
                     10: .SH NAME
                     11: copysign, drem, finite, logb, scalb \- copysign, remainder,
                     12: exponent manipulations
                     13: .SH SYNOPSIS
                     14: .nf
                     15: .B #include <math.h>
                     16: .PP
                     17: .B double copysign(x,y)
                     18: .B double x,y;
                     19: .PP
                     20: .B double drem(x,y)
                     21: .B double x,y;
                     22: .PP
                     23: .B int finite(x)
                     24: .B double x;
                     25: .PP
                     26: .B double logb(x)
                     27: .B double x;
                     28: .PP
                     29: .B double scalb(x,n)
                     30: .B double x;
                     31: .B int n;
                     32: .fi
                     33: .SH DESCRIPTION
                     34: These functions are required for, or recommended by the IEEE standard
                     35: 754 for floating\-point arithmetic.
                     36: .PP
                     37: Copysign(x,y)
                     38: returns x with its sign changed to y's.
                     39: .PP
                     40: Drem(x,y) returns the remainder r := x \- n\(**y
                     41: where n is the integer nearest the exact value of x/y;
                     42: moreover if |n\|\-\|x/y|\|=\|1/2 then n is even.  Consequently
                     43: the remainder is computed exactly and |r| \(<= |y|/2.  But
                     44: drem(x,0) is exceptional; see below under DIAGNOSTICS.
                     45: .PP
                     46: .nf
                     47: .ta \w'Finite(x)'u+1n +\w'= 0 otherwise'u+1n
                     48: .if n \
                     49: Finite(x)      = 1 just when \-infinity < x < +infinity,
                     50: .if t \
                     51: Finite(x)      = 1 just when \-\(if < x < +\(if,
                     52: .if n \
                     53:        = 0 otherwise   (when |x| = infinity or x is \*(nn or
                     54: .if t \
                     55:        = 0 otherwise   (when |x| = \(if or x is \*(nn or
                     56:                \0x is the VAX's reserved operand.)
                     57: .ta
                     58: .fi
                     59: .PP
                     60: Logb(x) returns x's exponent n,
                     61: a signed integer converted to double\-precision floating\-point and so
                     62: chosen that 1\0\(<=\0|x|/2**n\0<\02 unless x = 0 or
                     63: (only on machines that conform to IEEE 754)
                     64: .if n \
                     65: |x| = infinity
                     66: .if t \
                     67: |x| = \(if
                     68: or x lies between 0 and the Underflow Threshold; see below under "BUGS".
                     69: .PP
                     70: Scalb(x,n) = x\(**(2**n) computed, for integer n, without first computing
                     71: 2**n.
                     72: .SH DIAGNOSTICS
                     73: IEEE 754 defines drem(x,0) and
                     74: .if n \
                     75: drem(infinity,y)
                     76: .if t \
                     77: drem(\(if,y)
                     78: to be invalid operations that produce a \*(nn.
                     79: On a VAX, drem(x,0) returns the reserved operand.  No
                     80: .if n \
                     81: infinity
                     82: .if t \
                     83: \(if
                     84: exists on a VAX.
                     85: .PP
                     86: IEEE 754 defines
                     87: .if n \
                     88: logb(\(+-infinity) = +infinity and logb(0) = \-infinity,
                     89: .if t \
                     90: logb(\(+-\(if) = +\(if and logb(0) = \-\(if, and
                     91: requires the latter to signal Division\-by\-Zero.
                     92: But on a VAX, logb(0) = 1.0 \- 2.0**31 = \-2,147,483,647.0.
                     93: And if the correct value of scalb(x,n) would overflow on a VAX,
                     94: it returns the reserved operand and sets \fIerrno\fR to ERANGE.
                     95: .SH SEE ALSO
                     96: floor(3M), math(3M), infnan(3M)
                     97: .SH AUTHOR
                     98: Kwok\-Choi Ng
                     99: .SH BUGS
                    100: Should drem(x,0) and logb(0) on a VAX signal invalidity 
                    101: by setting \fIerrno\fR = EDOM?  Should  logb(0) return  \-1.7e38?
                    102: .PP
                    103: IEEE 754 currently specifies that
                    104: logb(denormalized no.) = logb(tiniest normalized no. > 0)
                    105: but the consensus has changed to the specification in the new 
                    106: proposed IEEE standard p854, namely that logb(x) satisfy 
                    107: .RS
                    108: 1 \(<= scalb(|x|,\-logb(x)) < Radix\0\0\0... = 2 for IEEE 754
                    109: .RE
                    110: for every x except 0, 
                    111: .if n \
                    112: infinity
                    113: .if t \
                    114: \(if
                    115: and \*(nn.
                    116: Almost every program that assumes 754's specification will work
                    117: correctly if logb follows 854's specification instead.
                    118: .PP
                    119: IEEE 754 requires copysign(x,\*(nn) = \(+-x  but says nothing
                    120: else about the sign of a \*(nn.  A \*(nn (\fIN\fRot \fIa\fR \fIN\fRumber) is
                    121: similar in spirit to the VAX's reserved operand, but very
                    122: different in important details.  Since the sign bit of a
                    123: reserved operand makes it look negative,  
                    124: .RS
                    125: copysign(x,reserved operand) = \-x;
                    126: .RE
                    127: should this return the reserved operand instead?

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.