2 Copyright © 1995-2008, The AROS Development Team. All rights reserved.
6 #include "mathtrans_intern.h"
8 /*****************************************************************************
12 AROS_LH1(float, SPLog10
,
15 AROS_LHA(float, fnum1
, D0
),
18 struct Library
*, MathTransBase
, 21, MathTrans
)
21 Calculate logarithm (base 10) of the given ffp number
30 negative : result is negative
31 overflow : argument was negative
38 If the Argument is negative set overflow-flag and return 0.
39 If the Argument is 0 return 0xde5bd8fe.
43 (ld is the logarithm with base 2)
44 (log is the logarithm with base 10)
48 log fnum1 = log ( M * 2^E ) =
52 = log M + E * log (2) =
55 = ----- + E * ----- = [ld 2 = 1]
62 ld 10 can be precalculated, of course.
63 For calculating ld M see file intern_spld.c
65 *****************************************************************************/
69 LONG ld_M
, Exponent
, Mask
= 0x40, i
, Sign
;
71 /* check for negative sign */
74 SetSR(Overflow_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);
78 if (0 == fnum1
) return 0xde5bd8fe; /* result of the orig. library */
80 /* convert the Exponent of the argument (fnum1) to the ffp-format */
81 Exponent
= (fnum1
& FFPExponent_Mask
) - 0x40;
92 /* find the number of the highest set bit in the exponent */
96 while ( (Mask
& Exponent
) == 0)
102 Exponent
<<= (25 + i
);
103 Exponent
|= (0x47 - i
+ Sign
);
106 ld_M
= intern_SPLd((fnum1
& FFPMantisse_Mask
) | 0x40);
110 log(fnum1) = --------
114 return SPMul( SPAdd(ld_M
, Exponent
), InvLd10
);