up previous next

convert rational number to a binary float

MantissaAndExponent2(X: INT|RAT, Prec: INT): RECORD
MantissaAndExponent2(X: RINGELEM): RECORD

The first form of this function converts an integer or rational number into a RECORD with components named exponent , mantissa and NumDigits .

If X=0 , all fields of the record are set to zero.

For non-zero X the fields give the best representation of the form M*2^E where M has Prec bits. The value of NumDigits is simply Prec . The value of exponent is FloorLog2(X,2) , plus 1 if the mantissa "overflows". The value of mantissa is an integer M satisfying 2^(Prec-1) <= |M| < 2^Prec-1

The second form of this function applies to elements of a "twin-float" ring. In this case the "precision" is determined directly from the twin-float value; since twin-float arithmetic is based on a randomized heuristic, repeating a computation may give a slightly different result (and this can be seen in the output of MantissaAndExponent2 .

/**/  MantissaAndExponent2(1/2,8);       --  1/2 = 128*2^(-8)
record[NumDigits := 8, exponent := -1, mantissa := 128]

/**/  MantissaAndExponent2(65535, 10);   --  rounds up
record[NumDigits := 10, exponent := 16, mantissa := 512]

See Also