summaryrefslogtreecommitdiffstats
path: root/lib/msun/src
Commit message (Collapse)AuthorAgeFilesLines
* Fix a small nit noted by bde: exp_x should be of type float, not double.das2012-01-201-1/+1
|
* Add an implementation of fenv.h intended for platforms that lack an FPU anddas2012-01-161-0/+184
| | | | | | | use softfloat. Thanks to Ian Lepore for testing and debugging this patch. The fenv regression tests pass (at least for Ian's arm chip) with this change.
* Convert files to UTF-8 and add some copyright markers where missing.uqs2012-01-071-1/+1
|
* Expose the unimplemented libm functions in the math.h header. This allows ↵theraven2011-11-121-13/+13
| | | | | | | C++'s <cmath> to work without the compiler complaining that the C++ versions are calling implicitly-declared functions. You will still get a linker error when they are called. OpenBSD 5.0 claims to fully implement the C99 <math.h> stuff, so might be worth investigating... Reviewed by: das Approved by: dim (mentor)
* Fix a regression introduced in r226371: When the high part of x*ydas2011-10-212-6/+6
| | | | | exactly cancels with z, return the low part of x*y instead of discarding it.
* Fix a corner case: tan(large + Inf i) == NaN + NaN i.das2011-10-212-0/+10
|
* Improved handling of large x in ccosh{,f}():das2011-10-214-15/+83
| | | | | | | | | - Handle cases where exp(x) would overflow, but ccosh(x) ~= exp(x) / 2 shouldn't. - Use the ccosh(x) ~= exp(x) / 2 approximation to simplify the calculation when x is large. Similarly for csinh(). Also fixed the return value of csinh(-Inf +- 0i).
* Use __ldexp_exp() to simplify things and improve accuracy for x neardas2011-10-214-27/+10
| | | | the overflow threshold.
* The cexp() and {,c}{cos,sin}h functions all need to be able to computedas2011-10-215-32/+209
| | | | | | | | | | | exp(x) scaled down by some factor, and the challenge is doing this accurately when exp(x) would overflow. This change replaces all of the tricks we've been using with common __ldexp_exp() and __ldexp_cexp() routines that handle all the scaling. bde plans to improve on this further by moving the guts of exp() into k_exp.c and handling the scaling in a more direct manner. But the current approach is simple and adequate for now.
* Use STRICT_ASSIGN() to ensure that the compiler doesn't screw thingsdas2011-10-214-5/+13
| | | | | | up by storing x in a wider type than it's supposed to. Submitted by: bde
* Per IEEE754r, pow(1, y) is 1 even if y is NaN, and pow(-1, +-Inf) is 1.das2011-10-212-2/+8
| | | | MFC after: 2 weeks
* Add c{cos,sin,tan}{,h}{,f} functions. This is joint work withdas2011-10-176-0/+671
| | | | bde and kargl.
* Optimize the case of pure imaginary arguments. Calls like this aredas2011-10-162-2/+9
| | | | | | common, e.g., in DFT implementations. Discussed with: bde, kargl
* Move the macros GET_LDBL_EXPSIGN() and SET_LDBL_EXPSIGN() intodas2011-10-162-15/+19
| | | | math_private.h, so they can be used elsewhere in the math library.
* Remove an unused variable.das2011-10-161-1/+1
|
* Remove some unnecessary initializations.das2011-10-156-6/+2
| | | | Obtained from: DragonFlyBSD
* Various changes to improve the accuracy and speed of log{2,10}{,f}.das2011-10-156-72/+143
| | | | | | | | | | | | | | | | | - Rename __kernel_log() to k_log1p(). - Move some of the work that was previously done in the kernel log into the callers. This enables further refactoring to improve accuracy or speed, although I don't recall the details. - Use extra precision when adding the final scaling term, which improves accuracy. - Describe and work around compiler problems that break some of the multiprecision calculations. A fix for a small bug is also included: - Add a special case for log*(1). This is needed to ensure that log*(1) == +0 instead of -0, even when the rounding mode is FE_DOWNWARD. Submitted by: bde
* Style fixes and updates to comments.das2011-10-154-32/+34
| | | | Submitted by: bde
* Don't define FP_FAST_FMA on sparc64; with the recent fixes, fma() isdas2011-10-151-5/+2
| | | | | | no longer "fast" on sparc64. (It really wasn't to begin with, since the old implementation was using long doubles, and long doubles are emulated in software on sparc64.)
* Add INSERT_WORD64 and EXTRACT_WORD64 macros for use in s_fma.c.das2011-10-151-0/+24
|
* Fix a double-rounding bug in fma{,f,l}. The bug would occur indas2011-10-153-125/+231
| | | | | | | | | | round-to-nearest mode when the result, rounded to twice machine precision, was exactly halfway between two machine-precision values. The essence of the fix is to simulate a "sticky bit" in the pathological cases, which is how hardware implementations break the ties. MFC after: 1 month
* Refactor this code by introducing separate functions to handle thedas2011-10-112-92/+164
| | | | | extra-precision add and multiply operations. This simplifies future work but shouldn't result in any functional change.
* In the libm access macros for the double type, z can sometimeskargl2011-06-191-2/+1
| | | | | | | | be used uninitialized. This can lead to spurious exceptions and bit clobbering. Submitted by: bde Approved by: das (mentor)
* Clean up the unneeded cpp macro INLINE_REM_PIO2L.kargl2011-05-303-3/+0
| | | | | Reviewed by: das Approved by: das (mentor)
* Improve the accuracy from a max ULP of ~2000 to max ULP < 0.79kargl2011-04-293-98/+26
| | | | | | | | | | | | | | | | | | | | on i386-class hardware for sinl and cosl. The hand-rolled argument reduction have been replaced by e_rem_pio2l() implementations. To preserve history the following commands have been executed: svn cp src/e_rem_pio2.c ld80/e_rem_pio2l.h mv ${HOME}/bde/ld80/e_rem_pio2l.c ld80/e_rem_pio2l.h svn cp src/e_rem_pio2.c ld128/e_rem_pio2l.h mv ${HOME}/bde/ld128/e_rem_pio2l.c ld128/e_rem_pio2l.h The ld80 version has been tested by bde, das, and kargl over the last few years (bde, das) and few months (kargl). An older ld128 version was tested by das. The committed version has only been compiled tested via 'make universe'. Approved by: das (mentor) Obtained from: bde
* Take two. Add the missing file that should have been committedkargl2011-03-121-0/+157
| | | | | | | | | | | with r219571 and re-enable building of cbrtl. Implement the long double version for the cube root function, cbrtl. The algorithm uses Newton's iterations with a crude estimate of the cube root to converge to a result. Reviewed by: bde Approved by: das
* Implement the long double version for the cube root function, cbrtl.kargl2011-03-122-2/+4
| | | | | | | | The algorithm uses Newton's iterations with a crude estimate of the cube root to converge to a result. Reviewed by: bde Approved by: das
* Convert log10f() to use __kernel_log(), which is more accurate and simpler.das2011-03-071-11/+19
|
* Convert log10() to use __kernel_log(), which is more accurate and simpler.das2011-03-071-38/+16
|
* Add cexp() and cexpf().das2011-03-072-0/+197
| | | | Reviewed by: bde (earlier version)
* Fix typos - remove duplicate "the".brucec2011-02-211-1/+1
| | | | | | PR: bin/154928 Submitted by: Eitan Adler <lists at eitanadler.com> MFC after: 3 days
* Fix a bug where the wrong argument was passed to SET_FLOAT_WORD().das2011-02-101-2/+2
| | | | | | | This bug results in a type mismatch that happens to be harmless because of the way SET_FLOAT_WORD() works. Submitted by: bde
* Fix a bug where the wrong argument was passed to INSERT_WORDS().das2011-02-101-2/+2
| | | | | | | This bug results in a type mismatch that happens to be harmless because of the way INSERT_WORDS() works. Submitted by: bde
* For small arguments, these functions use simple approximations,das2011-02-105-5/+5
| | | | | | | e.g. cos(small) = 1, sin(small) = small. This commit tightens the thresholds at which the simple approximations are used. Reviewed by: bde
* Fix a bogus threshold that was copied from the double precision version.das2011-02-101-1/+1
| | | | | | | This commit should have no effect on correctness; it merely changes the threshold at which a simpler approximation can be used. Reviewed by: bde
* Another minor nit: Make sure the constant here is a float so the compilerdas2010-12-071-1/+1
| | | | doesn't promote the entire expression to double.
* Fix various nits in style and comments that were pointed out by bde.das2010-12-073-9/+13
| | | | Code changes verified with md5.
* Add log2() and log2f().das2010-12-054-0/+118
|
* Add a "kernel" log function, based on e_log.c, which is useful fordas2010-12-052-0/+171
| | | | | | | | | | | | | | | implementing accurate logarithms in different bases. This is based on an approach bde coded up years ago. This function should always be inlined; it will be used in only a few places, and rudimentary tests show a 40% performance improvement in implementations of log2() and log10() on amd64. The kernel takes a reduced argument x and returns the same polynomial approximation as e_log.c, but omitting the low-order term. The low-order term is much larger than the rest of the approximation, so the caller of the kernel function can scale it to the appropriate base in extra precision and obtain a much more accurate answer than by using log(x)/log(b).
* Fix bug in jn(3) and jnf(3) that led to -inf resultsuqs2010-11-132-2/+12
| | | | | | | | | | | | | | | | | | | | Explanation by Steve: jn[f](n,x) for certain ranges of x uses downward recursion to compute the value of the function. The recursion sequence that is generated is proportional to the actual desired value, so a normalization step is taken. This normalization is j0[f](x) divided by the zeroth sequence member. As Bruce notes, near the zeros of j0[f](x) the computed value can have giga-ULP inaccuracy. I found for the 1st zero of j0f(x) only the leading decimal digit is correct. The solution to the issue is fairly straight forward. The zeros of j0(x) and j1(x) never coincide, so as j0(x) approaches a zero, the normalization constant switches to j1[f](x) divided by the 2nd sequence member. The expectation is that j1[f](x) is a more accurately computed value. PR: bin/144306 Submitted by: Steven G. Kargl <kargl@troutmask.apl.washington.edu> Reviewed by: bde MFC after: 7 days
* Introduce __isnanf() as an alias for isnanf(), and make the isnan()das2010-06-122-2/+5
| | | | | | | | | | | macro expand to __isnanf() instead of isnanf() for float arguments. This change is needed because isnanf() isn't declared in strict POSIX or C99 mode. Compatibility note: Apps using isnan(float) that are compiled after this change won't link against an older libm. Reported by: Florian Forster <octo@verplant.org>
* Use the documented machine constraint for SSE registers.ed2009-06-111-1/+1
| | | | | | | | The amd64-specific bits of msun use an undocumented constraint, which is less likely to be supported by other compilers (such as Clang). Change the code to use a more common machine constraint. Obtained from: /projects/clangbsd/
* Use ISO C99 style inline semantics in msun.ed2009-06-036-15/+30
| | | | | Because we use ISO C99 nowadays, we can just get rid of enforcing GNU89-style inlining.
* Namespace: scalb() is withdrawn from POSIX.das2009-03-141-1/+4
|
* Eliminate __real__ and __imag__ gccisms.das2009-03-144-15/+42
|
* C99 TC2 now wants FP_FAST_FMA* to be defined to 1, if the macros aredas2009-02-071-3/+3
| | | | defined at all. See also: defect report #223.
* Use __gnu89_inline so that these files will compile with newer versionsdas2009-01-135-5/+5
| | | | | | of gcc, where the meaning of 'inline' was changed to match C99. Noticed by: rdivacky
* Fix the types of INFINITY and NAN, which were broken in r131851. Theydas2009-01-081-2/+2
| | | | | | | | should both be floats, not doubles. PR: 127795 Submitted by: Christoph Mallon MFC after: 2 weeks
* Add support for the FPA floating-point format on ARM. Themarcel2008-12-231-2/+12
| | | | | | | | | FPA floating-point format is identical to the VFP format, but is always stored in big-endian. Introduce _IEEE_WORD_ORDER to describe the byte-order of the FP representation. Obtained from: Juniper Networks, Inc
* Remove some unused variables.das2008-08-084-4/+1
| | | | Reported by: Intel C Compiler
OpenPOWER on IntegriCloud