add fdlibm

git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@557 b9cfdab3-6d41-4d17-bbe4-086880011989
This commit is contained in:
NishiOwO
2025-11-01 15:48:47 +00:00
parent ac87fbdd35
commit 7f523a3d76
90 changed files with 7328 additions and 312 deletions

View File

@@ -2,7 +2,7 @@
CC = bcc32 -c
LD = bcc32
CFLAGS = -Iinclude -D_MILSKO -DUSE_GDI -DUSE_STB_TRUETYPE -DUSE_STB_IMAGE -DSTBI_NO_SIMD
CFLAGS = -Iinclude -Iexternal\fdlibm -D_MILSKO -DUSE_GDI -DUSE_STB_TRUETYPE -DUSE_STB_IMAGE -DSTBI_NO_SIMD
LDFLAGS = -tWD
.SUFFIXES: .obj .c
all: src\Mw.dll
@@ -64,16 +64,89 @@ clean:
del /f /q src\math\default.obj
del /f /q src\math\math.obj
del /f /q src\math\mmx.obj
del /f /q src\math\nbsd_pow.obj
del /f /q src\math\nbsd_endian.obj
del /f /q src\math\nbsd_copysign.obj
del /f /q src\math\nbsd_scalbn.obj
del /f /q src\color_picker\color_picker.obj
del /f /q external\fdlibm\e_acos.obj
del /f /q external\fdlibm\e_acosh.obj
del /f /q external\fdlibm\e_asin.obj
del /f /q external\fdlibm\e_atan2.obj
del /f /q external\fdlibm\e_atanh.obj
del /f /q external\fdlibm\e_cosh.obj
del /f /q external\fdlibm\e_exp.obj
del /f /q external\fdlibm\e_fmod.obj
del /f /q external\fdlibm\e_gamma.obj
del /f /q external\fdlibm\e_gamma_r.obj
del /f /q external\fdlibm\e_hypot.obj
del /f /q external\fdlibm\e_j0.obj
del /f /q external\fdlibm\e_j1.obj
del /f /q external\fdlibm\e_jn.obj
del /f /q external\fdlibm\e_lgamma.obj
del /f /q external\fdlibm\e_lgamma_r.obj
del /f /q external\fdlibm\e_log.obj
del /f /q external\fdlibm\e_log10.obj
del /f /q external\fdlibm\e_pow.obj
del /f /q external\fdlibm\e_rem_pio2.obj
del /f /q external\fdlibm\e_remainder.obj
del /f /q external\fdlibm\e_scalb.obj
del /f /q external\fdlibm\e_sinh.obj
del /f /q external\fdlibm\e_sqrt.obj
del /f /q external\fdlibm\k_cos.obj
del /f /q external\fdlibm\k_rem_pio2.obj
del /f /q external\fdlibm\k_sin.obj
del /f /q external\fdlibm\k_tan.obj
del /f /q external\fdlibm\s_asinh.obj
del /f /q external\fdlibm\s_atan.obj
del /f /q external\fdlibm\s_cbrt.obj
del /f /q external\fdlibm\s_ceil.obj
del /f /q external\fdlibm\s_copysign.obj
del /f /q external\fdlibm\s_cos.obj
del /f /q external\fdlibm\s_erf.obj
del /f /q external\fdlibm\s_expm1.obj
del /f /q external\fdlibm\s_fabs.obj
del /f /q external\fdlibm\s_finite.obj
del /f /q external\fdlibm\s_floor.obj
del /f /q external\fdlibm\s_frexp.obj
del /f /q external\fdlibm\s_ilogb.obj
del /f /q external\fdlibm\s_isnan.obj
del /f /q external\fdlibm\s_ldexp.obj
del /f /q external\fdlibm\s_log1p.obj
del /f /q external\fdlibm\s_sin.obj
del /f /q external\fdlibm\s_logb.obj
del /f /q external\fdlibm\s_modf.obj
del /f /q external\fdlibm\s_nextafter.obj
del /f /q external\fdlibm\s_rint.obj
del /f /q external\fdlibm\s_scalbn.obj
del /f /q external\fdlibm\s_signgam.obj
del /f /q external\fdlibm\s_significand.obj
del /f /q external\fdlibm\s_tan.obj
del /f /q external\fdlibm\s_tanh.obj
del /f /q external\fdlibm\w_acos.obj
del /f /q external\fdlibm\w_acosh.obj
del /f /q external\fdlibm\w_asin.obj
del /f /q external\fdlibm\w_atan2.obj
del /f /q external\fdlibm\w_atanh.obj
del /f /q external\fdlibm\w_cosh.obj
del /f /q external\fdlibm\w_exp.obj
del /f /q external\fdlibm\w_fmod.obj
del /f /q external\fdlibm\w_gamma.obj
del /f /q external\fdlibm\w_gamma_r.obj
del /f /q external\fdlibm\w_hypot.obj
del /f /q external\fdlibm\w_j0.obj
del /f /q external\fdlibm\w_j1.obj
del /f /q external\fdlibm\w_jn.obj
del /f /q external\fdlibm\w_lgamma.obj
del /f /q external\fdlibm\w_lgamma_r.obj
del /f /q external\fdlibm\w_log.obj
del /f /q external\fdlibm\w_log10.obj
del /f /q external\fdlibm\w_pow.obj
del /f /q external\fdlibm\w_remainder.obj
del /f /q external\fdlibm\w_scalb.obj
del /f /q external\fdlibm\w_sinh.obj
del /f /q external\fdlibm\w_sqrt.obj
del /f /q src\backend\gdi.obj
del /f /q src\Mw.dll
src\Mw.dll: src\core.obj src\text.obj src\string.obj src\draw.obj src\default.obj src\filechooser.obj src\lowlevel.obj src\error.obj src\unicode.obj src\color.obj src\directory.obj src\messagebox.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\directory.obj src\icon\file.obj src\icon\back.obj src\icon\forward.obj src\icon\up.obj src\icon\computer.obj src\icon\search.obj src\icon\down.obj src\icon\left.obj src\icon\right.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\cursor\hidden.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\widget\progressbar.obj src\widget\radiobox.obj src\font\boldttf.obj src\font\ttf.obj src\font\boldfont.obj src\font\font.obj src\math\default.obj src\math\math.obj src\math\mmx.obj src\math\nbsd_pow.obj src\math\nbsd_endian.obj src\math\nbsd_copysign.obj src\math\nbsd_scalbn.obj src\color_picker\color_picker.obj src\backend\gdi.obj
$(LD) $(LDFLAGS) -e$@ src\core.obj src\text.obj src\string.obj src\draw.obj src\default.obj src\filechooser.obj src\lowlevel.obj src\error.obj src\unicode.obj src\color.obj src\directory.obj src\messagebox.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\directory.obj src\icon\file.obj src\icon\back.obj src\icon\forward.obj src\icon\up.obj src\icon\computer.obj src\icon\search.obj src\icon\down.obj src\icon\left.obj src\icon\right.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\cursor\hidden.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\widget\progressbar.obj src\widget\radiobox.obj src\font\boldttf.obj src\font\ttf.obj src\font\boldfont.obj src\font\font.obj src\math\default.obj src\math\math.obj src\math\mmx.obj src\math\nbsd_pow.obj src\math\nbsd_endian.obj src\math\nbsd_copysign.obj src\math\nbsd_scalbn.obj src\color_picker\color_picker.obj src\backend\gdi.obj -lopengl32.lib -lgdi32.lib -luser32.lib
src\Mw.dll: src\core.obj src\text.obj src\string.obj src\draw.obj src\default.obj src\filechooser.obj src\lowlevel.obj src\error.obj src\unicode.obj src\color.obj src\directory.obj src\messagebox.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\directory.obj src\icon\file.obj src\icon\back.obj src\icon\forward.obj src\icon\up.obj src\icon\computer.obj src\icon\search.obj src\icon\down.obj src\icon\left.obj src\icon\right.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\cursor\hidden.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\widget\progressbar.obj src\widget\radiobox.obj src\font\boldttf.obj src\font\ttf.obj src\font\boldfont.obj src\font\font.obj src\math\default.obj src\math\math.obj src\math\mmx.obj src\color_picker\color_picker.obj external\fdlibm\e_acos.obj external\fdlibm\e_acosh.obj external\fdlibm\e_asin.obj external\fdlibm\e_atan2.obj external\fdlibm\e_atanh.obj external\fdlibm\e_cosh.obj external\fdlibm\e_exp.obj external\fdlibm\e_fmod.obj external\fdlibm\e_gamma.obj external\fdlibm\e_gamma_r.obj external\fdlibm\e_hypot.obj external\fdlibm\e_j0.obj external\fdlibm\e_j1.obj external\fdlibm\e_jn.obj external\fdlibm\e_lgamma.obj external\fdlibm\e_lgamma_r.obj external\fdlibm\e_log.obj external\fdlibm\e_log10.obj external\fdlibm\e_pow.obj external\fdlibm\e_rem_pio2.obj external\fdlibm\e_remainder.obj external\fdlibm\e_scalb.obj external\fdlibm\e_sinh.obj external\fdlibm\e_sqrt.obj external\fdlibm\k_cos.obj external\fdlibm\k_rem_pio2.obj external\fdlibm\k_sin.obj external\fdlibm\k_tan.obj external\fdlibm\s_asinh.obj external\fdlibm\s_atan.obj external\fdlibm\s_cbrt.obj external\fdlibm\s_ceil.obj external\fdlibm\s_copysign.obj external\fdlibm\s_cos.obj external\fdlibm\s_erf.obj external\fdlibm\s_expm1.obj external\fdlibm\s_fabs.obj external\fdlibm\s_finite.obj external\fdlibm\s_floor.obj external\fdlibm\s_frexp.obj external\fdlibm\s_ilogb.obj external\fdlibm\s_isnan.obj external\fdlibm\s_ldexp.obj external\fdlibm\s_log1p.obj external\fdlibm\s_sin.obj external\fdlibm\s_logb.obj external\fdlibm\s_modf.obj external\fdlibm\s_nextafter.obj external\fdlibm\s_rint.obj external\fdlibm\s_scalbn.obj external\fdlibm\s_signgam.obj external\fdlibm\s_significand.obj external\fdlibm\s_tan.obj external\fdlibm\s_tanh.obj external\fdlibm\w_acos.obj external\fdlibm\w_acosh.obj external\fdlibm\w_asin.obj external\fdlibm\w_atan2.obj external\fdlibm\w_atanh.obj external\fdlibm\w_cosh.obj external\fdlibm\w_exp.obj external\fdlibm\w_fmod.obj external\fdlibm\w_gamma.obj external\fdlibm\w_gamma_r.obj external\fdlibm\w_hypot.obj external\fdlibm\w_j0.obj external\fdlibm\w_j1.obj external\fdlibm\w_jn.obj external\fdlibm\w_lgamma.obj external\fdlibm\w_lgamma_r.obj external\fdlibm\w_log.obj external\fdlibm\w_log10.obj external\fdlibm\w_pow.obj external\fdlibm\w_remainder.obj external\fdlibm\w_scalb.obj external\fdlibm\w_sinh.obj external\fdlibm\w_sqrt.obj src\backend\gdi.obj
$(LD) $(LDFLAGS) -e$@ src\core.obj src\text.obj src\string.obj src\draw.obj src\default.obj src\filechooser.obj src\lowlevel.obj src\error.obj src\unicode.obj src\color.obj src\directory.obj src\messagebox.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\directory.obj src\icon\file.obj src\icon\back.obj src\icon\forward.obj src\icon\up.obj src\icon\computer.obj src\icon\search.obj src\icon\down.obj src\icon\left.obj src\icon\right.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\cursor\hidden.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\widget\progressbar.obj src\widget\radiobox.obj src\font\boldttf.obj src\font\ttf.obj src\font\boldfont.obj src\font\font.obj src\math\default.obj src\math\math.obj src\math\mmx.obj src\color_picker\color_picker.obj external\fdlibm\e_acos.obj external\fdlibm\e_acosh.obj external\fdlibm\e_asin.obj external\fdlibm\e_atan2.obj external\fdlibm\e_atanh.obj external\fdlibm\e_cosh.obj external\fdlibm\e_exp.obj external\fdlibm\e_fmod.obj external\fdlibm\e_gamma.obj external\fdlibm\e_gamma_r.obj external\fdlibm\e_hypot.obj external\fdlibm\e_j0.obj external\fdlibm\e_j1.obj external\fdlibm\e_jn.obj external\fdlibm\e_lgamma.obj external\fdlibm\e_lgamma_r.obj external\fdlibm\e_log.obj external\fdlibm\e_log10.obj external\fdlibm\e_pow.obj external\fdlibm\e_rem_pio2.obj external\fdlibm\e_remainder.obj external\fdlibm\e_scalb.obj external\fdlibm\e_sinh.obj external\fdlibm\e_sqrt.obj external\fdlibm\k_cos.obj external\fdlibm\k_rem_pio2.obj external\fdlibm\k_sin.obj external\fdlibm\k_tan.obj external\fdlibm\s_asinh.obj external\fdlibm\s_atan.obj external\fdlibm\s_cbrt.obj external\fdlibm\s_ceil.obj external\fdlibm\s_copysign.obj external\fdlibm\s_cos.obj external\fdlibm\s_erf.obj external\fdlibm\s_expm1.obj external\fdlibm\s_fabs.obj external\fdlibm\s_finite.obj external\fdlibm\s_floor.obj external\fdlibm\s_frexp.obj external\fdlibm\s_ilogb.obj external\fdlibm\s_isnan.obj external\fdlibm\s_ldexp.obj external\fdlibm\s_log1p.obj external\fdlibm\s_sin.obj external\fdlibm\s_logb.obj external\fdlibm\s_modf.obj external\fdlibm\s_nextafter.obj external\fdlibm\s_rint.obj external\fdlibm\s_scalbn.obj external\fdlibm\s_signgam.obj external\fdlibm\s_significand.obj external\fdlibm\s_tan.obj external\fdlibm\s_tanh.obj external\fdlibm\w_acos.obj external\fdlibm\w_acosh.obj external\fdlibm\w_asin.obj external\fdlibm\w_atan2.obj external\fdlibm\w_atanh.obj external\fdlibm\w_cosh.obj external\fdlibm\w_exp.obj external\fdlibm\w_fmod.obj external\fdlibm\w_gamma.obj external\fdlibm\w_gamma_r.obj external\fdlibm\w_hypot.obj external\fdlibm\w_j0.obj external\fdlibm\w_j1.obj external\fdlibm\w_jn.obj external\fdlibm\w_lgamma.obj external\fdlibm\w_lgamma_r.obj external\fdlibm\w_log.obj external\fdlibm\w_log10.obj external\fdlibm\w_pow.obj external\fdlibm\w_remainder.obj external\fdlibm\w_scalb.obj external\fdlibm\w_sinh.obj external\fdlibm\w_sqrt.obj src\backend\gdi.obj -lopengl32.lib -lgdi32.lib -luser32.lib
implib src\Mw.lib src\Mw.dll
.c.obj:

View File

@@ -8,7 +8,7 @@ USE_FREETYPE2 = 1
CC = $(GCC)gcc
CFLAGS = -Wall -Wextra -Wno-implicit-fallthrough -Wno-sign-compare -Iinclude
CFLAGS = -Wall -Wextra -Wno-implicit-fallthrough -Wno-sign-compare -Iinclude -Iexternal/fdlibm
LDFLAGS =
LIBS =
@@ -42,6 +42,7 @@ include mk/freetype2.mk
include mk/opengl.mk
include mk/vulkan.mk
include mk/math.mk
include mk/fdlibm.mk
.PHONY: all install format clean lib examples
@@ -79,7 +80,7 @@ src/%.o: src/%.c
$(CC) $(L_CFLAGS) -c -o $@ $<
external/%.o: external/%.c
$(CC) $(L_CFLAGS) -Wno-unused-value -Wno-unused-parameter -Wno-unused-function -Wno-stringop-overflow -c -o $@ $<
$(CC) $(L_CFLAGS) -Wno-unknown-warning-option -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-sometimes-uninitialized -Wno-strict-aliasing -Wno-unused-value -Wno-unused-parameter -Wno-unused-function -Wno-stringop-overflow -c -o $@ $<
examples/%.o: examples/%.c
$(CC) $(E_CFLAGS) -c -o $@ $<

View File

@@ -2,7 +2,7 @@
CC = cl /TC /c /nologo
LD = link /nologo
CFLAGS = /Iinclude /D_MILSKO /DUSE_GDI /DUSE_STB_TRUETYPE /DUSE_STB_IMAGE /DSTBI_NO_SIMD
CFLAGS = /Iinclude /Iexternal\fdlibm /D_MILSKO /DUSE_GDI /DUSE_STB_TRUETYPE /DUSE_STB_IMAGE /DSTBI_NO_SIMD
LDFLAGS = /DLL
.SUFFIXES: .obj .c
all: src\Mw.dll
@@ -64,16 +64,89 @@ clean:
del /f /q src\math\default.obj
del /f /q src\math\math.obj
del /f /q src\math\mmx.obj
del /f /q src\math\nbsd_pow.obj
del /f /q src\math\nbsd_endian.obj
del /f /q src\math\nbsd_copysign.obj
del /f /q src\math\nbsd_scalbn.obj
del /f /q src\color_picker\color_picker.obj
del /f /q external\fdlibm\e_acos.obj
del /f /q external\fdlibm\e_acosh.obj
del /f /q external\fdlibm\e_asin.obj
del /f /q external\fdlibm\e_atan2.obj
del /f /q external\fdlibm\e_atanh.obj
del /f /q external\fdlibm\e_cosh.obj
del /f /q external\fdlibm\e_exp.obj
del /f /q external\fdlibm\e_fmod.obj
del /f /q external\fdlibm\e_gamma.obj
del /f /q external\fdlibm\e_gamma_r.obj
del /f /q external\fdlibm\e_hypot.obj
del /f /q external\fdlibm\e_j0.obj
del /f /q external\fdlibm\e_j1.obj
del /f /q external\fdlibm\e_jn.obj
del /f /q external\fdlibm\e_lgamma.obj
del /f /q external\fdlibm\e_lgamma_r.obj
del /f /q external\fdlibm\e_log.obj
del /f /q external\fdlibm\e_log10.obj
del /f /q external\fdlibm\e_pow.obj
del /f /q external\fdlibm\e_rem_pio2.obj
del /f /q external\fdlibm\e_remainder.obj
del /f /q external\fdlibm\e_scalb.obj
del /f /q external\fdlibm\e_sinh.obj
del /f /q external\fdlibm\e_sqrt.obj
del /f /q external\fdlibm\k_cos.obj
del /f /q external\fdlibm\k_rem_pio2.obj
del /f /q external\fdlibm\k_sin.obj
del /f /q external\fdlibm\k_tan.obj
del /f /q external\fdlibm\s_asinh.obj
del /f /q external\fdlibm\s_atan.obj
del /f /q external\fdlibm\s_cbrt.obj
del /f /q external\fdlibm\s_ceil.obj
del /f /q external\fdlibm\s_copysign.obj
del /f /q external\fdlibm\s_cos.obj
del /f /q external\fdlibm\s_erf.obj
del /f /q external\fdlibm\s_expm1.obj
del /f /q external\fdlibm\s_fabs.obj
del /f /q external\fdlibm\s_finite.obj
del /f /q external\fdlibm\s_floor.obj
del /f /q external\fdlibm\s_frexp.obj
del /f /q external\fdlibm\s_ilogb.obj
del /f /q external\fdlibm\s_isnan.obj
del /f /q external\fdlibm\s_ldexp.obj
del /f /q external\fdlibm\s_log1p.obj
del /f /q external\fdlibm\s_sin.obj
del /f /q external\fdlibm\s_logb.obj
del /f /q external\fdlibm\s_modf.obj
del /f /q external\fdlibm\s_nextafter.obj
del /f /q external\fdlibm\s_rint.obj
del /f /q external\fdlibm\s_scalbn.obj
del /f /q external\fdlibm\s_signgam.obj
del /f /q external\fdlibm\s_significand.obj
del /f /q external\fdlibm\s_tan.obj
del /f /q external\fdlibm\s_tanh.obj
del /f /q external\fdlibm\w_acos.obj
del /f /q external\fdlibm\w_acosh.obj
del /f /q external\fdlibm\w_asin.obj
del /f /q external\fdlibm\w_atan2.obj
del /f /q external\fdlibm\w_atanh.obj
del /f /q external\fdlibm\w_cosh.obj
del /f /q external\fdlibm\w_exp.obj
del /f /q external\fdlibm\w_fmod.obj
del /f /q external\fdlibm\w_gamma.obj
del /f /q external\fdlibm\w_gamma_r.obj
del /f /q external\fdlibm\w_hypot.obj
del /f /q external\fdlibm\w_j0.obj
del /f /q external\fdlibm\w_j1.obj
del /f /q external\fdlibm\w_jn.obj
del /f /q external\fdlibm\w_lgamma.obj
del /f /q external\fdlibm\w_lgamma_r.obj
del /f /q external\fdlibm\w_log.obj
del /f /q external\fdlibm\w_log10.obj
del /f /q external\fdlibm\w_pow.obj
del /f /q external\fdlibm\w_remainder.obj
del /f /q external\fdlibm\w_scalb.obj
del /f /q external\fdlibm\w_sinh.obj
del /f /q external\fdlibm\w_sqrt.obj
del /f /q src\backend\gdi.obj
del /f /q src\Mw.dll
src\Mw.dll: src\core.obj src\text.obj src\string.obj src\draw.obj src\default.obj src\filechooser.obj src\lowlevel.obj src\error.obj src\unicode.obj src\color.obj src\directory.obj src\messagebox.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\directory.obj src\icon\file.obj src\icon\back.obj src\icon\forward.obj src\icon\up.obj src\icon\computer.obj src\icon\search.obj src\icon\down.obj src\icon\left.obj src\icon\right.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\cursor\hidden.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\widget\progressbar.obj src\widget\radiobox.obj src\font\boldttf.obj src\font\ttf.obj src\font\boldfont.obj src\font\font.obj src\math\default.obj src\math\math.obj src\math\mmx.obj src\math\nbsd_pow.obj src\math\nbsd_endian.obj src\math\nbsd_copysign.obj src\math\nbsd_scalbn.obj src\color_picker\color_picker.obj src\backend\gdi.obj
$(LD) $(LDFLAGS) /OUT:$@ src\core.obj src\text.obj src\string.obj src\draw.obj src\default.obj src\filechooser.obj src\lowlevel.obj src\error.obj src\unicode.obj src\color.obj src\directory.obj src\messagebox.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\directory.obj src\icon\file.obj src\icon\back.obj src\icon\forward.obj src\icon\up.obj src\icon\computer.obj src\icon\search.obj src\icon\down.obj src\icon\left.obj src\icon\right.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\cursor\hidden.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\widget\progressbar.obj src\widget\radiobox.obj src\font\boldttf.obj src\font\ttf.obj src\font\boldfont.obj src\font\font.obj src\math\default.obj src\math\math.obj src\math\mmx.obj src\math\nbsd_pow.obj src\math\nbsd_endian.obj src\math\nbsd_copysign.obj src\math\nbsd_scalbn.obj src\color_picker\color_picker.obj src\backend\gdi.obj opengl32.lib gdi32.lib user32.lib
src\Mw.dll: src\core.obj src\text.obj src\string.obj src\draw.obj src\default.obj src\filechooser.obj src\lowlevel.obj src\error.obj src\unicode.obj src\color.obj src\directory.obj src\messagebox.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\directory.obj src\icon\file.obj src\icon\back.obj src\icon\forward.obj src\icon\up.obj src\icon\computer.obj src\icon\search.obj src\icon\down.obj src\icon\left.obj src\icon\right.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\cursor\hidden.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\widget\progressbar.obj src\widget\radiobox.obj src\font\boldttf.obj src\font\ttf.obj src\font\boldfont.obj src\font\font.obj src\math\default.obj src\math\math.obj src\math\mmx.obj src\color_picker\color_picker.obj external\fdlibm\e_acos.obj external\fdlibm\e_acosh.obj external\fdlibm\e_asin.obj external\fdlibm\e_atan2.obj external\fdlibm\e_atanh.obj external\fdlibm\e_cosh.obj external\fdlibm\e_exp.obj external\fdlibm\e_fmod.obj external\fdlibm\e_gamma.obj external\fdlibm\e_gamma_r.obj external\fdlibm\e_hypot.obj external\fdlibm\e_j0.obj external\fdlibm\e_j1.obj external\fdlibm\e_jn.obj external\fdlibm\e_lgamma.obj external\fdlibm\e_lgamma_r.obj external\fdlibm\e_log.obj external\fdlibm\e_log10.obj external\fdlibm\e_pow.obj external\fdlibm\e_rem_pio2.obj external\fdlibm\e_remainder.obj external\fdlibm\e_scalb.obj external\fdlibm\e_sinh.obj external\fdlibm\e_sqrt.obj external\fdlibm\k_cos.obj external\fdlibm\k_rem_pio2.obj external\fdlibm\k_sin.obj external\fdlibm\k_tan.obj external\fdlibm\s_asinh.obj external\fdlibm\s_atan.obj external\fdlibm\s_cbrt.obj external\fdlibm\s_ceil.obj external\fdlibm\s_copysign.obj external\fdlibm\s_cos.obj external\fdlibm\s_erf.obj external\fdlibm\s_expm1.obj external\fdlibm\s_fabs.obj external\fdlibm\s_finite.obj external\fdlibm\s_floor.obj external\fdlibm\s_frexp.obj external\fdlibm\s_ilogb.obj external\fdlibm\s_isnan.obj external\fdlibm\s_ldexp.obj external\fdlibm\s_log1p.obj external\fdlibm\s_sin.obj external\fdlibm\s_logb.obj external\fdlibm\s_modf.obj external\fdlibm\s_nextafter.obj external\fdlibm\s_rint.obj external\fdlibm\s_scalbn.obj external\fdlibm\s_signgam.obj external\fdlibm\s_significand.obj external\fdlibm\s_tan.obj external\fdlibm\s_tanh.obj external\fdlibm\w_acos.obj external\fdlibm\w_acosh.obj external\fdlibm\w_asin.obj external\fdlibm\w_atan2.obj external\fdlibm\w_atanh.obj external\fdlibm\w_cosh.obj external\fdlibm\w_exp.obj external\fdlibm\w_fmod.obj external\fdlibm\w_gamma.obj external\fdlibm\w_gamma_r.obj external\fdlibm\w_hypot.obj external\fdlibm\w_j0.obj external\fdlibm\w_j1.obj external\fdlibm\w_jn.obj external\fdlibm\w_lgamma.obj external\fdlibm\w_lgamma_r.obj external\fdlibm\w_log.obj external\fdlibm\w_log10.obj external\fdlibm\w_pow.obj external\fdlibm\w_remainder.obj external\fdlibm\w_scalb.obj external\fdlibm\w_sinh.obj external\fdlibm\w_sqrt.obj src\backend\gdi.obj
$(LD) $(LDFLAGS) /OUT:$@ src\core.obj src\text.obj src\string.obj src\draw.obj src\default.obj src\filechooser.obj src\lowlevel.obj src\error.obj src\unicode.obj src\color.obj src\directory.obj src\messagebox.obj external\stb_ds.obj external\stb_image.obj external\stb_truetype.obj src\icon\info.obj src\icon\note.obj src\icon\warning.obj src\icon\error.obj src\icon\news.obj src\icon\directory.obj src\icon\file.obj src\icon\back.obj src\icon\forward.obj src\icon\up.obj src\icon\computer.obj src\icon\search.obj src\icon\down.obj src\icon\left.obj src\icon\right.obj src\cursor\default.obj src\cursor\cross.obj src\cursor\text.obj src\cursor\hidden.obj src\widget\button.obj src\widget\frame.obj src\widget\opengl.obj src\widget\window.obj src\widget\menu.obj src\widget\entry.obj src\widget\submenu.obj src\widget\viewport.obj src\widget\image.obj src\widget\scrollbar.obj src\widget\checkbox.obj src\widget\label.obj src\widget\listbox.obj src\widget\numberentry.obj src\widget\progressbar.obj src\widget\radiobox.obj src\font\boldttf.obj src\font\ttf.obj src\font\boldfont.obj src\font\font.obj src\math\default.obj src\math\math.obj src\math\mmx.obj src\color_picker\color_picker.obj external\fdlibm\e_acos.obj external\fdlibm\e_acosh.obj external\fdlibm\e_asin.obj external\fdlibm\e_atan2.obj external\fdlibm\e_atanh.obj external\fdlibm\e_cosh.obj external\fdlibm\e_exp.obj external\fdlibm\e_fmod.obj external\fdlibm\e_gamma.obj external\fdlibm\e_gamma_r.obj external\fdlibm\e_hypot.obj external\fdlibm\e_j0.obj external\fdlibm\e_j1.obj external\fdlibm\e_jn.obj external\fdlibm\e_lgamma.obj external\fdlibm\e_lgamma_r.obj external\fdlibm\e_log.obj external\fdlibm\e_log10.obj external\fdlibm\e_pow.obj external\fdlibm\e_rem_pio2.obj external\fdlibm\e_remainder.obj external\fdlibm\e_scalb.obj external\fdlibm\e_sinh.obj external\fdlibm\e_sqrt.obj external\fdlibm\k_cos.obj external\fdlibm\k_rem_pio2.obj external\fdlibm\k_sin.obj external\fdlibm\k_tan.obj external\fdlibm\s_asinh.obj external\fdlibm\s_atan.obj external\fdlibm\s_cbrt.obj external\fdlibm\s_ceil.obj external\fdlibm\s_copysign.obj external\fdlibm\s_cos.obj external\fdlibm\s_erf.obj external\fdlibm\s_expm1.obj external\fdlibm\s_fabs.obj external\fdlibm\s_finite.obj external\fdlibm\s_floor.obj external\fdlibm\s_frexp.obj external\fdlibm\s_ilogb.obj external\fdlibm\s_isnan.obj external\fdlibm\s_ldexp.obj external\fdlibm\s_log1p.obj external\fdlibm\s_sin.obj external\fdlibm\s_logb.obj external\fdlibm\s_modf.obj external\fdlibm\s_nextafter.obj external\fdlibm\s_rint.obj external\fdlibm\s_scalbn.obj external\fdlibm\s_signgam.obj external\fdlibm\s_significand.obj external\fdlibm\s_tan.obj external\fdlibm\s_tanh.obj external\fdlibm\w_acos.obj external\fdlibm\w_acosh.obj external\fdlibm\w_asin.obj external\fdlibm\w_atan2.obj external\fdlibm\w_atanh.obj external\fdlibm\w_cosh.obj external\fdlibm\w_exp.obj external\fdlibm\w_fmod.obj external\fdlibm\w_gamma.obj external\fdlibm\w_gamma_r.obj external\fdlibm\w_hypot.obj external\fdlibm\w_j0.obj external\fdlibm\w_j1.obj external\fdlibm\w_jn.obj external\fdlibm\w_lgamma.obj external\fdlibm\w_lgamma_r.obj external\fdlibm\w_log.obj external\fdlibm\w_log10.obj external\fdlibm\w_pow.obj external\fdlibm\w_remainder.obj external\fdlibm\w_scalb.obj external\fdlibm\w_sinh.obj external\fdlibm\w_sqrt.obj src\backend\gdi.obj opengl32.lib gdi32.lib user32.lib
.c.obj:

View File

@@ -2,7 +2,7 @@
CC = wcc386 -bt=nt -q -bd
LD = wlink option quiet
CFLAGS = -i=include -d_MILSKO -dUSE_GDI -dUSE_STB_TRUETYPE -dUSE_STB_IMAGE -dSTBI_NO_SIMD
CFLAGS = -i=include -i=external/fdlibm -d_MILSKO -dUSE_GDI -dUSE_STB_TRUETYPE -dUSE_STB_IMAGE -dSTBI_NO_SIMD
LDFLAGS = system nt_dll
all: src/Mw.dll
clean: .SYMBOLIC
@@ -63,16 +63,89 @@ clean: .SYMBOLIC
%erase src/math/default.obj
%erase src/math/math.obj
%erase src/math/mmx.obj
%erase src/math/nbsd_pow.obj
%erase src/math/nbsd_endian.obj
%erase src/math/nbsd_copysign.obj
%erase src/math/nbsd_scalbn.obj
%erase src/color_picker/color_picker.obj
%erase external/fdlibm/e_acos.obj
%erase external/fdlibm/e_acosh.obj
%erase external/fdlibm/e_asin.obj
%erase external/fdlibm/e_atan2.obj
%erase external/fdlibm/e_atanh.obj
%erase external/fdlibm/e_cosh.obj
%erase external/fdlibm/e_exp.obj
%erase external/fdlibm/e_fmod.obj
%erase external/fdlibm/e_gamma.obj
%erase external/fdlibm/e_gamma_r.obj
%erase external/fdlibm/e_hypot.obj
%erase external/fdlibm/e_j0.obj
%erase external/fdlibm/e_j1.obj
%erase external/fdlibm/e_jn.obj
%erase external/fdlibm/e_lgamma.obj
%erase external/fdlibm/e_lgamma_r.obj
%erase external/fdlibm/e_log.obj
%erase external/fdlibm/e_log10.obj
%erase external/fdlibm/e_pow.obj
%erase external/fdlibm/e_rem_pio2.obj
%erase external/fdlibm/e_remainder.obj
%erase external/fdlibm/e_scalb.obj
%erase external/fdlibm/e_sinh.obj
%erase external/fdlibm/e_sqrt.obj
%erase external/fdlibm/k_cos.obj
%erase external/fdlibm/k_rem_pio2.obj
%erase external/fdlibm/k_sin.obj
%erase external/fdlibm/k_tan.obj
%erase external/fdlibm/s_asinh.obj
%erase external/fdlibm/s_atan.obj
%erase external/fdlibm/s_cbrt.obj
%erase external/fdlibm/s_ceil.obj
%erase external/fdlibm/s_copysign.obj
%erase external/fdlibm/s_cos.obj
%erase external/fdlibm/s_erf.obj
%erase external/fdlibm/s_expm1.obj
%erase external/fdlibm/s_fabs.obj
%erase external/fdlibm/s_finite.obj
%erase external/fdlibm/s_floor.obj
%erase external/fdlibm/s_frexp.obj
%erase external/fdlibm/s_ilogb.obj
%erase external/fdlibm/s_isnan.obj
%erase external/fdlibm/s_ldexp.obj
%erase external/fdlibm/s_log1p.obj
%erase external/fdlibm/s_sin.obj
%erase external/fdlibm/s_logb.obj
%erase external/fdlibm/s_modf.obj
%erase external/fdlibm/s_nextafter.obj
%erase external/fdlibm/s_rint.obj
%erase external/fdlibm/s_scalbn.obj
%erase external/fdlibm/s_signgam.obj
%erase external/fdlibm/s_significand.obj
%erase external/fdlibm/s_tan.obj
%erase external/fdlibm/s_tanh.obj
%erase external/fdlibm/w_acos.obj
%erase external/fdlibm/w_acosh.obj
%erase external/fdlibm/w_asin.obj
%erase external/fdlibm/w_atan2.obj
%erase external/fdlibm/w_atanh.obj
%erase external/fdlibm/w_cosh.obj
%erase external/fdlibm/w_exp.obj
%erase external/fdlibm/w_fmod.obj
%erase external/fdlibm/w_gamma.obj
%erase external/fdlibm/w_gamma_r.obj
%erase external/fdlibm/w_hypot.obj
%erase external/fdlibm/w_j0.obj
%erase external/fdlibm/w_j1.obj
%erase external/fdlibm/w_jn.obj
%erase external/fdlibm/w_lgamma.obj
%erase external/fdlibm/w_lgamma_r.obj
%erase external/fdlibm/w_log.obj
%erase external/fdlibm/w_log10.obj
%erase external/fdlibm/w_pow.obj
%erase external/fdlibm/w_remainder.obj
%erase external/fdlibm/w_scalb.obj
%erase external/fdlibm/w_sinh.obj
%erase external/fdlibm/w_sqrt.obj
%erase src/backend/gdi.obj
%erase src/Mw.dll
src/Mw.dll: src/core.obj src/text.obj src/string.obj src/draw.obj src/default.obj src/filechooser.obj src/lowlevel.obj src/error.obj src/unicode.obj src/color.obj src/directory.obj src/messagebox.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/icon/info.obj src/icon/note.obj src/icon/warning.obj src/icon/error.obj src/icon/news.obj src/icon/directory.obj src/icon/file.obj src/icon/back.obj src/icon/forward.obj src/icon/up.obj src/icon/computer.obj src/icon/search.obj src/icon/down.obj src/icon/left.obj src/icon/right.obj src/cursor/default.obj src/cursor/cross.obj src/cursor/text.obj src/cursor/hidden.obj src/widget/button.obj src/widget/frame.obj src/widget/opengl.obj src/widget/window.obj src/widget/menu.obj src/widget/entry.obj src/widget/submenu.obj src/widget/viewport.obj src/widget/image.obj src/widget/scrollbar.obj src/widget/checkbox.obj src/widget/label.obj src/widget/listbox.obj src/widget/numberentry.obj src/widget/progressbar.obj src/widget/radiobox.obj src/font/boldttf.obj src/font/ttf.obj src/font/boldfont.obj src/font/font.obj src/math/default.obj src/math/math.obj src/math/mmx.obj src/math/nbsd_pow.obj src/math/nbsd_endian.obj src/math/nbsd_copysign.obj src/math/nbsd_scalbn.obj src/color_picker/color_picker.obj src/backend/gdi.obj
$(LD) $(LDFLAGS) option implib=src/Mw.lib name $@ file src/core.obj file src/text.obj file src/string.obj file src/draw.obj file src/default.obj file src/filechooser.obj file src/lowlevel.obj file src/error.obj file src/unicode.obj file src/color.obj file src/directory.obj file src/messagebox.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/icon/info.obj file src/icon/note.obj file src/icon/warning.obj file src/icon/error.obj file src/icon/news.obj file src/icon/directory.obj file src/icon/file.obj file src/icon/back.obj file src/icon/forward.obj file src/icon/up.obj file src/icon/computer.obj file src/icon/search.obj file src/icon/down.obj file src/icon/left.obj file src/icon/right.obj file src/cursor/default.obj file src/cursor/cross.obj file src/cursor/text.obj file src/cursor/hidden.obj file src/widget/button.obj file src/widget/frame.obj file src/widget/opengl.obj file src/widget/window.obj file src/widget/menu.obj file src/widget/entry.obj file src/widget/submenu.obj file src/widget/viewport.obj file src/widget/image.obj file src/widget/scrollbar.obj file src/widget/checkbox.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/numberentry.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/font/boldttf.obj file src/font/ttf.obj file src/font/boldfont.obj file src/font/font.obj file src/math/default.obj file src/math/math.obj file src/math/mmx.obj file src/math/nbsd_pow.obj file src/math/nbsd_endian.obj file src/math/nbsd_copysign.obj file src/math/nbsd_scalbn.obj file src/color_picker/color_picker.obj file src/backend/gdi.obj library clib3r.lib library opengl32.lib library gdi32.lib library user32.lib
src/Mw.dll: src/core.obj src/text.obj src/string.obj src/draw.obj src/default.obj src/filechooser.obj src/lowlevel.obj src/error.obj src/unicode.obj src/color.obj src/directory.obj src/messagebox.obj external/stb_ds.obj external/stb_image.obj external/stb_truetype.obj src/icon/info.obj src/icon/note.obj src/icon/warning.obj src/icon/error.obj src/icon/news.obj src/icon/directory.obj src/icon/file.obj src/icon/back.obj src/icon/forward.obj src/icon/up.obj src/icon/computer.obj src/icon/search.obj src/icon/down.obj src/icon/left.obj src/icon/right.obj src/cursor/default.obj src/cursor/cross.obj src/cursor/text.obj src/cursor/hidden.obj src/widget/button.obj src/widget/frame.obj src/widget/opengl.obj src/widget/window.obj src/widget/menu.obj src/widget/entry.obj src/widget/submenu.obj src/widget/viewport.obj src/widget/image.obj src/widget/scrollbar.obj src/widget/checkbox.obj src/widget/label.obj src/widget/listbox.obj src/widget/numberentry.obj src/widget/progressbar.obj src/widget/radiobox.obj src/font/boldttf.obj src/font/ttf.obj src/font/boldfont.obj src/font/font.obj src/math/default.obj src/math/math.obj src/math/mmx.obj src/color_picker/color_picker.obj external/fdlibm/e_acos.obj external/fdlibm/e_acosh.obj external/fdlibm/e_asin.obj external/fdlibm/e_atan2.obj external/fdlibm/e_atanh.obj external/fdlibm/e_cosh.obj external/fdlibm/e_exp.obj external/fdlibm/e_fmod.obj external/fdlibm/e_gamma.obj external/fdlibm/e_gamma_r.obj external/fdlibm/e_hypot.obj external/fdlibm/e_j0.obj external/fdlibm/e_j1.obj external/fdlibm/e_jn.obj external/fdlibm/e_lgamma.obj external/fdlibm/e_lgamma_r.obj external/fdlibm/e_log.obj external/fdlibm/e_log10.obj external/fdlibm/e_pow.obj external/fdlibm/e_rem_pio2.obj external/fdlibm/e_remainder.obj external/fdlibm/e_scalb.obj external/fdlibm/e_sinh.obj external/fdlibm/e_sqrt.obj external/fdlibm/k_cos.obj external/fdlibm/k_rem_pio2.obj external/fdlibm/k_sin.obj external/fdlibm/k_tan.obj external/fdlibm/s_asinh.obj external/fdlibm/s_atan.obj external/fdlibm/s_cbrt.obj external/fdlibm/s_ceil.obj external/fdlibm/s_copysign.obj external/fdlibm/s_cos.obj external/fdlibm/s_erf.obj external/fdlibm/s_expm1.obj external/fdlibm/s_fabs.obj external/fdlibm/s_finite.obj external/fdlibm/s_floor.obj external/fdlibm/s_frexp.obj external/fdlibm/s_ilogb.obj external/fdlibm/s_isnan.obj external/fdlibm/s_ldexp.obj external/fdlibm/s_log1p.obj external/fdlibm/s_sin.obj external/fdlibm/s_logb.obj external/fdlibm/s_modf.obj external/fdlibm/s_nextafter.obj external/fdlibm/s_rint.obj external/fdlibm/s_scalbn.obj external/fdlibm/s_signgam.obj external/fdlibm/s_significand.obj external/fdlibm/s_tan.obj external/fdlibm/s_tanh.obj external/fdlibm/w_acos.obj external/fdlibm/w_acosh.obj external/fdlibm/w_asin.obj external/fdlibm/w_atan2.obj external/fdlibm/w_atanh.obj external/fdlibm/w_cosh.obj external/fdlibm/w_exp.obj external/fdlibm/w_fmod.obj external/fdlibm/w_gamma.obj external/fdlibm/w_gamma_r.obj external/fdlibm/w_hypot.obj external/fdlibm/w_j0.obj external/fdlibm/w_j1.obj external/fdlibm/w_jn.obj external/fdlibm/w_lgamma.obj external/fdlibm/w_lgamma_r.obj external/fdlibm/w_log.obj external/fdlibm/w_log10.obj external/fdlibm/w_pow.obj external/fdlibm/w_remainder.obj external/fdlibm/w_scalb.obj external/fdlibm/w_sinh.obj external/fdlibm/w_sqrt.obj src/backend/gdi.obj
$(LD) $(LDFLAGS) option implib=src/Mw.lib name $@ file src/core.obj file src/text.obj file src/string.obj file src/draw.obj file src/default.obj file src/filechooser.obj file src/lowlevel.obj file src/error.obj file src/unicode.obj file src/color.obj file src/directory.obj file src/messagebox.obj file external/stb_ds.obj file external/stb_image.obj file external/stb_truetype.obj file src/icon/info.obj file src/icon/note.obj file src/icon/warning.obj file src/icon/error.obj file src/icon/news.obj file src/icon/directory.obj file src/icon/file.obj file src/icon/back.obj file src/icon/forward.obj file src/icon/up.obj file src/icon/computer.obj file src/icon/search.obj file src/icon/down.obj file src/icon/left.obj file src/icon/right.obj file src/cursor/default.obj file src/cursor/cross.obj file src/cursor/text.obj file src/cursor/hidden.obj file src/widget/button.obj file src/widget/frame.obj file src/widget/opengl.obj file src/widget/window.obj file src/widget/menu.obj file src/widget/entry.obj file src/widget/submenu.obj file src/widget/viewport.obj file src/widget/image.obj file src/widget/scrollbar.obj file src/widget/checkbox.obj file src/widget/label.obj file src/widget/listbox.obj file src/widget/numberentry.obj file src/widget/progressbar.obj file src/widget/radiobox.obj file src/font/boldttf.obj file src/font/ttf.obj file src/font/boldfont.obj file src/font/font.obj file src/math/default.obj file src/math/math.obj file src/math/mmx.obj file src/color_picker/color_picker.obj file external/fdlibm/e_acos.obj file external/fdlibm/e_acosh.obj file external/fdlibm/e_asin.obj file external/fdlibm/e_atan2.obj file external/fdlibm/e_atanh.obj file external/fdlibm/e_cosh.obj file external/fdlibm/e_exp.obj file external/fdlibm/e_fmod.obj file external/fdlibm/e_gamma.obj file external/fdlibm/e_gamma_r.obj file external/fdlibm/e_hypot.obj file external/fdlibm/e_j0.obj file external/fdlibm/e_j1.obj file external/fdlibm/e_jn.obj file external/fdlibm/e_lgamma.obj file external/fdlibm/e_lgamma_r.obj file external/fdlibm/e_log.obj file external/fdlibm/e_log10.obj file external/fdlibm/e_pow.obj file external/fdlibm/e_rem_pio2.obj file external/fdlibm/e_remainder.obj file external/fdlibm/e_scalb.obj file external/fdlibm/e_sinh.obj file external/fdlibm/e_sqrt.obj file external/fdlibm/k_cos.obj file external/fdlibm/k_rem_pio2.obj file external/fdlibm/k_sin.obj file external/fdlibm/k_tan.obj file external/fdlibm/s_asinh.obj file external/fdlibm/s_atan.obj file external/fdlibm/s_cbrt.obj file external/fdlibm/s_ceil.obj file external/fdlibm/s_copysign.obj file external/fdlibm/s_cos.obj file external/fdlibm/s_erf.obj file external/fdlibm/s_expm1.obj file external/fdlibm/s_fabs.obj file external/fdlibm/s_finite.obj file external/fdlibm/s_floor.obj file external/fdlibm/s_frexp.obj file external/fdlibm/s_ilogb.obj file external/fdlibm/s_isnan.obj file external/fdlibm/s_ldexp.obj file external/fdlibm/s_log1p.obj file external/fdlibm/s_sin.obj file external/fdlibm/s_logb.obj file external/fdlibm/s_modf.obj file external/fdlibm/s_nextafter.obj file external/fdlibm/s_rint.obj file external/fdlibm/s_scalbn.obj file external/fdlibm/s_signgam.obj file external/fdlibm/s_significand.obj file external/fdlibm/s_tan.obj file external/fdlibm/s_tanh.obj file external/fdlibm/w_acos.obj file external/fdlibm/w_acosh.obj file external/fdlibm/w_asin.obj file external/fdlibm/w_atan2.obj file external/fdlibm/w_atanh.obj file external/fdlibm/w_cosh.obj file external/fdlibm/w_exp.obj file external/fdlibm/w_fmod.obj file external/fdlibm/w_gamma.obj file external/fdlibm/w_gamma_r.obj file external/fdlibm/w_hypot.obj file external/fdlibm/w_j0.obj file external/fdlibm/w_j1.obj file external/fdlibm/w_jn.obj file external/fdlibm/w_lgamma.obj file external/fdlibm/w_lgamma_r.obj file external/fdlibm/w_log.obj file external/fdlibm/w_log10.obj file external/fdlibm/w_pow.obj file external/fdlibm/w_remainder.obj file external/fdlibm/w_scalb.obj file external/fdlibm/w_sinh.obj file external/fdlibm/w_sqrt.obj file src/backend/gdi.obj library clib3r.lib library opengl32.lib library gdi32.lib library user32.lib
@@ -190,15 +263,161 @@ src/math/math.obj: src/math/math.c
$(CC) $(CFLAGS) -fo=$@ $<
src/math/mmx.obj: src/math/mmx.c
$(CC) $(CFLAGS) -fo=$@ $<
src/math/nbsd_pow.obj: src/math/nbsd_pow.c
$(CC) $(CFLAGS) -fo=$@ $<
src/math/nbsd_endian.obj: src/math/nbsd_endian.c
$(CC) $(CFLAGS) -fo=$@ $<
src/math/nbsd_copysign.obj: src/math/nbsd_copysign.c
$(CC) $(CFLAGS) -fo=$@ $<
src/math/nbsd_scalbn.obj: src/math/nbsd_scalbn.c
$(CC) $(CFLAGS) -fo=$@ $<
src/color_picker/color_picker.obj: src/color_picker/color_picker.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_acos.obj: external/fdlibm/e_acos.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_acosh.obj: external/fdlibm/e_acosh.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_asin.obj: external/fdlibm/e_asin.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_atan2.obj: external/fdlibm/e_atan2.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_atanh.obj: external/fdlibm/e_atanh.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_cosh.obj: external/fdlibm/e_cosh.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_exp.obj: external/fdlibm/e_exp.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_fmod.obj: external/fdlibm/e_fmod.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_gamma.obj: external/fdlibm/e_gamma.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_gamma_r.obj: external/fdlibm/e_gamma_r.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_hypot.obj: external/fdlibm/e_hypot.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_j0.obj: external/fdlibm/e_j0.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_j1.obj: external/fdlibm/e_j1.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_jn.obj: external/fdlibm/e_jn.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_lgamma.obj: external/fdlibm/e_lgamma.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_lgamma_r.obj: external/fdlibm/e_lgamma_r.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_log.obj: external/fdlibm/e_log.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_log10.obj: external/fdlibm/e_log10.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_pow.obj: external/fdlibm/e_pow.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_rem_pio2.obj: external/fdlibm/e_rem_pio2.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_remainder.obj: external/fdlibm/e_remainder.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_scalb.obj: external/fdlibm/e_scalb.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_sinh.obj: external/fdlibm/e_sinh.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/e_sqrt.obj: external/fdlibm/e_sqrt.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/k_cos.obj: external/fdlibm/k_cos.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/k_rem_pio2.obj: external/fdlibm/k_rem_pio2.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/k_sin.obj: external/fdlibm/k_sin.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/k_tan.obj: external/fdlibm/k_tan.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_asinh.obj: external/fdlibm/s_asinh.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_atan.obj: external/fdlibm/s_atan.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_cbrt.obj: external/fdlibm/s_cbrt.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_ceil.obj: external/fdlibm/s_ceil.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_copysign.obj: external/fdlibm/s_copysign.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_cos.obj: external/fdlibm/s_cos.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_erf.obj: external/fdlibm/s_erf.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_expm1.obj: external/fdlibm/s_expm1.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_fabs.obj: external/fdlibm/s_fabs.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_finite.obj: external/fdlibm/s_finite.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_floor.obj: external/fdlibm/s_floor.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_frexp.obj: external/fdlibm/s_frexp.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_ilogb.obj: external/fdlibm/s_ilogb.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_isnan.obj: external/fdlibm/s_isnan.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_ldexp.obj: external/fdlibm/s_ldexp.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_log1p.obj: external/fdlibm/s_log1p.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_sin.obj: external/fdlibm/s_sin.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_logb.obj: external/fdlibm/s_logb.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_modf.obj: external/fdlibm/s_modf.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_nextafter.obj: external/fdlibm/s_nextafter.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_rint.obj: external/fdlibm/s_rint.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_scalbn.obj: external/fdlibm/s_scalbn.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_signgam.obj: external/fdlibm/s_signgam.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_significand.obj: external/fdlibm/s_significand.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_tan.obj: external/fdlibm/s_tan.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/s_tanh.obj: external/fdlibm/s_tanh.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_acos.obj: external/fdlibm/w_acos.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_acosh.obj: external/fdlibm/w_acosh.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_asin.obj: external/fdlibm/w_asin.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_atan2.obj: external/fdlibm/w_atan2.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_atanh.obj: external/fdlibm/w_atanh.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_cosh.obj: external/fdlibm/w_cosh.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_exp.obj: external/fdlibm/w_exp.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_fmod.obj: external/fdlibm/w_fmod.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_gamma.obj: external/fdlibm/w_gamma.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_gamma_r.obj: external/fdlibm/w_gamma_r.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_hypot.obj: external/fdlibm/w_hypot.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_j0.obj: external/fdlibm/w_j0.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_j1.obj: external/fdlibm/w_j1.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_jn.obj: external/fdlibm/w_jn.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_lgamma.obj: external/fdlibm/w_lgamma.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_lgamma_r.obj: external/fdlibm/w_lgamma_r.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_log.obj: external/fdlibm/w_log.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_log10.obj: external/fdlibm/w_log10.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_pow.obj: external/fdlibm/w_pow.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_remainder.obj: external/fdlibm/w_remainder.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_scalb.obj: external/fdlibm/w_scalb.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_sinh.obj: external/fdlibm/w_sinh.c
$(CC) $(CFLAGS) -fo=$@ $<
external/fdlibm/w_sqrt.obj: external/fdlibm/w_sqrt.c
$(CC) $(CFLAGS) -fo=$@ $<
src/backend/gdi.obj: src/backend/gdi.c
$(CC) $(CFLAGS) -fo=$@ $<

96
external/fdlibm/e_acos.c vendored Normal file
View File

@@ -0,0 +1,96 @@
/* @(#)e_acos.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __fdlibm_acos(x)
* Method :
* acos(x) = pi/2 - asin(x)
* acos(-x) = pi/2 + asin(x)
* For |x|<=0.5
* acos(x) = pi/2 - (x + x*x^2*R(x^2)) (see asin.c)
* For x>0.5
* acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2)))
* = 2asin(sqrt((1-x)/2))
* = 2s + 2s*z*R(z) ...z=(1-x)/2, s=sqrt(z)
* = 2f + (2c + 2s*z*R(z))
* where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term
* for f so that f+c ~ sqrt(z).
* For x<-0.5
* acos(x) = pi - 2asin(sqrt((1-|x|)/2))
* = pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z)
*
* Special cases:
* if x is NaN, return x itself;
* if |x|>1, return NaN with invalid signal.
*
* Function needed: sqrt
*/
#include "math.h"
static const double
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */
pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
double __fdlibm_acos(double x) {
double z, p, q, r, w, s, c, df;
int hx, ix;
hx = __HI(x);
ix = hx & 0x7fffffff;
if(ix >= 0x3ff00000) { /* |x| >= 1 */
if(((ix - 0x3ff00000) | __LO(x)) == 0) { /* |x|==1 */
if(hx > 0) return 0.0; /* acos(1) = 0 */
else
return pi + 2.0 * pio2_lo; /* acos(-1)= pi */
}
return (x - x) / (x - x); /* acos(|x|>1) is NaN */
}
if(ix < 0x3fe00000) { /* |x| < 0.5 */
if(ix <= 0x3c600000) return pio2_hi + pio2_lo; /*if|x|<2**-57*/
z = x * x;
p = z * (pS0 + z * (pS1 + z * (pS2 + z * (pS3 + z * (pS4 + z * pS5)))));
q = one + z * (qS1 + z * (qS2 + z * (qS3 + z * qS4)));
r = p / q;
return pio2_hi - (x - (pio2_lo - x * r));
} else if(hx < 0) { /* x < -0.5 */
z = (one + x) * 0.5;
p = z * (pS0 + z * (pS1 + z * (pS2 + z * (pS3 + z * (pS4 + z * pS5)))));
q = one + z * (qS1 + z * (qS2 + z * (qS3 + z * qS4)));
s = sqrt(z);
r = p / q;
w = r * s - pio2_lo;
return pi - 2.0 * (s + w);
} else { /* x > 0.5 */
z = (one - x) * 0.5;
s = sqrt(z);
df = s;
__LO(df) = 0;
c = (z - df * df) / (s + df);
p = z * (pS0 + z * (pS1 + z * (pS2 + z * (pS3 + z * (pS4 + z * pS5)))));
q = one + z * (qS1 + z * (qS2 + z * (qS3 + z * qS4)));
r = p / q;
w = r * s + c;
return 2.0 * (df + w);
}
}

55
external/fdlibm/e_acosh.c vendored Normal file
View File

@@ -0,0 +1,55 @@
/* @(#)e_acosh.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* __fdlibm_acosh(x)
* Method :
* Based on
* acosh(x) = log [ x + sqrt(x*x-1) ]
* we have
* acosh(x) := log(x)+ln2, if x is large; else
* acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else
* acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
*
* Special cases:
* acosh(x) is NaN with signal if x<1.
* acosh(NaN) is NaN without signal.
*/
#include "math.h"
static const double
one = 1.0,
ln2 = 6.93147180559945286227e-01; /* 0x3FE62E42, 0xFEFA39EF */
double __fdlibm_acosh(double x) {
double t;
int hx;
hx = __HI(x);
if(hx < 0x3ff00000) { /* x < 1 */
return (x - x) / (x - x);
} else if(hx >= 0x41b00000) { /* x > 2**28 */
if(hx >= 0x7ff00000) { /* x is inf of NaN */
return x + x;
} else
return __fdlibm_log(x) + ln2; /* acosh(hugev)=log(2x) */
} else if(((hx - 0x3ff00000) | __LO(x)) == 0) {
return 0.0; /* acosh(1) = 0 */
} else if(hx > 0x40000000) { /* 2**28 > x > 2 */
t = x * x;
return __fdlibm_log(2.0 * x - one / (x + sqrt(t - one)));
} else { /* 1<x<2 */
t = x - one;
return log1p(t + sqrt(2.0 * t + t * t));
}
}

105
external/fdlibm/e_asin.c vendored Normal file
View File

@@ -0,0 +1,105 @@
/* @(#)e_asin.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __fdlibm_asin(x)
* Method :
* Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
* we approximate asin(x) on [0,0.5] by
* asin(x) = x + x*x^2*R(x^2)
* where
* R(x^2) is a rational approximation of (asin(x)-x)/x^3
* and its remez error is bounded by
* |(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75)
*
* For x in [0.5,1]
* asin(x) = pi/2-2*asin(sqrt((1-x)/2))
* Let y = (1-x), z = y/2, s := sqrt(z), and pio2_hi+pio2_lo=pi/2;
* then for x>0.98
* asin(x) = pi/2 - 2*(s+s*z*R(z))
* = pio2_hi - (2*(s+s*z*R(z)) - pio2_lo)
* For x<=0.98, let pio4_hi = pio2_hi/2, then
* f = hi part of s;
* c = sqrt(z) - f = (z-f*f)/(s+f) ...f+c=sqrt(z)
* and
* asin(x) = pi/2 - 2*(s+s*z*R(z))
* = pio4_hi+(pio4-2s)-(2s*z*R(z)-pio2_lo)
* = pio4_hi+(pio4-2f)-(2s*z*R(z)-(pio2_lo+2c))
*
* Special cases:
* if x is NaN, return x itself;
* if |x|>1, return NaN with invalid signal.
*
*/
#include "math.h"
static const double
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
hugev = 1.000e+300,
pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
pio4_hi = 7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */
/* coefficient for R(x^2) */
pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
double __fdlibm_asin(double x) {
double t, w, p, q, c, r, s;
int hx, ix;
hx = __HI(x);
ix = hx & 0x7fffffff;
if(ix >= 0x3ff00000) { /* |x|>= 1 */
if(((ix - 0x3ff00000) | __LO(x)) == 0)
/* asin(1)=+-pi/2 with inexact */
return x * pio2_hi + x * pio2_lo;
return (x - x) / (x - x); /* asin(|x|>1) is NaN */
} else if(ix < 0x3fe00000) { /* |x|<0.5 */
if(ix < 0x3e400000) { /* if |x| < 2**-27 */
if(hugev + x > one) return x; /* return x with inexact if x!=0*/
} else
t = x * x;
p = t * (pS0 + t * (pS1 + t * (pS2 + t * (pS3 + t * (pS4 + t * pS5)))));
q = one + t * (qS1 + t * (qS2 + t * (qS3 + t * qS4)));
w = p / q;
return x + x * w;
}
/* 1> |x|>= 0.5 */
w = one - fabs(x);
t = w * 0.5;
p = t * (pS0 + t * (pS1 + t * (pS2 + t * (pS3 + t * (pS4 + t * pS5)))));
q = one + t * (qS1 + t * (qS2 + t * (qS3 + t * qS4)));
s = sqrt(t);
if(ix >= 0x3FEF3333) { /* if |x| > 0.975 */
w = p / q;
t = pio2_hi - (2.0 * (s + s * w) - pio2_lo);
} else {
w = s;
__LO(w) = 0;
c = (t - w * w) / (s + w);
r = p / q;
p = 2.0 * s * r - (pio2_lo - 2.0 * c);
q = pio4_hi - 2.0 * w;
t = pio4_hi - (p - q);
}
if(hx > 0) return t;
else
return -t;
}

131
external/fdlibm/e_atan2.c vendored Normal file
View File

@@ -0,0 +1,131 @@
/* @(#)e_atan2.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* __fdlibm_atan2(y,x)
* Method :
* 1. Reduce y to positive by atan2(y,x)=-atan2(-y,x).
* 2. Reduce x to positive by (if x and y are unexceptional):
* ARG (x+iy) = arctan(y/x) ... if x > 0,
* ARG (x+iy) = pi - arctan[y/(-x)] ... if x < 0,
*
* Special cases:
*
* ATAN2((anything), NaN ) is NaN;
* ATAN2(NAN , (anything) ) is NaN;
* ATAN2(+-0, +(anything but NaN)) is +-0 ;
* ATAN2(+-0, -(anything but NaN)) is +-pi ;
* ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2;
* ATAN2(+-(anything but INF and NaN), +INF) is +-0 ;
* ATAN2(+-(anything but INF and NaN), -INF) is +-pi;
* ATAN2(+-INF,+INF ) is +-pi/4 ;
* ATAN2(+-INF,-INF ) is +-3pi/4;
* ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2;
*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "math.h"
static const double
tinyv = 1.0e-300,
zero = 0.0,
pi_o_4 = 7.8539816339744827900E-01, /* 0x3FE921FB, 0x54442D18 */
pi_o_2 = 1.5707963267948965580E+00, /* 0x3FF921FB, 0x54442D18 */
pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */
pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
double __fdlibm_atan2(double y, double x) {
double z;
int k, m, hx, hy, ix, iy;
unsigned lx, ly;
hx = __HI(x);
ix = hx & 0x7fffffff;
lx = __LO(x);
hy = __HI(y);
iy = hy & 0x7fffffff;
ly = __LO(y);
if(((ix | ((lx | -lx) >> 31)) > 0x7ff00000) ||
((iy | ((ly | -ly) >> 31)) > 0x7ff00000)) /* x or y is NaN */
return x + y;
if((hx - 0x3ff00000 | lx) == 0) return atan(y); /* x=1.0 */
m = ((hy >> 31) & 1) | ((hx >> 30) & 2); /* 2*sign(x)+sign(y) */
/* when y = 0 */
if((iy | ly) == 0) {
switch(m) {
case 0:
case 1:
return y; /* atan(+-0,+anything)=+-0 */
case 2:
return pi + tinyv; /* atan(+0,-anything) = pi */
case 3:
return -pi - tinyv; /* atan(-0,-anything) =-pi */
}
}
/* when x = 0 */
if((ix | lx) == 0) return (hy < 0) ? -pi_o_2 - tinyv : pi_o_2 + tinyv;
/* when x is INF */
if(ix == 0x7ff00000) {
if(iy == 0x7ff00000) {
switch(m) {
case 0:
return pi_o_4 + tinyv; /* atan(+INF,+INF) */
case 1:
return -pi_o_4 - tinyv; /* atan(-INF,+INF) */
case 2:
return 3.0 * pi_o_4 + tinyv; /*atan(+INF,-INF)*/
case 3:
return -3.0 * pi_o_4 - tinyv; /*atan(-INF,-INF)*/
}
} else {
switch(m) {
case 0:
return zero; /* atan(+...,+INF) */
case 1:
return -zero; /* atan(-...,+INF) */
case 2:
return pi + tinyv; /* atan(+...,-INF) */
case 3:
return -pi - tinyv; /* atan(-...,-INF) */
}
}
}
/* when y is INF */
if(iy == 0x7ff00000) return (hy < 0) ? -pi_o_2 - tinyv : pi_o_2 + tinyv;
/* compute y/x */
k = (iy - ix) >> 20;
if(k > 60) z = pi_o_2 + 0.5 * pi_lo; /* |y/x| > 2**60 */
else if(hx < 0 && k < -60)
z = 0.0; /* |y|/x < -2**60 */
else
z = atan(fabs(y / x)); /* safe to do y/x */
switch(m) {
case 0:
return z; /* atan(+,+) */
case 1:
__HI(z) ^= 0x80000000;
return z; /* atan(-,+) */
case 2:
return pi - (z - pi_lo); /* atan(+,-) */
default: /* case 3 */
return (z - pi_lo) - pi; /* atan(-,-) */
}
}

60
external/fdlibm/e_atanh.c vendored Normal file
View File

@@ -0,0 +1,60 @@
/* @(#)e_atanh.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* __fdlibm_atanh(x)
* Method :
* 1.Reduced x to positive by atanh(-x) = -atanh(x)
* 2.For x>=0.5
* 1 2x x
* atanh(x) = --- * log(1 + -------) = 0.5 * log1p(2 * --------)
* 2 1 - x 1 - x
*
* For x<0.5
* atanh(x) = 0.5*log1p(2x+2x*x/(1-x))
*
* Special cases:
* atanh(x) is NaN if |x| > 1 with signal;
* atanh(NaN) is that NaN with no signal;
* atanh(+-1) is +-INF with signal.
*
*/
#include "math.h"
static const double one = 1.0, hugev = 1e300;
static double zero = 0.0;
double __fdlibm_atanh(double x) {
double t;
int hx, ix;
unsigned lx;
hx = __HI(x); /* high word */
lx = __LO(x); /* low word */
ix = hx & 0x7fffffff;
if((ix | ((lx | (-lx)) >> 31)) > 0x3ff00000) /* |x|>1 */
return (x - x) / (x - x);
if(ix == 0x3ff00000)
return x / zero;
if(ix < 0x3e300000 && (hugev + x) > zero) return x; /* x<2**-28 */
__HI(x) = ix; /* x <- |x| */
if(ix < 0x3fe00000) { /* x < 0.5 */
t = x + x;
t = 0.5 * log1p(t + t * x / (one - x));
} else
t = 0.5 * log1p((x + x) / (one - x));
if(hx >= 0) return t;
else
return -t;
}

79
external/fdlibm/e_cosh.c vendored Normal file
View File

@@ -0,0 +1,79 @@
/* @(#)e_cosh.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __fdlibm_cosh(x)
* Method :
* mathematically cosh(x) if defined to be (exp(x)+exp(-x))/2
* 1. Replace x by |x| (cosh(x) = cosh(-x)).
* 2.
* [ exp(x) - 1 ]^2
* 0 <= x <= ln2/2 : cosh(x) := 1 + -------------------
* 2*exp(x)
*
* exp(x) + 1/exp(x)
* ln2/2 <= x <= 22 : cosh(x) := -------------------
* 2
* 22 <= x <= lnovft : cosh(x) := exp(x)/2
* lnovft <= x <= ln2ovft: cosh(x) := exp(x/2)/2 * exp(x/2)
* ln2ovft < x : cosh(x) := hugev*hugev (overflow)
*
* Special cases:
* cosh(x) is |x| if x is +INF, -INF, or NaN.
* only cosh(0)=1 is exact for finite x.
*/
#include "math.h"
static const double one = 1.0, half = 0.5, hugev = 1.0e300;
double __fdlibm_cosh(double x) {
double t, w;
int ix;
unsigned lx;
/* High word of |x|. */
ix = __HI(x);
ix &= 0x7fffffff;
/* x is INF or NaN */
if(ix >= 0x7ff00000) return x * x;
/* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */
if(ix < 0x3fd62e43) {
t = expm1(fabs(x));
w = one + t;
if(ix < 0x3c800000) return w; /* cosh(tinyv) = 1 */
return one + (t * t) / (w + w);
}
/* |x| in [0.5*ln2,22], return (exp(|x|)+1/exp(|x|)/2; */
if(ix < 0x40360000) {
t = __fdlibm_exp(fabs(x));
return half * t + half / t;
}
/* |x| in [22, log(maxdouble)] return half*exp(|x|) */
if(ix < 0x40862E42) return half * __fdlibm_exp(fabs(x));
/* |x| in [log(maxdouble), overflowthresold] */
lx = *((((*(unsigned*)&one) >> 29)) + (unsigned*)&x);
if(ix < 0x408633CE ||
(ix == 0x408633ce) && (lx <= (unsigned)0x8fb9f87d)) {
w = __fdlibm_exp(half * fabs(x));
t = half * w;
return t * w;
}
/* |x| > overflowthresold, cosh(x) overflow */
return hugev * hugev;
}

155
external/fdlibm/e_exp.c vendored Normal file
View File

@@ -0,0 +1,155 @@
/* @(#)e_exp.c 1.6 04/04/22 */
/*
* ====================================================
* Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
*
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __fdlibm_exp(x)
* Returns the exponential of x.
*
* Method
* 1. Argument reduction:
* Reduce x to an r so that |r| <= 0.5*ln2 ~ 0.34658.
* Given x, find r and integer k such that
*
* x = k*ln2 + r, |r| <= 0.5*ln2.
*
* Here r will be represented as r = hi-lo for better
* accuracy.
*
* 2. Approximation of exp(r) by a special rational function on
* the interval [0,0.34658]:
* Write
* R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ...
* We use a special Remes algorithm on [0,0.34658] to generate
* a polynomial of degree 5 to approximate R. The maximum error
* of this polynomial approximation is bounded by 2**-59. In
* other words,
* R(z) ~ 2.0 + P1*z + P2*z**2 + P3*z**3 + P4*z**4 + P5*z**5
* (where z=r*r, and the values of P1 to P5 are listed below)
* and
* | 5 | -59
* | 2.0+P1*z+...+P5*z - R(z) | <= 2
* | |
* The computation of exp(r) thus becomes
* 2*r
* exp(r) = 1 + -------
* R - r
* r*R1(r)
* = 1 + r + ----------- (for better accuracy)
* 2 - R1(r)
* where
* 2 4 10
* R1(r) = r - (P1*r + P2*r + ... + P5*r ).
*
* 3. Scale back to obtain exp(x):
* From step 1, we have
* exp(x) = 2^k * exp(r)
*
* Special cases:
* exp(INF) is INF, exp(NaN) is NaN;
* exp(-INF) is 0, and
* for finite argument, only exp(0)=1 is exact.
*
* Accuracy:
* according to an error analysis, the error is always less than
* 1 ulp (unit in the last place).
*
* Misc. info.
* For IEEE double
* if x > 7.09782712893383973096e+02 then exp(x) overflow
* if x < -7.45133219101941108420e+02 then exp(x) underflow
*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "math.h"
static const double
one = 1.0,
halF[2] = {
0.5,
-0.5,
},
hugev = 1.0e+300, twom1000 = 9.33263618503218878990e-302, /* 2**-1000=0x01700000,0*/
o_threshold = 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */
u_threshold = -7.45133219101941108420e+02, /* 0xc0874910, 0xD52D3051 */
ln2HI[2] = {
6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */
-6.93147180369123816490e-01,
}, /* 0xbfe62e42, 0xfee00000 */
ln2LO[2] = {
1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */
-1.90821492927058770002e-10,
}, /* 0xbdea39ef, 0x35793c76 */
invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */
P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */
P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
P5 = 4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */
double __fdlibm_exp(double x) /* default IEEE double exp */
{
double y, hi, lo, c, t;
int k, xsb;
unsigned hx;
hx = __HI(x); /* high word of x */
xsb = (hx >> 31) & 1; /* sign bit of x */
hx &= 0x7fffffff; /* high word of |x| */
/* filter out non-finite argument */
if(hx >= 0x40862E42) { /* if |x|>=709.78... */
if(hx >= 0x7ff00000) {
if(((hx & 0xfffff) | __LO(x)) != 0)
return x + x; /* NaN */
else
return (xsb == 0) ? x : 0.0; /* exp(+-inf)={inf,0} */
}
if(x > o_threshold) return hugev * hugev; /* overflow */
if(x < u_threshold) return twom1000 * twom1000; /* underflow */
}
/* argument reduction */
if(hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */
if(hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */
hi = x - ln2HI[xsb];
lo = ln2LO[xsb];
k = 1 - xsb - xsb;
} else {
k = (int)(invln2 * x + halF[xsb]);
t = k;
hi = x - t * ln2HI[0]; /* t*ln2HI is exact here */
lo = t * ln2LO[0];
}
x = hi - lo;
} else if(hx < 0x3e300000) { /* when |x|<2**-28 */
if(hugev + x > one) return one + x; /* trigger inexact */
} else
k = 0;
/* x is now in primary range */
t = x * x;
c = x - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));
if(k == 0) return one - ((x * c) / (c - 2.0) - x);
else
y = one - ((lo - (x * c) / (2.0 - c)) - hi);
if(k >= -1021) {
__HI(y) += (k << 20); /* add k to y's exponent */
return y;
} else {
__HI(y) += ((k + 1000) << 20); /* add k to y's exponent */
return y * twom1000;
}
}

148
external/fdlibm/e_fmod.c vendored Normal file
View File

@@ -0,0 +1,148 @@
/* @(#)e_fmod.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* __fdlibm_fmod(x,y)
* Return x mod y in exact arithmetic
* Method: shift and subtract
*/
#include "math.h"
static const double one = 1.0, Zero[] = {
0.0,
-0.0,
};
double __fdlibm_fmod(double x, double y) {
int n, hx, hy, hz, ix, iy, sx, i;
unsigned lx, ly, lz;
hx = __HI(x); /* high word of x */
lx = __LO(x); /* low word of x */
hy = __HI(y); /* high word of y */
ly = __LO(y); /* low word of y */
sx = hx & 0x80000000; /* sign of x */
hx ^= sx; /* |x| */
hy &= 0x7fffffff; /* |y| */
/* purge off exception values */
if((hy | ly) == 0 || (hx >= 0x7ff00000) || /* y=0,or x not finite */
((hy | ((ly | -ly) >> 31)) > 0x7ff00000)) /* or y is NaN */
return (x * y) / (x * y);
if(hx <= hy) {
if((hx < hy) || (lx < ly)) return x; /* |x|<|y| return x */
if(lx == ly)
return Zero[(unsigned)sx >> 31]; /* |x|=|y| return x*0*/
}
/* determine ix = ilogb(x) */
if(hx < 0x00100000) { /* subnormal x */
if(hx == 0) {
for(ix = -1043, i = lx; i > 0; i <<= 1) ix -= 1;
} else {
for(ix = -1022, i = (hx << 11); i > 0; i <<= 1) ix -= 1;
}
} else
ix = (hx >> 20) - 1023;
/* determine iy = ilogb(y) */
if(hy < 0x00100000) { /* subnormal y */
if(hy == 0) {
for(iy = -1043, i = ly; i > 0; i <<= 1) iy -= 1;
} else {
for(iy = -1022, i = (hy << 11); i > 0; i <<= 1) iy -= 1;
}
} else
iy = (hy >> 20) - 1023;
/* set up {hx,lx}, {hy,ly} and align y to x */
if(ix >= -1022)
hx = 0x00100000 | (0x000fffff & hx);
else { /* subnormal x, shift x to normal */
n = -1022 - ix;
if(n <= 31) {
hx = (hx << n) | (lx >> (32 - n));
lx <<= n;
} else {
hx = lx << (n - 32);
lx = 0;
}
}
if(iy >= -1022)
hy = 0x00100000 | (0x000fffff & hy);
else { /* subnormal y, shift y to normal */
n = -1022 - iy;
if(n <= 31) {
hy = (hy << n) | (ly >> (32 - n));
ly <<= n;
} else {
hy = ly << (n - 32);
ly = 0;
}
}
/* fix point fmod */
n = ix - iy;
while(n--) {
hz = hx - hy;
lz = lx - ly;
if(lx < ly) hz -= 1;
if(hz < 0) {
hx = hx + hx + (lx >> 31);
lx = lx + lx;
} else {
if((hz | lz) == 0) /* return sign(x)*0 */
return Zero[(unsigned)sx >> 31];
hx = hz + hz + (lz >> 31);
lx = lz + lz;
}
}
hz = hx - hy;
lz = lx - ly;
if(lx < ly) hz -= 1;
if(hz >= 0) {
hx = hz;
lx = lz;
}
/* convert back to floating value and restore the sign */
if((hx | lx) == 0) /* return sign(x)*0 */
return Zero[(unsigned)sx >> 31];
while(hx < 0x00100000) { /* normalize x */
hx = hx + hx + (lx >> 31);
lx = lx + lx;
iy -= 1;
}
if(iy >= -1022) { /* normalize output */
hx = ((hx - 0x00100000) | ((iy + 1023) << 20));
__HI(x) = hx | sx;
__LO(x) = lx;
} else { /* subnormal output */
n = -1022 - iy;
if(n <= 20) {
lx = (lx >> n) | ((unsigned)hx << (32 - n));
hx >>= n;
} else if(n <= 31) {
lx = (hx << (32 - n)) | (lx >> n);
hx = sx;
} else {
lx = hx >> (n - 32);
hx = sx;
}
__HI(x) = hx | sx;
__LO(x) = lx;
x *= one; /* create necessary signal */
}
return x; /* exact output */
}

27
external/fdlibm/e_gamma.c vendored Normal file
View File

@@ -0,0 +1,27 @@
/* @(#)e_gamma.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* __fdlibm_gamma(x)
* Return the logarithm of the Gamma function of x.
*
* Method: call __fdlibm_gamma_r
*/
#include "math.h"
extern int signgam;
double __fdlibm_gamma(double x) {
return __fdlibm_gamma_r(x, &signgam);
}

26
external/fdlibm/e_gamma_r.c vendored Normal file
View File

@@ -0,0 +1,26 @@
/* @(#)e_gamma_r.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* __fdlibm_gamma_r(x, signgamp)
* Reentrant version of the logarithm of the Gamma function
* with user provide pointer for the sign of Gamma(x).
*
* Method: See __fdlibm_lgamma_r
*/
#include "math.h"
double __fdlibm_gamma_r(double x, int* signgamp) {
return __fdlibm_lgamma_r(x, signgamp);
}

123
external/fdlibm/e_hypot.c vendored Normal file
View File

@@ -0,0 +1,123 @@
/* @(#)e_hypot.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __math.hypot(x,y)
*
* Method :
* If (assume round-to-nearest) z=x*x+y*y
* has error less than sqrt(2)/2 ulp, than
* sqrt(z) has error less than 1 ulp (exercise).
*
* So, compute sqrt(x*x+y*y) with some care as
* follows to get the error below 1 ulp:
*
* Assume x>y>0;
* (if possible, set rounding to round-to-nearest)
* 1. if x > 2y use
* x1*x1+(y*y+(x2*(x+x1))) for x*x+y*y
* where x1 = x with lower 32 bits cleared, x2 = x-x1; else
* 2. if x <= 2y use
* t1*y1+((x-y)*(x-y)+(t1*y2+t2*y))
* where t1 = 2x with lower 32 bits cleared, t2 = 2x-t1,
* y1= y with lower 32 bits chopped, y2 = y-y1.
*
* NOTE: scaling may be necessary if some argument is too
* large or too tinyv
*
* Special cases:
* hypot(x,y) is INF if x or y is +INF or -INF; else
* hypot(x,y) is NAN if x or y is NAN.
*
* Accuracy:
* hypot(x,y) returns sqrt(x^2+y^2) with error less
* than 1 ulps (units in the last place)
*/
#include "math.h"
double __fdlibm_hypot(double x, double y) {
double a = x, b = y, t1, t2, y1, y2, w;
int j, k, ha, hb;
ha = __HI(x) & 0x7fffffff; /* high word of x */
hb = __HI(y) & 0x7fffffff; /* high word of y */
if(hb > ha) {
a = y;
b = x;
j = ha;
ha = hb;
hb = j;
} else {
a = x;
b = y;
}
__HI(a) = ha; /* a <- |a| */
__HI(b) = hb; /* b <- |b| */
if((ha - hb) > 0x3c00000) {
return a + b;
} /* x/y > 2**60 */
k = 0;
if(ha > 0x5f300000) { /* a>2**500 */
if(ha >= 0x7ff00000) { /* Inf or NaN */
w = a + b; /* for sNaN */
if(((ha & 0xfffff) | __LO(a)) == 0) w = a;
if(((hb ^ 0x7ff00000) | __LO(b)) == 0) w = b;
return w;
}
/* scale a and b by 2**-600 */
ha -= 0x25800000;
hb -= 0x25800000;
k += 600;
__HI(a) = ha;
__HI(b) = hb;
}
if(hb < 0x20b00000) { /* b < 2**-500 */
if(hb <= 0x000fffff) { /* subnormal b or 0 */
if((hb | (__LO(b))) == 0) return a;
t1 = 0;
__HI(t1) = 0x7fd00000; /* t1=2^1022 */
b *= t1;
a *= t1;
k -= 1022;
} else { /* scale a and b by 2^600 */
ha += 0x25800000; /* a *= 2^600 */
hb += 0x25800000; /* b *= 2^600 */
k -= 600;
__HI(a) = ha;
__HI(b) = hb;
}
}
/* medium size a and b */
w = a - b;
if(w > b) {
t1 = 0;
__HI(t1) = ha;
t2 = a - t1;
w = sqrt(t1 * t1 - (b * (-b) - t2 * (a + t1)));
} else {
a = a + a;
y1 = 0;
__HI(y1) = hb;
y2 = b - y1;
t1 = 0;
__HI(t1) = ha + 0x00100000;
t2 = a - t1;
w = sqrt(t1 * y1 - (w * (-w) - (t1 * y2 + t2 * b)));
}
if(k != 0) {
t1 = 1.0;
__HI(t1) += (k << 20);
return t1 * w;
} else
return w;
}

400
external/fdlibm/e_j0.c vendored Normal file
View File

@@ -0,0 +1,400 @@
/* @(#)e_j0.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __fdlibm_j0(x), __fdlibm_y0(x)
* Bessel function of the first and second kinds of order zero.
* Method -- j0(x):
* 1. For tinyv x, we use j0(x) = 1 - x^2/4 + x^4/64 - ...
* 2. Reduce x to |x| since j0(x)=j0(-x), and
* for x in (0,2)
* j0(x) = 1-z/4+ z^2*R0/S0, where z = x*x;
* (precision: |j0-1+z/4-z^2R0/S0 |<2**-63.67 )
* for x in (2,inf)
* j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0))
* where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
* as follow:
* cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
* = 1/sqrt(2) * (cos(x) + sin(x))
* sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4)
* = 1/sqrt(2) * (sin(x) - cos(x))
* (To avoid cancellation, use
* sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
* to compute the worse one.)
*
* 3 Special cases
* j0(nan)= nan
* j0(0) = 1
* j0(inf) = 0
*
* Method -- y0(x):
* 1. For x<2.
* Since
* y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x^2/4 - ...)
* therefore y0(x)-2/pi*j0(x)*ln(x) is an even function.
* We use the following function to approximate y0,
* y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x^2
* where
* U(z) = u00 + u01*z + ... + u06*z^6
* V(z) = 1 + v01*z + ... + v04*z^4
* with absolute approximation error bounded by 2**-72.
* Note: For tinyv x, U/V = u0 and j0(x)~1, hence
* y0(tinyv) = u0 + (2/pi)*ln(tinyv), (choose tinyv<2**-27)
* 2. For x>=2.
* y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0))
* where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
* by the method mentioned above.
* 3. Special cases: y0(0)=-inf, y0(x<0)=NaN, y0(inf)=0.
*/
#include "math.h"
static double pzero(double), qzero(double);
static const double
hugev = 1e300,
one = 1.0,
invsqrtpi = 5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */
tpi = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
/* R0/S0 on [0, 2.00] */
R02 = 1.56249999999999947958e-02, /* 0x3F8FFFFF, 0xFFFFFFFD */
R03 = -1.89979294238854721751e-04, /* 0xBF28E6A5, 0xB61AC6E9 */
R04 = 1.82954049532700665670e-06, /* 0x3EBEB1D1, 0x0C503919 */
R05 = -4.61832688532103189199e-09, /* 0xBE33D5E7, 0x73D63FCE */
S01 = 1.56191029464890010492e-02, /* 0x3F8FFCE8, 0x82C8C2A4 */
S02 = 1.16926784663337450260e-04, /* 0x3F1EA6D2, 0xDD57DBF4 */
S03 = 5.13546550207318111446e-07, /* 0x3EA13B54, 0xCE84D5A9 */
S04 = 1.16614003333790000205e-09; /* 0x3E1408BC, 0xF4745D8F */
static double zero = 0.0;
double __fdlibm_j0(double x) {
double z, s, c, ss, cc, r, u, v;
int hx, ix;
hx = __HI(x);
ix = hx & 0x7fffffff;
if(ix >= 0x7ff00000) return one / (x * x);
x = fabs(x);
if(ix >= 0x40000000) { /* |x| >= 2.0 */
s = sin(x);
c = cos(x);
ss = s - c;
cc = s + c;
if(ix < 0x7fe00000) { /* make sure x+x not overflow */
z = -cos(x + x);
if((s * c) < zero) cc = z / ss;
else
ss = z / cc;
}
/*
* j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
* y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
*/
if(ix > 0x48000000) z = (invsqrtpi * cc) / sqrt(x);
else {
u = pzero(x);
v = qzero(x);
z = invsqrtpi * (u * cc - v * ss) / sqrt(x);
}
return z;
}
if(ix < 0x3f200000) { /* |x| < 2**-13 */
if(hugev + x > one) { /* raise inexact if x != 0 */
if(ix < 0x3e400000) return one; /* |x|<2**-27 */
else
return one - 0.25 * x * x;
}
}
z = x * x;
r = z * (R02 + z * (R03 + z * (R04 + z * R05)));
s = one + z * (S01 + z * (S02 + z * (S03 + z * S04)));
if(ix < 0x3FF00000) { /* |x| < 1.00 */
return one + z * (-0.25 + (r / s));
} else {
u = 0.5 * x;
return ((one + u) * (one - u) + z * (r / s));
}
}
static const double
u00 = -7.38042951086872317523e-02, /* 0xBFB2E4D6, 0x99CBD01F */
u01 = 1.76666452509181115538e-01, /* 0x3FC69D01, 0x9DE9E3FC */
u02 = -1.38185671945596898896e-02, /* 0xBF8C4CE8, 0xB16CFA97 */
u03 = 3.47453432093683650238e-04, /* 0x3F36C54D, 0x20B29B6B */
u04 = -3.81407053724364161125e-06, /* 0xBECFFEA7, 0x73D25CAD */
u05 = 1.95590137035022920206e-08, /* 0x3E550057, 0x3B4EABD4 */
u06 = -3.98205194132103398453e-11, /* 0xBDC5E43D, 0x693FB3C8 */
v01 = 1.27304834834123699328e-02, /* 0x3F8A1270, 0x91C9C71A */
v02 = 7.60068627350353253702e-05, /* 0x3F13ECBB, 0xF578C6C1 */
v03 = 2.59150851840457805467e-07, /* 0x3E91642D, 0x7FF202FD */
v04 = 4.41110311332675467403e-10; /* 0x3DFE5018, 0x3BD6D9EF */
double __fdlibm_y0(double x) {
double z, s, c, ss, cc, u, v;
int hx, ix, lx;
hx = __HI(x);
ix = 0x7fffffff & hx;
lx = __LO(x);
/* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0 */
if(ix >= 0x7ff00000) return one / (x + x * x);
if((ix | lx) == 0) return -one / zero;
if(hx < 0) return zero / zero;
if(ix >= 0x40000000) { /* |x| >= 2.0 */
/* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
* where x0 = x-pi/4
* Better formula:
* cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
* = 1/sqrt(2) * (sin(x) + cos(x))
* sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
* = 1/sqrt(2) * (sin(x) - cos(x))
* To avoid cancellation, use
* sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
* to compute the worse one.
*/
s = sin(x);
c = cos(x);
ss = s - c;
cc = s + c;
/*
* j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
* y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
*/
if(ix < 0x7fe00000) { /* make sure x+x not overflow */
z = -cos(x + x);
if((s * c) < zero) cc = z / ss;
else
ss = z / cc;
}
if(ix > 0x48000000) z = (invsqrtpi * ss) / sqrt(x);
else {
u = pzero(x);
v = qzero(x);
z = invsqrtpi * (u * ss + v * cc) / sqrt(x);
}
return z;
}
if(ix <= 0x3e400000) { /* x < 2**-27 */
return (u00 + tpi * __fdlibm_log(x));
}
z = x * x;
u = u00 + z * (u01 + z * (u02 + z * (u03 + z * (u04 + z * (u05 + z * u06)))));
v = one + z * (v01 + z * (v02 + z * (v03 + z * v04)));
return (u / v + tpi * (__fdlibm_j0(x) * __fdlibm_log(x)));
}
/* The asymptotic expansions of pzero is
* 1 - 9/128 s^2 + 11025/98304 s^4 - ..., where s = 1/x.
* For x >= 2, We approximate pzero by
* pzero(x) = 1 + (R/S)
* where R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10
* S = 1 + pS0*s^2 + ... + pS4*s^10
* and
* | pzero(x)-1-R/S | <= 2 ** ( -60.26)
*/
static const double pR8[6] = {
/* for x in [inf, 8]=1/[0,0.125] */
0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
-7.03124999999900357484e-02, /* 0xBFB1FFFF, 0xFFFFFD32 */
-8.08167041275349795626e+00, /* 0xC02029D0, 0xB44FA779 */
-2.57063105679704847262e+02, /* 0xC0701102, 0x7B19E863 */
-2.48521641009428822144e+03, /* 0xC0A36A6E, 0xCD4DCAFC */
-5.25304380490729545272e+03, /* 0xC0B4850B, 0x36CC643D */
};
static const double pS8[5] = {
1.16534364619668181717e+02, /* 0x405D2233, 0x07A96751 */
3.83374475364121826715e+03, /* 0x40ADF37D, 0x50596938 */
4.05978572648472545552e+04, /* 0x40E3D2BB, 0x6EB6B05F */
1.16752972564375915681e+05, /* 0x40FC810F, 0x8F9FA9BD */
4.76277284146730962675e+04, /* 0x40E74177, 0x4F2C49DC */
};
static const double pR5[6] = {
/* for x in [8,4.5454]=1/[0.125,0.22001] */
-1.14125464691894502584e-11, /* 0xBDA918B1, 0x47E495CC */
-7.03124940873599280078e-02, /* 0xBFB1FFFF, 0xE69AFBC6 */
-4.15961064470587782438e+00, /* 0xC010A370, 0xF90C6BBF */
-6.76747652265167261021e+01, /* 0xC050EB2F, 0x5A7D1783 */
-3.31231299649172967747e+02, /* 0xC074B3B3, 0x6742CC63 */
-3.46433388365604912451e+02, /* 0xC075A6EF, 0x28A38BD7 */
};
static const double pS5[5] = {
6.07539382692300335975e+01, /* 0x404E6081, 0x0C98C5DE */
1.05125230595704579173e+03, /* 0x40906D02, 0x5C7E2864 */
5.97897094333855784498e+03, /* 0x40B75AF8, 0x8FBE1D60 */
9.62544514357774460223e+03, /* 0x40C2CCB8, 0xFA76FA38 */
2.40605815922939109441e+03, /* 0x40A2CC1D, 0xC70BE864 */
};
static const double pR3[6] = {
/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
-2.54704601771951915620e-09, /* 0xBE25E103, 0x6FE1AA86 */
-7.03119616381481654654e-02, /* 0xBFB1FFF6, 0xF7C0E24B */
-2.40903221549529611423e+00, /* 0xC00345B2, 0xAEA48074 */
-2.19659774734883086467e+01, /* 0xC035F74A, 0x4CB94E14 */
-5.80791704701737572236e+01, /* 0xC04D0A22, 0x420A1A45 */
-3.14479470594888503854e+01, /* 0xC03F72AC, 0xA892D80F */
};
static const double pS3[5] = {
3.58560338055209726349e+01, /* 0x4041ED92, 0x84077DD3 */
3.61513983050303863820e+02, /* 0x40769839, 0x464A7C0E */
1.19360783792111533330e+03, /* 0x4092A66E, 0x6D1061D6 */
1.12799679856907414432e+03, /* 0x40919FFC, 0xB8C39B7E */
1.73580930813335754692e+02, /* 0x4065B296, 0xFC379081 */
};
static const double pR2[6] = {
/* for x in [2.8570,2]=1/[0.3499,0.5] */
-8.87534333032526411254e-08, /* 0xBE77D316, 0xE927026D */
-7.03030995483624743247e-02, /* 0xBFB1FF62, 0x495E1E42 */
-1.45073846780952986357e+00, /* 0xBFF73639, 0x8A24A843 */
-7.63569613823527770791e+00, /* 0xC01E8AF3, 0xEDAFA7F3 */
-1.11931668860356747786e+01, /* 0xC02662E6, 0xC5246303 */
-3.23364579351335335033e+00, /* 0xC009DE81, 0xAF8FE70F */
};
static const double pS2[5] = {
2.22202997532088808441e+01, /* 0x40363865, 0x908B5959 */
1.36206794218215208048e+02, /* 0x4061069E, 0x0EE8878F */
2.70470278658083486789e+02, /* 0x4070E786, 0x42EA079B */
1.53875394208320329881e+02, /* 0x40633C03, 0x3AB6FAFF */
1.46576176948256193810e+01, /* 0x402D50B3, 0x44391809 */
};
static double pzero(double x) {
const double *p, *q;
double z, r, s;
int ix;
ix = 0x7fffffff & __HI(x);
if(ix >= 0x40200000) {
p = pR8;
q = pS8;
} else if(ix >= 0x40122E8B) {
p = pR5;
q = pS5;
} else if(ix >= 0x4006DB6D) {
p = pR3;
q = pS3;
} else if(ix >= 0x40000000) {
p = pR2;
q = pS2;
}
z = one / (x * x);
r = p[0] + z * (p[1] + z * (p[2] + z * (p[3] + z * (p[4] + z * p[5]))));
s = one + z * (q[0] + z * (q[1] + z * (q[2] + z * (q[3] + z * q[4]))));
return one + r / s;
}
/* For x >= 8, the asymptotic expansions of qzero is
* -1/8 s + 75/1024 s^3 - ..., where s = 1/x.
* We approximate pzero by
* qzero(x) = s*(-1.25 + (R/S))
* where R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10
* S = 1 + qS0*s^2 + ... + qS5*s^12
* and
* | qzero(x)/s +1.25-R/S | <= 2 ** ( -61.22)
*/
static const double qR8[6] = {
/* for x in [inf, 8]=1/[0,0.125] */
0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
7.32421874999935051953e-02, /* 0x3FB2BFFF, 0xFFFFFE2C */
1.17682064682252693899e+01, /* 0x40278952, 0x5BB334D6 */
5.57673380256401856059e+02, /* 0x40816D63, 0x15301825 */
8.85919720756468632317e+03, /* 0x40C14D99, 0x3E18F46D */
3.70146267776887834771e+04, /* 0x40E212D4, 0x0E901566 */
};
static const double qS8[6] = {
1.63776026895689824414e+02, /* 0x406478D5, 0x365B39BC */
8.09834494656449805916e+03, /* 0x40BFA258, 0x4E6B0563 */
1.42538291419120476348e+05, /* 0x41016652, 0x54D38C3F */
8.03309257119514397345e+05, /* 0x412883DA, 0x83A52B43 */
8.40501579819060512818e+05, /* 0x4129A66B, 0x28DE0B3D */
-3.43899293537866615225e+05, /* 0xC114FD6D, 0x2C9530C5 */
};
static const double qR5[6] = {
/* for x in [8,4.5454]=1/[0.125,0.22001] */
1.84085963594515531381e-11, /* 0x3DB43D8F, 0x29CC8CD9 */
7.32421766612684765896e-02, /* 0x3FB2BFFF, 0xD172B04C */
5.83563508962056953777e+00, /* 0x401757B0, 0xB9953DD3 */
1.35111577286449829671e+02, /* 0x4060E392, 0x0A8788E9 */
1.02724376596164097464e+03, /* 0x40900CF9, 0x9DC8C481 */
1.98997785864605384631e+03, /* 0x409F17E9, 0x53C6E3A6 */
};
static const double qS5[6] = {
8.27766102236537761883e+01, /* 0x4054B1B3, 0xFB5E1543 */
2.07781416421392987104e+03, /* 0x40A03BA0, 0xDA21C0CE */
1.88472887785718085070e+04, /* 0x40D267D2, 0x7B591E6D */
5.67511122894947329769e+04, /* 0x40EBB5E3, 0x97E02372 */
3.59767538425114471465e+04, /* 0x40E19118, 0x1F7A54A0 */
-5.35434275601944773371e+03, /* 0xC0B4EA57, 0xBEDBC609 */
};
static const double qR3[6] = {
/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
4.37741014089738620906e-09, /* 0x3E32CD03, 0x6ADECB82 */
7.32411180042911447163e-02, /* 0x3FB2BFEE, 0x0E8D0842 */
3.34423137516170720929e+00, /* 0x400AC0FC, 0x61149CF5 */
4.26218440745412650017e+01, /* 0x40454F98, 0x962DAEDD */
1.70808091340565596283e+02, /* 0x406559DB, 0xE25EFD1F */
1.66733948696651168575e+02, /* 0x4064D77C, 0x81FA21E0 */
};
static const double qS3[6] = {
4.87588729724587182091e+01, /* 0x40486122, 0xBFE343A6 */
7.09689221056606015736e+02, /* 0x40862D83, 0x86544EB3 */
3.70414822620111362994e+03, /* 0x40ACF04B, 0xE44DFC63 */
6.46042516752568917582e+03, /* 0x40B93C6C, 0xD7C76A28 */
2.51633368920368957333e+03, /* 0x40A3A8AA, 0xD94FB1C0 */
-1.49247451836156386662e+02, /* 0xC062A7EB, 0x201CF40F */
};
static const double qR2[6] = {
/* for x in [2.8570,2]=1/[0.3499,0.5] */
1.50444444886983272379e-07, /* 0x3E84313B, 0x54F76BDB */
7.32234265963079278272e-02, /* 0x3FB2BEC5, 0x3E883E34 */
1.99819174093815998816e+00, /* 0x3FFFF897, 0xE727779C */
1.44956029347885735348e+01, /* 0x402CFDBF, 0xAAF96FE5 */
3.16662317504781540833e+01, /* 0x403FAA8E, 0x29FBDC4A */
1.62527075710929267416e+01, /* 0x403040B1, 0x71814BB4 */
};
static const double qS2[6] = {
3.03655848355219184498e+01, /* 0x403E5D96, 0xF7C07AED */
2.69348118608049844624e+02, /* 0x4070D591, 0xE4D14B40 */
8.44783757595320139444e+02, /* 0x408A6645, 0x22B3BF22 */
8.82935845112488550512e+02, /* 0x408B977C, 0x9C5CC214 */
2.12666388511798828631e+02, /* 0x406A9553, 0x0E001365 */
-5.31095493882666946917e+00, /* 0xC0153E6A, 0xF8B32931 */
};
static double qzero(double x) {
const double *p, *q;
double s, r, z;
int ix;
ix = 0x7fffffff & __HI(x);
if(ix >= 0x40200000) {
p = qR8;
q = qS8;
} else if(ix >= 0x40122E8B) {
p = qR5;
q = qS5;
} else if(ix >= 0x4006DB6D) {
p = qR3;
q = qS3;
} else if(ix >= 0x40000000) {
p = qR2;
q = qS2;
}
z = one / (x * x);
r = p[0] + z * (p[1] + z * (p[2] + z * (p[3] + z * (p[4] + z * p[5]))));
s = one + z * (q[0] + z * (q[1] + z * (q[2] + z * (q[3] + z * (q[4] + z * q[5])))));
return (-.125 + r / s) / x;
}

393
external/fdlibm/e_j1.c vendored Normal file
View File

@@ -0,0 +1,393 @@
/* @(#)e_j1.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __fdlibm_j1(x), __fdlibm_y1(x)
* Bessel function of the first and second kinds of order zero.
* Method -- j1(x):
* 1. For tinyv x, we use j1(x) = x/2 - x^3/16 + x^5/384 - ...
* 2. Reduce x to |x| since j1(x)=-j1(-x), and
* for x in (0,2)
* j1(x) = x/2 + x*z*R0/S0, where z = x*x;
* (precision: |j1/x - 1/2 - R0/S0 |<2**-61.51 )
* for x in (2,inf)
* j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1))
* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
* where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
* as follow:
* cos(x1) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
* = 1/sqrt(2) * (sin(x) - cos(x))
* sin(x1) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
* = -1/sqrt(2) * (sin(x) + cos(x))
* (To avoid cancellation, use
* sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
* to compute the worse one.)
*
* 3 Special cases
* j1(nan)= nan
* j1(0) = 0
* j1(inf) = 0
*
* Method -- y1(x):
* 1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN
* 2. For x<2.
* Since
* y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x^3-...)
* therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function.
* We use the following function to approximate y1,
* y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x^2
* where for x in [0,2] (abs err less than 2**-65.89)
* U(z) = U0[0] + U0[1]*z + ... + U0[4]*z^4
* V(z) = 1 + v0[0]*z + ... + v0[4]*z^5
* Note: For tinyv x, 1/x dominate y1 and hence
* y1(tinyv) = -2/pi/tinyv, (choose tinyv<2**-54)
* 3. For x>=2.
* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
* where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
* by method mentioned above.
*/
#include "math.h"
static double pone(double), qone(double);
static const double
hugev = 1e300,
one = 1.0,
invsqrtpi = 5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */
tpi = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
/* R0/S0 on [0,2] */
r00 = -6.25000000000000000000e-02, /* 0xBFB00000, 0x00000000 */
r01 = 1.40705666955189706048e-03, /* 0x3F570D9F, 0x98472C61 */
r02 = -1.59955631084035597520e-05, /* 0xBEF0C5C6, 0xBA169668 */
r03 = 4.96727999609584448412e-08, /* 0x3E6AAAFA, 0x46CA0BD9 */
s01 = 1.91537599538363460805e-02, /* 0x3F939D0B, 0x12637E53 */
s02 = 1.85946785588630915560e-04, /* 0x3F285F56, 0xB9CDF664 */
s03 = 1.17718464042623683263e-06, /* 0x3EB3BFF8, 0x333F8498 */
s04 = 5.04636257076217042715e-09, /* 0x3E35AC88, 0xC97DFF2C */
s05 = 1.23542274426137913908e-11; /* 0x3DAB2ACF, 0xCFB97ED8 */
static double zero = 0.0;
double __fdlibm_j1(double x) {
double z, s, c, ss, cc, r, u, v, y;
int hx, ix;
hx = __HI(x);
ix = hx & 0x7fffffff;
if(ix >= 0x7ff00000) return one / x;
y = fabs(x);
if(ix >= 0x40000000) { /* |x| >= 2.0 */
s = sin(y);
c = cos(y);
ss = -s - c;
cc = s - c;
if(ix < 0x7fe00000) { /* make sure y+y not overflow */
z = cos(y + y);
if((s * c) > zero) cc = z / ss;
else
ss = z / cc;
}
/*
* j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
* y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
*/
if(ix > 0x48000000) z = (invsqrtpi * cc) / sqrt(y);
else {
u = pone(y);
v = qone(y);
z = invsqrtpi * (u * cc - v * ss) / sqrt(y);
}
if(hx < 0) return -z;
else
return z;
}
if(ix < 0x3e400000) { /* |x|<2**-27 */
if(hugev + x > one) return 0.5 * x; /* inexact if x!=0 necessary */
}
z = x * x;
r = z * (r00 + z * (r01 + z * (r02 + z * r03)));
s = one + z * (s01 + z * (s02 + z * (s03 + z * (s04 + z * s05))));
r *= x;
return (x * 0.5 + r / s);
}
static const double U0[5] = {
-1.96057090646238940668e-01, /* 0xBFC91866, 0x143CBC8A */
5.04438716639811282616e-02, /* 0x3FA9D3C7, 0x76292CD1 */
-1.91256895875763547298e-03, /* 0xBF5F55E5, 0x4844F50F */
2.35252600561610495928e-05, /* 0x3EF8AB03, 0x8FA6B88E */
-9.19099158039878874504e-08, /* 0xBE78AC00, 0x569105B8 */
};
static const double V0[5] = {
1.99167318236649903973e-02, /* 0x3F94650D, 0x3F4DA9F0 */
2.02552581025135171496e-04, /* 0x3F2A8C89, 0x6C257764 */
1.35608801097516229404e-06, /* 0x3EB6C05A, 0x894E8CA6 */
6.22741452364621501295e-09, /* 0x3E3ABF1D, 0x5BA69A86 */
1.66559246207992079114e-11, /* 0x3DB25039, 0xDACA772A */
};
double __fdlibm_y1(double x) {
double z, s, c, ss, cc, u, v;
int hx, ix, lx;
hx = __HI(x);
ix = 0x7fffffff & hx;
lx = __LO(x);
/* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */
if(ix >= 0x7ff00000) return one / (x + x * x);
if((ix | lx) == 0) return -one / zero;
if(hx < 0) return zero / zero;
if(ix >= 0x40000000) { /* |x| >= 2.0 */
s = sin(x);
c = cos(x);
ss = -s - c;
cc = s - c;
if(ix < 0x7fe00000) { /* make sure x+x not overflow */
z = cos(x + x);
if((s * c) > zero) cc = z / ss;
else
ss = z / cc;
}
/* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x0)+q1(x)*cos(x0))
* where x0 = x-3pi/4
* Better formula:
* cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
* = 1/sqrt(2) * (sin(x) - cos(x))
* sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
* = -1/sqrt(2) * (cos(x) + sin(x))
* To avoid cancellation, use
* sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
* to compute the worse one.
*/
if(ix > 0x48000000) z = (invsqrtpi * ss) / sqrt(x);
else {
u = pone(x);
v = qone(x);
z = invsqrtpi * (u * ss + v * cc) / sqrt(x);
}
return z;
}
if(ix <= 0x3c900000) { /* x < 2**-54 */
return (-tpi / x);
}
z = x * x;
u = U0[0] + z * (U0[1] + z * (U0[2] + z * (U0[3] + z * U0[4])));
v = one + z * (V0[0] + z * (V0[1] + z * (V0[2] + z * (V0[3] + z * V0[4]))));
return (x * (u / v) + tpi * (__fdlibm_j1(x) * __fdlibm_log(x) - one / x));
}
/* For x >= 8, the asymptotic expansions of pone is
* 1 + 15/128 s^2 - 4725/2^15 s^4 - ..., where s = 1/x.
* We approximate pone by
* pone(x) = 1 + (R/S)
* where R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10
* S = 1 + ps0*s^2 + ... + ps4*s^10
* and
* | pone(x)-1-R/S | <= 2 ** ( -60.06)
*/
static const double pr8[6] = {
/* for x in [inf, 8]=1/[0,0.125] */
0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
1.17187499999988647970e-01, /* 0x3FBDFFFF, 0xFFFFFCCE */
1.32394806593073575129e+01, /* 0x402A7A9D, 0x357F7FCE */
4.12051854307378562225e+02, /* 0x4079C0D4, 0x652EA590 */
3.87474538913960532227e+03, /* 0x40AE457D, 0xA3A532CC */
7.91447954031891731574e+03, /* 0x40BEEA7A, 0xC32782DD */
};
static const double ps8[5] = {
1.14207370375678408436e+02, /* 0x405C8D45, 0x8E656CAC */
3.65093083420853463394e+03, /* 0x40AC85DC, 0x964D274F */
3.69562060269033463555e+04, /* 0x40E20B86, 0x97C5BB7F */
9.76027935934950801311e+04, /* 0x40F7D42C, 0xB28F17BB */
3.08042720627888811578e+04, /* 0x40DE1511, 0x697A0B2D */
};
static const double pr5[6] = {
/* for x in [8,4.5454]=1/[0.125,0.22001] */
1.31990519556243522749e-11, /* 0x3DAD0667, 0xDAE1CA7D */
1.17187493190614097638e-01, /* 0x3FBDFFFF, 0xE2C10043 */
6.80275127868432871736e+00, /* 0x401B3604, 0x6E6315E3 */
1.08308182990189109773e+02, /* 0x405B13B9, 0x452602ED */
5.17636139533199752805e+02, /* 0x40802D16, 0xD052D649 */
5.28715201363337541807e+02, /* 0x408085B8, 0xBB7E0CB7 */
};
static const double ps5[5] = {
5.92805987221131331921e+01, /* 0x404DA3EA, 0xA8AF633D */
9.91401418733614377743e+02, /* 0x408EFB36, 0x1B066701 */
5.35326695291487976647e+03, /* 0x40B4E944, 0x5706B6FB */
7.84469031749551231769e+03, /* 0x40BEA4B0, 0xB8A5BB15 */
1.50404688810361062679e+03, /* 0x40978030, 0x036F5E51 */
};
static const double pr3[6] = {
3.02503916137373618024e-09, /* 0x3E29FC21, 0xA7AD9EDD */
1.17186865567253592491e-01, /* 0x3FBDFFF5, 0x5B21D17B */
3.93297750033315640650e+00, /* 0x400F76BC, 0xE85EAD8A */
3.51194035591636932736e+01, /* 0x40418F48, 0x9DA6D129 */
9.10550110750781271918e+01, /* 0x4056C385, 0x4D2C1837 */
4.85590685197364919645e+01, /* 0x4048478F, 0x8EA83EE5 */
};
static const double ps3[5] = {
3.47913095001251519989e+01, /* 0x40416549, 0xA134069C */
3.36762458747825746741e+02, /* 0x40750C33, 0x07F1A75F */
1.04687139975775130551e+03, /* 0x40905B7C, 0x5037D523 */
8.90811346398256432622e+02, /* 0x408BD67D, 0xA32E31E9 */
1.03787932439639277504e+02, /* 0x4059F26D, 0x7C2EED53 */
};
static const double pr2[6] = {
/* for x in [2.8570,2]=1/[0.3499,0.5] */
1.07710830106873743082e-07, /* 0x3E7CE9D4, 0xF65544F4 */
1.17176219462683348094e-01, /* 0x3FBDFF42, 0xBE760D83 */
2.36851496667608785174e+00, /* 0x4002F2B7, 0xF98FAEC0 */
1.22426109148261232917e+01, /* 0x40287C37, 0x7F71A964 */
1.76939711271687727390e+01, /* 0x4031B1A8, 0x177F8EE2 */
5.07352312588818499250e+00, /* 0x40144B49, 0xA574C1FE */
};
static const double ps2[5] = {
2.14364859363821409488e+01, /* 0x40356FBD, 0x8AD5ECDC */
1.25290227168402751090e+02, /* 0x405F5293, 0x14F92CD5 */
2.32276469057162813669e+02, /* 0x406D08D8, 0xD5A2DBD9 */
1.17679373287147100768e+02, /* 0x405D6B7A, 0xDA1884A9 */
8.36463893371618283368e+00, /* 0x4020BAB1, 0xF44E5192 */
};
static double pone(double x) {
const double *p, *q;
double z, r, s;
int ix;
ix = 0x7fffffff & __HI(x);
if(ix >= 0x40200000) {
p = pr8;
q = ps8;
} else if(ix >= 0x40122E8B) {
p = pr5;
q = ps5;
} else if(ix >= 0x4006DB6D) {
p = pr3;
q = ps3;
} else if(ix >= 0x40000000) {
p = pr2;
q = ps2;
}
z = one / (x * x);
r = p[0] + z * (p[1] + z * (p[2] + z * (p[3] + z * (p[4] + z * p[5]))));
s = one + z * (q[0] + z * (q[1] + z * (q[2] + z * (q[3] + z * q[4]))));
return one + r / s;
}
/* For x >= 8, the asymptotic expansions of qone is
* 3/8 s - 105/1024 s^3 - ..., where s = 1/x.
* We approximate pone by
* qone(x) = s*(0.375 + (R/S))
* where R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10
* S = 1 + qs1*s^2 + ... + qs6*s^12
* and
* | qone(x)/s -0.375-R/S | <= 2 ** ( -61.13)
*/
static const double qr8[6] = {
/* for x in [inf, 8]=1/[0,0.125] */
0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
-1.02539062499992714161e-01, /* 0xBFBA3FFF, 0xFFFFFDF3 */
-1.62717534544589987888e+01, /* 0xC0304591, 0xA26779F7 */
-7.59601722513950107896e+02, /* 0xC087BCD0, 0x53E4B576 */
-1.18498066702429587167e+04, /* 0xC0C724E7, 0x40F87415 */
-4.84385124285750353010e+04, /* 0xC0E7A6D0, 0x65D09C6A */
};
static const double qs8[6] = {
1.61395369700722909556e+02, /* 0x40642CA6, 0xDE5BCDE5 */
7.82538599923348465381e+03, /* 0x40BE9162, 0xD0D88419 */
1.33875336287249578163e+05, /* 0x4100579A, 0xB0B75E98 */
7.19657723683240939863e+05, /* 0x4125F653, 0x72869C19 */
6.66601232617776375264e+05, /* 0x412457D2, 0x7719AD5C */
-2.94490264303834643215e+05, /* 0xC111F969, 0x0EA5AA18 */
};
static const double qr5[6] = {
/* for x in [8,4.5454]=1/[0.125,0.22001] */
-2.08979931141764104297e-11, /* 0xBDB6FA43, 0x1AA1A098 */
-1.02539050241375426231e-01, /* 0xBFBA3FFF, 0xCB597FEF */
-8.05644828123936029840e+00, /* 0xC0201CE6, 0xCA03AD4B */
-1.83669607474888380239e+02, /* 0xC066F56D, 0x6CA7B9B0 */
-1.37319376065508163265e+03, /* 0xC09574C6, 0x6931734F */
-2.61244440453215656817e+03, /* 0xC0A468E3, 0x88FDA79D */
};
static const double qs5[6] = {
8.12765501384335777857e+01, /* 0x405451B2, 0xFF5A11B2 */
1.99179873460485964642e+03, /* 0x409F1F31, 0xE77BF839 */
1.74684851924908907677e+04, /* 0x40D10F1F, 0x0D64CE29 */
4.98514270910352279316e+04, /* 0x40E8576D, 0xAABAD197 */
2.79480751638918118260e+04, /* 0x40DB4B04, 0xCF7C364B */
-4.71918354795128470869e+03, /* 0xC0B26F2E, 0xFCFFA004 */
};
static const double qr3[6] = {
-5.07831226461766561369e-09, /* 0xBE35CFA9, 0xD38FC84F */
-1.02537829820837089745e-01, /* 0xBFBA3FEB, 0x51AEED54 */
-4.61011581139473403113e+00, /* 0xC01270C2, 0x3302D9FF */
-5.78472216562783643212e+01, /* 0xC04CEC71, 0xC25D16DA */
-2.28244540737631695038e+02, /* 0xC06C87D3, 0x4718D55F */
-2.19210128478909325622e+02, /* 0xC06B66B9, 0x5F5C1BF6 */
};
static const double qs3[6] = {
4.76651550323729509273e+01, /* 0x4047D523, 0xCCD367E4 */
6.73865112676699709482e+02, /* 0x40850EEB, 0xC031EE3E */
3.38015286679526343505e+03, /* 0x40AA684E, 0x448E7C9A */
5.54772909720722782367e+03, /* 0x40B5ABBA, 0xA61D54A6 */
1.90311919338810798763e+03, /* 0x409DBC7A, 0x0DD4DF4B */
-1.35201191444307340817e+02, /* 0xC060E670, 0x290A311F */
};
static const double qr2[6] = {
/* for x in [2.8570,2]=1/[0.3499,0.5] */
-1.78381727510958865572e-07, /* 0xBE87F126, 0x44C626D2 */
-1.02517042607985553460e-01, /* 0xBFBA3E8E, 0x9148B010 */
-2.75220568278187460720e+00, /* 0xC0060484, 0x69BB4EDA */
-1.96636162643703720221e+01, /* 0xC033A9E2, 0xC168907F */
-4.23253133372830490089e+01, /* 0xC04529A3, 0xDE104AAA */
-2.13719211703704061733e+01, /* 0xC0355F36, 0x39CF6E52 */
};
static const double qs2[6] = {
2.95333629060523854548e+01, /* 0x403D888A, 0x78AE64FF */
2.52981549982190529136e+02, /* 0x406F9F68, 0xDB821CBA */
7.57502834868645436472e+02, /* 0x4087AC05, 0xCE49A0F7 */
7.39393205320467245656e+02, /* 0x40871B25, 0x48D4C029 */
1.55949003336666123687e+02, /* 0x40637E5E, 0x3C3ED8D4 */
-4.95949898822628210127e+00, /* 0xC013D686, 0xE71BE86B */
};
static double qone(double x) {
const double *p, *q;
double s, r, z;
int ix;
ix = 0x7fffffff & __HI(x);
if(ix >= 0x40200000) {
p = qr8;
q = qs8;
} else if(ix >= 0x40122E8B) {
p = qr5;
q = qs5;
} else if(ix >= 0x4006DB6D) {
p = qr3;
q = qs3;
} else if(ix >= 0x40000000) {
p = qr2;
q = qs2;
}
z = one / (x * x);
r = p[0] + z * (p[1] + z * (p[2] + z * (p[3] + z * (p[4] + z * p[5]))));
s = one + z * (q[0] + z * (q[1] + z * (q[2] + z * (q[3] + z * (q[4] + z * q[5])))));
return (.375 + r / s) / x;
}

283
external/fdlibm/e_jn.c vendored Normal file
View File

@@ -0,0 +1,283 @@
/* @(#)e_jn.c 1.4 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* __fdlibm_jn(n, x), __fdlibm_yn(n, x)
* floating point Bessel's function of the 1st and 2nd kind
* of order n
*
* Special cases:
* y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
* y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
* Note 2. About jn(n,x), yn(n,x)
* For n=0, j0(x) is called,
* for n=1, j1(x) is called,
* for n<x, forward recursion us used starting
* from values of j0(x) and j1(x).
* for n>x, a continued fraction approximation to
* j(n,x)/j(n-1,x) is evaluated and then backward
* recursion is used starting from a supposed value
* for j(n,x). The resulting value of j(0,x) is
* compared with the actual value to correct the
* supposed value of j(n,x).
*
* yn(n,x) is similar in all respects, except
* that forward recursion is used for all
* values of n>1.
*
*/
#include "math.h"
static const double
invsqrtpi = 5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */
two = 2.00000000000000000000e+00, /* 0x40000000, 0x00000000 */
one = 1.00000000000000000000e+00; /* 0x3FF00000, 0x00000000 */
static double zero = 0.00000000000000000000e+00;
double __fdlibm_jn(int n, double x) {
int i, hx, ix, lx, sgn;
double a, b, temp, di;
double z, w;
/* J(-n,x) = (-1)^n * J(n, x), J(n, -x) = (-1)^n * J(n, x)
* Thus, J(-n,x) = J(n,-x)
*/
hx = __HI(x);
ix = 0x7fffffff & hx;
lx = __LO(x);
/* if J(n,NaN) is NaN */
if((ix | ((unsigned)(lx | -lx)) >> 31) > 0x7ff00000) return x + x;
if(n < 0) {
n = -n;
x = -x;
hx ^= 0x80000000;
}
if(n == 0) return (__fdlibm_j0(x));
if(n == 1) return (__fdlibm_j1(x));
sgn = (n & 1) & (hx >> 31); /* even n -- 0, odd n -- sign(x) */
x = fabs(x);
if((ix | lx) == 0 || ix >= 0x7ff00000) /* if x is 0 or inf */
b = zero;
else if((double)n <= x) {
/* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */
if(ix >= 0x52D00000) { /* x > 2**302 */
/* (x >> n**2)
* Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
* Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
* Let s=sin(x), c=cos(x),
* xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
*
* n sin(xn)*sqt2 cos(xn)*sqt2
* ----------------------------------
* 0 s-c c+s
* 1 -s-c -c+s
* 2 -s+c -c-s
* 3 s+c c-s
*/
switch(n & 3) {
case 0:
temp = cos(x) + sin(x);
break;
case 1:
temp = -cos(x) + sin(x);
break;
case 2:
temp = -cos(x) - sin(x);
break;
case 3:
temp = cos(x) - sin(x);
break;
}
b = invsqrtpi * temp / sqrt(x);
} else {
a = __fdlibm_j0(x);
b = __fdlibm_j1(x);
for(i = 1; i < n; i++) {
temp = b;
b = b * ((double)(i + i) / x) - a; /* avoid underflow */
a = temp;
}
}
} else {
if(ix < 0x3e100000) { /* x < 2**-29 */
/* x is tinyv, return the first Taylor expansion of J(n,x)
* J(n,x) = 1/n!*(x/2)^n - ...
*/
if(n > 33) /* underflow */
b = zero;
else {
temp = x * 0.5;
b = temp;
for(a = one, i = 2; i <= n; i++) {
a *= (double)i; /* a = n! */
b *= temp; /* b = (x/2)^n */
}
b = b / a;
}
} else {
/* use backward recurrence */
/* x x^2 x^2
* J(n,x)/J(n-1,x) = ---- ------ ------ .....
* 2n - 2(n+1) - 2(n+2)
*
* 1 1 1
* (for large x) = ---- ------ ------ .....
* 2n 2(n+1) 2(n+2)
* -- - ------ - ------ -
* x x x
*
* Let w = 2n/x and h=2/x, then the above quotient
* is equal to the continued fraction:
* 1
* = -----------------------
* 1
* w - -----------------
* 1
* w+h - ---------
* w+2h - ...
*
* To determine how many terms needed, let
* Q(0) = w, Q(1) = w(w+h) - 1,
* Q(k) = (w+k*h)*Q(k-1) - Q(k-2),
* When Q(k) > 1e4 good for single
* When Q(k) > 1e9 good for double
* When Q(k) > 1e17 good for quadruple
*/
/* determine k */
double t, v;
double q0, q1, h, tmp;
int k, m;
w = (n + n) / (double)x;
h = 2.0 / (double)x;
q0 = w;
z = w + h;
q1 = w * z - 1.0;
k = 1;
while(q1 < 1.0e9) {
k += 1;
z += h;
tmp = z * q1 - q0;
q0 = q1;
q1 = tmp;
}
m = n + n;
for(t = zero, i = 2 * (n + k); i >= m; i -= 2) t = one / (i / x - t);
a = t;
b = one;
/* estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n)
* Hence, if n*(log(2n/x)) > ...
* single 8.8722839355e+01
* double 7.09782712893383973096e+02
* long double 1.1356523406294143949491931077970765006170e+04
* then recurrent value may overflow and the result is
* likely underflow to zero
*/
tmp = n;
v = two / x;
tmp = tmp * __fdlibm_log(fabs(v * tmp));
if(tmp < 7.09782712893383973096e+02) {
for(i = n - 1, di = (double)(i + i); i > 0; i--) {
temp = b;
b *= di;
b = b / x - a;
a = temp;
di -= two;
}
} else {
for(i = n - 1, di = (double)(i + i); i > 0; i--) {
temp = b;
b *= di;
b = b / x - a;
a = temp;
di -= two;
/* scale b to avoid spurious overflow */
if(b > 1e100) {
a /= b;
t /= b;
b = one;
}
}
}
b = (t * __fdlibm_j0(x) / b);
}
}
if(sgn == 1) return -b;
else
return b;
}
double __fdlibm_yn(int n, double x) {
int i, hx, ix, lx;
int sign;
double a, b, temp;
hx = __HI(x);
ix = 0x7fffffff & hx;
lx = __LO(x);
/* if Y(n,NaN) is NaN */
if((ix | ((unsigned)(lx | -lx)) >> 31) > 0x7ff00000) return x + x;
if((ix | lx) == 0) return -one / zero;
if(hx < 0) return zero / zero;
sign = 1;
if(n < 0) {
n = -n;
sign = 1 - ((n & 1) << 1);
}
if(n == 0) return (__fdlibm_y0(x));
if(n == 1) return (sign * __fdlibm_y1(x));
if(ix == 0x7ff00000) return zero;
if(ix >= 0x52D00000) { /* x > 2**302 */
/* (x >> n**2)
* Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
* Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
* Let s=sin(x), c=cos(x),
* xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
*
* n sin(xn)*sqt2 cos(xn)*sqt2
* ----------------------------------
* 0 s-c c+s
* 1 -s-c -c+s
* 2 -s+c -c-s
* 3 s+c c-s
*/
switch(n & 3) {
case 0:
temp = sin(x) - cos(x);
break;
case 1:
temp = -sin(x) - cos(x);
break;
case 2:
temp = -sin(x) + cos(x);
break;
case 3:
temp = sin(x) + cos(x);
break;
}
b = invsqrtpi * temp / sqrt(x);
} else {
a = __fdlibm_y0(x);
b = __fdlibm_y1(x);
/* quit if b is -inf */
for(i = 1; i < n && (__HI(b) != 0xfff00000); i++) {
temp = b;
b = ((double)(i + i) / x) * b - a;
a = temp;
}
}
if(sign > 0) return b;
else
return -b;
}

27
external/fdlibm/e_lgamma.c vendored Normal file
View File

@@ -0,0 +1,27 @@
/* @(#)e_lgamma.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* __fdlibm_lgamma(x)
* Return the logarithm of the Gamma function of x.
*
* Method: call __fdlibm_lgamma_r
*/
#include "math.h"
extern int signgam;
double __fdlibm_lgamma(double x) {
return __fdlibm_lgamma_r(x, &signgam);
}

322
external/fdlibm/e_lgamma_r.c vendored Normal file
View File

@@ -0,0 +1,322 @@
/* @(#)e_lgamma_r.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* __fdlibm_lgamma_r(x, signgamp)
* Reentrant version of the logarithm of the Gamma function
* with user provide pointer for the sign of Gamma(x).
*
* Method:
* 1. Argument Reduction for 0 < x <= 8
* Since gamma(1+s)=s*gamma(s), for x in [0,8], we may
* reduce x to a number in [1.5,2.5] by
* lgamma(1+s) = log(s) + lgamma(s)
* for example,
* lgamma(7.3) = log(6.3) + lgamma(6.3)
* = log(6.3*5.3) + lgamma(5.3)
* = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3)
* 2. Polynomial approximation of lgamma around its
* minimun ymin=1.461632144968362245 to maintain monotonicity.
* On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use
* Let z = x-ymin;
* lgamma(x) = -1.214862905358496078218 + z^2*poly(z)
* where
* poly(z) is a 14 degree polynomial.
* 2. Rational approximation in the primary interval [2,3]
* We use the following approximation:
* s = x-2.0;
* lgamma(x) = 0.5*s + s*P(s)/Q(s)
* with accuracy
* |P/Q - (lgamma(x)-0.5s)| < 2**-61.71
* Our algorithms are based on the following observation
*
* zeta(2)-1 2 zeta(3)-1 3
* lgamma(2+s) = s*(1-Euler) + --------- * s - --------- * s + ...
* 2 3
*
* where Euler = 0.5771... is the Euler constant, which is very
* close to 0.5.
*
* 3. For x>=8, we have
* lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+....
* (better formula:
* lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...)
* Let z = 1/x, then we approximation
* f(z) = lgamma(x) - (x-0.5)(log(x)-1)
* by
* 3 5 11
* w = w0 + w1*z + w2*z + w3*z + ... + w6*z
* where
* |w - f(z)| < 2**-58.74
*
* 4. For negative x, since (G is gamma function)
* -x*G(-x)*G(x) = pi/sin(pi*x),
* we have
* G(x) = pi/(sin(pi*x)*(-x)*G(-x))
* since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0
* Hence, for x<0, signgam = sign(sin(pi*x)) and
* lgamma(x) = log(|Gamma(x)|)
* = log(pi/(|x*sin(pi*x)|)) - lgamma(-x);
* Note: one should avoid compute pi*(-x) directly in the
* computation of sin(pi*(-x)).
*
* 5. Special Cases
* lgamma(2+s) ~ s*(1-Euler) for tinyv s
* lgamma(1)=lgamma(2)=0
* lgamma(x) ~ -log(x) for tinyv x
* lgamma(0) = lgamma(inf) = inf
* lgamma(-integer) = +-inf
*
*/
#include "math.h"
static const double
two52 = 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */
a0 = 7.72156649015328655494e-02, /* 0x3FB3C467, 0xE37DB0C8 */
a1 = 3.22467033424113591611e-01, /* 0x3FD4A34C, 0xC4A60FAD */
a2 = 6.73523010531292681824e-02, /* 0x3FB13E00, 0x1A5562A7 */
a3 = 2.05808084325167332806e-02, /* 0x3F951322, 0xAC92547B */
a4 = 7.38555086081402883957e-03, /* 0x3F7E404F, 0xB68FEFE8 */
a5 = 2.89051383673415629091e-03, /* 0x3F67ADD8, 0xCCB7926B */
a6 = 1.19270763183362067845e-03, /* 0x3F538A94, 0x116F3F5D */
a7 = 5.10069792153511336608e-04, /* 0x3F40B6C6, 0x89B99C00 */
a8 = 2.20862790713908385557e-04, /* 0x3F2CF2EC, 0xED10E54D */
a9 = 1.08011567247583939954e-04, /* 0x3F1C5088, 0x987DFB07 */
a10 = 2.52144565451257326939e-05, /* 0x3EFA7074, 0x428CFA52 */
a11 = 4.48640949618915160150e-05, /* 0x3F07858E, 0x90A45837 */
tc = 1.46163214496836224576e+00, /* 0x3FF762D8, 0x6356BE3F */
tf = -1.21486290535849611461e-01, /* 0xBFBF19B9, 0xBCC38A42 */
/* tt = -(tail of tf) */
tt = -3.63867699703950536541e-18, /* 0xBC50C7CA, 0xA48A971F */
t0 = 4.83836122723810047042e-01, /* 0x3FDEF72B, 0xC8EE38A2 */
t1 = -1.47587722994593911752e-01, /* 0xBFC2E427, 0x8DC6C509 */
t2 = 6.46249402391333854778e-02, /* 0x3FB08B42, 0x94D5419B */
t3 = -3.27885410759859649565e-02, /* 0xBFA0C9A8, 0xDF35B713 */
t4 = 1.79706750811820387126e-02, /* 0x3F9266E7, 0x970AF9EC */
t5 = -1.03142241298341437450e-02, /* 0xBF851F9F, 0xBA91EC6A */
t6 = 6.10053870246291332635e-03, /* 0x3F78FCE0, 0xE370E344 */
t7 = -3.68452016781138256760e-03, /* 0xBF6E2EFF, 0xB3E914D7 */
t8 = 2.25964780900612472250e-03, /* 0x3F6282D3, 0x2E15C915 */
t9 = -1.40346469989232843813e-03, /* 0xBF56FE8E, 0xBF2D1AF1 */
t10 = 8.81081882437654011382e-04, /* 0x3F4CDF0C, 0xEF61A8E9 */
t11 = -5.38595305356740546715e-04, /* 0xBF41A610, 0x9C73E0EC */
t12 = 3.15632070903625950361e-04, /* 0x3F34AF6D, 0x6C0EBBF7 */
t13 = -3.12754168375120860518e-04, /* 0xBF347F24, 0xECC38C38 */
t14 = 3.35529192635519073543e-04, /* 0x3F35FD3E, 0xE8C2D3F4 */
u0 = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */
u1 = 6.32827064025093366517e-01, /* 0x3FE4401E, 0x8B005DFF */
u2 = 1.45492250137234768737e+00, /* 0x3FF7475C, 0xD119BD6F */
u3 = 9.77717527963372745603e-01, /* 0x3FEF4976, 0x44EA8450 */
u4 = 2.28963728064692451092e-01, /* 0x3FCD4EAE, 0xF6010924 */
u5 = 1.33810918536787660377e-02, /* 0x3F8B678B, 0xBF2BAB09 */
v1 = 2.45597793713041134822e+00, /* 0x4003A5D7, 0xC2BD619C */
v2 = 2.12848976379893395361e+00, /* 0x40010725, 0xA42B18F5 */
v3 = 7.69285150456672783825e-01, /* 0x3FE89DFB, 0xE45050AF */
v4 = 1.04222645593369134254e-01, /* 0x3FBAAE55, 0xD6537C88 */
v5 = 3.21709242282423911810e-03, /* 0x3F6A5ABB, 0x57D0CF61 */
s0 = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */
s1 = 2.14982415960608852501e-01, /* 0x3FCB848B, 0x36E20878 */
s2 = 3.25778796408930981787e-01, /* 0x3FD4D98F, 0x4F139F59 */
s3 = 1.46350472652464452805e-01, /* 0x3FC2BB9C, 0xBEE5F2F7 */
s4 = 2.66422703033638609560e-02, /* 0x3F9B481C, 0x7E939961 */
s5 = 1.84028451407337715652e-03, /* 0x3F5E26B6, 0x7368F239 */
s6 = 3.19475326584100867617e-05, /* 0x3F00BFEC, 0xDD17E945 */
r1 = 1.39200533467621045958e+00, /* 0x3FF645A7, 0x62C4AB74 */
r2 = 7.21935547567138069525e-01, /* 0x3FE71A18, 0x93D3DCDC */
r3 = 1.71933865632803078993e-01, /* 0x3FC601ED, 0xCCFBDF27 */
r4 = 1.86459191715652901344e-02, /* 0x3F9317EA, 0x742ED475 */
r5 = 7.77942496381893596434e-04, /* 0x3F497DDA, 0xCA41A95B */
r6 = 7.32668430744625636189e-06, /* 0x3EDEBAF7, 0xA5B38140 */
w0 = 4.18938533204672725052e-01, /* 0x3FDACFE3, 0x90C97D69 */
w1 = 8.33333333333329678849e-02, /* 0x3FB55555, 0x5555553B */
w2 = -2.77777777728775536470e-03, /* 0xBF66C16C, 0x16B02E5C */
w3 = 7.93650558643019558500e-04, /* 0x3F4A019F, 0x98CF38B6 */
w4 = -5.95187557450339963135e-04, /* 0xBF4380CB, 0x8C0FE741 */
w5 = 8.36339918996282139126e-04, /* 0x3F4B67BA, 0x4CDAD5D1 */
w6 = -1.63092934096575273989e-03; /* 0xBF5AB89D, 0x0B9E43E4 */
static double zero = 0.00000000000000000000e+00;
static double sin_pi(double x) {
double y, z;
int n, ix;
ix = 0x7fffffff & __HI(x);
if(ix < 0x3fd00000) return __fdlibm_kernel_sin(pi * x, zero, 0);
y = -x; /* x is assume negative */
/*
* argument reduction, make sure inexact flag not raised if input
* is an integer
*/
z = floor(y);
if(z != y) { /* inexact anyway */
y *= 0.5;
y = 2.0 * (y - floor(y)); /* y = |x| mod 2.0 */
n = (int)(y * 4.0);
} else {
if(ix >= 0x43400000) {
y = zero;
n = 0; /* y must be even */
} else {
if(ix < 0x43300000) z = y + two52; /* exact */
n = __LO(z) & 1; /* lower word of z */
y = n;
n <<= 2;
}
}
switch(n) {
case 0:
y = __fdlibm_kernel_sin(pi * y, zero, 0);
break;
case 1:
case 2:
y = __fdlibm_kernel_cos(pi * (0.5 - y), zero);
break;
case 3:
case 4:
y = __fdlibm_kernel_sin(pi * (one - y), zero, 0);
break;
case 5:
case 6:
y = -__fdlibm_kernel_cos(pi * (y - 1.5), zero);
break;
default:
y = __fdlibm_kernel_sin(pi * (y - 2.0), zero, 0);
break;
}
return -y;
}
double __fdlibm_lgamma_r(double x, int* signgamp) {
double t, y, z, nadj, p, p1, p2, p3, q, r, w;
int i, hx, lx, ix;
hx = __HI(x);
lx = __LO(x);
/* purge off +-inf, NaN, +-0, and negative arguments */
*signgamp = 1;
ix = hx & 0x7fffffff;
if(ix >= 0x7ff00000) return x * x;
if((ix | lx) == 0) return one / zero;
if(ix < 0x3b900000) { /* |x|<2**-70, return -log(|x|) */
if(hx < 0) {
*signgamp = -1;
return -__fdlibm_log(-x);
} else
return -__fdlibm_log(x);
}
if(hx < 0) {
if(ix >= 0x43300000) /* |x|>=2**52, must be -integer */
return one / zero;
t = sin_pi(x);
if(t == zero) return one / zero; /* -integer */
nadj = __fdlibm_log(pi / fabs(t * x));
if(t < zero) *signgamp = -1;
x = -x;
}
/* purge off 1 and 2 */
if((((ix - 0x3ff00000) | lx) == 0) || (((ix - 0x40000000) | lx) == 0)) r = 0;
/* for x < 2.0 */
else if(ix < 0x40000000) {
if(ix <= 0x3feccccc) { /* lgamma(x) = lgamma(x+1)-log(x) */
r = -__fdlibm_log(x);
if(ix >= 0x3FE76944) {
y = one - x;
i = 0;
} else if(ix >= 0x3FCDA661) {
y = x - (tc - one);
i = 1;
} else {
y = x;
i = 2;
}
} else {
r = zero;
if(ix >= 0x3FFBB4C3) {
y = 2.0 - x;
i = 0;
} /* [1.7316,2] */
else if(ix >= 0x3FF3B4C4) {
y = x - tc;
i = 1;
} /* [1.23,1.73] */
else {
y = x - one;
i = 2;
}
}
switch(i) {
case 0:
z = y * y;
p1 = a0 + z * (a2 + z * (a4 + z * (a6 + z * (a8 + z * a10))));
p2 = z * (a1 + z * (a3 + z * (a5 + z * (a7 + z * (a9 + z * a11)))));
p = y * p1 + p2;
r += (p - 0.5 * y);
break;
case 1:
z = y * y;
w = z * y;
p1 = t0 + w * (t3 + w * (t6 + w * (t9 + w * t12))); /* parallel comp */
p2 = t1 + w * (t4 + w * (t7 + w * (t10 + w * t13)));
p3 = t2 + w * (t5 + w * (t8 + w * (t11 + w * t14)));
p = z * p1 - (tt - w * (p2 + y * p3));
r += (tf + p);
break;
case 2:
p1 = y * (u0 + y * (u1 + y * (u2 + y * (u3 + y * (u4 + y * u5)))));
p2 = one + y * (v1 + y * (v2 + y * (v3 + y * (v4 + y * v5))));
r += (-0.5 * y + p1 / p2);
}
} else if(ix < 0x40200000) { /* x < 8.0 */
i = (int)x;
t = zero;
y = x - (double)i;
p = y * (s0 + y * (s1 + y * (s2 + y * (s3 + y * (s4 + y * (s5 + y * s6))))));
q = one + y * (r1 + y * (r2 + y * (r3 + y * (r4 + y * (r5 + y * r6)))));
r = half * y + p / q;
z = one; /* lgamma(1+s) = log(s) + lgamma(s) */
switch(i) {
case 7:
z *= (y + 6.0); /* FALLTHRU */
case 6:
z *= (y + 5.0); /* FALLTHRU */
case 5:
z *= (y + 4.0); /* FALLTHRU */
case 4:
z *= (y + 3.0); /* FALLTHRU */
case 3:
z *= (y + 2.0); /* FALLTHRU */
r += __fdlibm_log(z);
break;
}
/* 8.0 <= x < 2**58 */
} else if(ix < 0x43900000) {
t = __fdlibm_log(x);
z = one / x;
y = z * z;
w = w0 + z * (w1 + y * (w2 + y * (w3 + y * (w4 + y * (w5 + y * w6)))));
r = (x - half) * (t - one) + w;
} else
/* 2**58 <= x <= inf */
r = x * (__fdlibm_log(x) - one);
if(hx < 0) r = nadj - r;
return r;
}

139
external/fdlibm/e_log.c vendored Normal file
View File

@@ -0,0 +1,139 @@
/* @(#)e_log.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __fdlibm_log(x)
* Return the logrithm of x
*
* Method :
* 1. Argument Reduction: find k and f such that
* x = 2^k * (1+f),
* where sqrt(2)/2 < 1+f < sqrt(2) .
*
* 2. Approximation of log(1+f).
* Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
* = 2s + 2/3 s**3 + 2/5 s**5 + .....,
* = 2s + s*R
* We use a special Reme algorithm on [0,0.1716] to generate
* a polynomial of degree 14 to approximate R The maximum error
* of this polynomial approximation is bounded by 2**-58.45. In
* other words,
* 2 4 6 8 10 12 14
* R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s +Lg6*s +Lg7*s
* (the values of Lg1 to Lg7 are listed in the program)
* and
* | 2 14 | -58.45
* | Lg1*s +...+Lg7*s - R(z) | <= 2
* | |
* Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
* In order to guarantee error in log below 1ulp, we compute log
* by
* log(1+f) = f - s*(f - R) (if f is not too large)
* log(1+f) = f - (hfsq - s*(hfsq+R)). (better accuracy)
*
* 3. Finally, log(x) = k*ln2 + log(1+f).
* = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
* Here ln2 is split into two floating point number:
* ln2_hi + ln2_lo,
* where n*ln2_hi is always exact for |n| < 2000.
*
* Special cases:
* log(x) is NaN with signal if x < 0 (including -INF) ;
* log(+INF) is +INF; log(0) is -INF with signal;
* log(NaN) is that NaN with no signal.
*
* Accuracy:
* according to an error analysis, the error is always less than
* 1 ulp (unit in the last place).
*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "math.h"
static const double
ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */
ln2_lo = 1.90821492927058770002e-10, /* 3dea39ef 35793c76 */
two54 = 1.80143985094819840000e+16, /* 43500000 00000000 */
Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */
Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */
Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */
Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */
Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */
Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */
Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */
static double zero = 0.0;
double __fdlibm_log(double x) {
double hfsq, f, s, z, R, w, t1, t2, dk;
int k, hx, i, j;
unsigned lx;
hx = __HI(x); /* high word of x */
lx = __LO(x); /* low word of x */
k = 0;
if(hx < 0x00100000) { /* x < 2**-1022 */
if(((hx & 0x7fffffff) | lx) == 0)
return -two54 / zero; /* log(+-0)=-inf */
if(hx < 0) return (x - x) / zero; /* log(-#) = NaN */
k -= 54;
x *= two54; /* subnormal number, scale up x */
hx = __HI(x); /* high word of x */
}
if(hx >= 0x7ff00000) return x + x;
k += (hx >> 20) - 1023;
hx &= 0x000fffff;
i = (hx + 0x95f64) & 0x100000;
__HI(x) = hx | (i ^ 0x3ff00000); /* normalize x or x/2 */
k += (i >> 20);
f = x - 1.0;
if((0x000fffff & (2 + hx)) < 3) { /* |f| < 2**-20 */
if(f == zero)
if(k == 0) return zero;
else {
dk = (double)k;
return dk * ln2_hi + dk * ln2_lo;
}
R = f * f * (0.5 - 0.33333333333333333 * f);
if(k == 0) return f - R;
else {
dk = (double)k;
return dk * ln2_hi - ((R - dk * ln2_lo) - f);
}
}
s = f / (2.0 + f);
dk = (double)k;
z = s * s;
i = hx - 0x6147a;
w = z * z;
j = 0x6b851 - hx;
t1 = w * (Lg2 + w * (Lg4 + w * Lg6));
t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));
i |= j;
R = t2 + t1;
if(i > 0) {
hfsq = 0.5 * f * f;
if(k == 0) return f - (hfsq - s * (hfsq + R));
else
return dk * ln2_hi - ((hfsq - (s * (hfsq + R) + dk * ln2_lo)) - f);
} else {
if(k == 0) return f - s * (f - R);
else
return dk * ln2_hi - ((s * (f - R) - dk * ln2_lo) - f);
}
}

82
external/fdlibm/e_log10.c vendored Normal file
View File

@@ -0,0 +1,82 @@
/* @(#)e_log10.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __fdlibm_log10(x)
* Return the base 10 logarithm of x
*
* Method :
* Let log10_2hi = leading 40 bits of log10(2) and
* log10_2lo = log10(2) - log10_2hi,
* ivln10 = 1/log(10) rounded.
* Then
* n = ilogb(x),
* if(n<0) n = n+1;
* x = scalbn(x,-n);
* log10(x) := n*log10_2hi + (n*log10_2lo + ivln10*log(x))
*
* Note 1:
* To guarantee log10(10**n)=n, where 10**n is normal, the rounding
* mode must set to Round-to-Nearest.
* Note 2:
* [1/log(10)] rounded to 53 bits has error .198 ulps;
* log10 is monotonic at all binary break points.
*
* Special cases:
* log10(x) is NaN with signal if x < 0;
* log10(+INF) is +INF with no signal; log10(0) is -INF with signal;
* log10(NaN) is that NaN with no signal;
* log10(10**N) = N for N=0,1,...,22.
*
* Constants:
* The hexadecimal values are the intended ones for the following constants.
* The decimal values may be used, provided that the compiler will convert
* from decimal to binary accurately enough to produce the hexadecimal values
* shown.
*/
#include "math.h"
static const double
two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
ivln10 = 4.34294481903251816668e-01, /* 0x3FDBCB7B, 0x1526E50E */
log10_2hi = 3.01029995663611771306e-01, /* 0x3FD34413, 0x509F6000 */
log10_2lo = 3.69423907715893078616e-13; /* 0x3D59FEF3, 0x11F12B36 */
static double zero = 0.0;
double __fdlibm_log10(double x) {
double y, z;
int i, k, hx;
unsigned lx;
hx = __HI(x); /* high word of x */
lx = __LO(x); /* low word of x */
k = 0;
if(hx < 0x00100000) { /* x < 2**-1022 */
if(((hx & 0x7fffffff) | lx) == 0)
return -two54 / zero; /* log(+-0)=-inf */
if(hx < 0) return (x - x) / zero; /* log(-#) = NaN */
k -= 54;
x *= two54; /* subnormal number, scale up x */
hx = __HI(x); /* high word of x */
}
if(hx >= 0x7ff00000) return x + x;
k += (hx >> 20) - 1023;
i = ((unsigned)k & 0x80000000) >> 31;
hx = (hx & 0x000fffff) | ((0x3ff - i) << 20);
y = (double)(k + i);
__HI(x) = hx;
z = y * log10_2lo + ivln10 * __fdlibm_log(x);
return z + y * log10_2hi;
}

View File

@@ -1,4 +1,3 @@
/* @(#)e_pow.c 1.5 04/04/22 SMI */
/*
* ====================================================
* Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
@@ -9,32 +8,27 @@
* ====================================================
*/
/* $Id$ */
#include <Mw/BaseTypes.h>
#include "math_internal.h"
/* __ieee754_pow(x,y) return x**y
/* __fdlibm_pow(x,y) return x**y
*
* n
* Method: Let x = 2 * (1+f)
* 1. Compute and return log2(x) in two pieces:
* log2(x) = w1 + w2,
* where w1 has 53-24 = 29 bit trailing zeros.
* 2. Perform y*log2(x) = n+y' by simulating multi-precision
* 2. Perform y*log2(x) = n+y' by simulating muti-precision
* arithmetic, where |y'|<=0.5.
* 3. Return x**y = 2**n*exp(y'*log2)
*
* Special cases:
* 1. (anything) ** 0 is 1
* 2. (anything) ** 1 is itself
* 3. (anything) ** NAN is NAN except 1 ** NAN = 1
* 3. (anything) ** NAN is NAN
* 4. NAN ** (anything except 0) is NAN
* 5. +-(|x| > 1) ** +INF is +INF
* 6. +-(|x| > 1) ** -INF is +0
* 7. +-(|x| < 1) ** +INF is +0
* 8. +-(|x| < 1) ** -INF is +INF
* 9. +-1 ** +-INF is 1
* 9. +-1 ** +-INF is NAN
* 10. +0 ** (+anything except 0, NAN) is +0
* 11. -0 ** (+anything except 0, NAN, odd integer) is +0
* 12. +0 ** (-anything except 0, NAN) is +INF
@@ -59,6 +53,8 @@
* to produce the hexadecimal values shown.
*/
#include "math.h"
static const double
bp[] = {
1.0,
@@ -97,29 +93,29 @@ static const double
ivln2_h = 1.44269502162933349609e+00, /* 0x3FF71547, 0x60000000 =24b 1/ln2*/
ivln2_l = 1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/
double
nbsd_pow(double x, double y) {
double __fdlibm_pow(double x, double y) {
double z, ax, z_h, z_l, p_h, p_l;
double yy1, t1, t2, r, s, t, u, v, w;
MwI32 i, j, k, yisint, n;
MwI32 hx, hy, ix, iy;
MwU32 lx, ly;
double y1, t1, t2, r, s, t, u, v, w;
int i0, i1, i, j, k, yisint, n;
int hx, hy, ix, iy;
unsigned lx, ly;
EXTRACT_WORDS(hx, lx, x);
EXTRACT_WORDS(hy, ly, y);
i0 = ((*(int*)&one) >> 29) ^ 1;
i1 = 1 - i0;
hx = __HI(x);
lx = __LO(x);
hy = __HI(y);
ly = __LO(y);
ix = hx & 0x7fffffff;
iy = hy & 0x7fffffff;
/* y==zero: x**0 = 1 */
if((iy | ly) == 0) return one;
/* x==1: 1**y = 1, even if y is NaN */
if(hx == 0x3ff00000 && lx == 0) return one;
/* y!=zero: result is NaN if either arg is NaN */
/* +-NaN return x+y */
if(ix > 0x7ff00000 || ((ix == 0x7ff00000) && (lx != 0)) ||
iy > 0x7ff00000 || ((iy == 0x7ff00000) && (ly != 0)))
return (x + 0.0) + (y + 0.0);
return x + y;
/* determine if y is an odd int when x < 0
* yisint = 0 ... y is not an integer
@@ -133,7 +129,7 @@ nbsd_pow(double x, double y) {
k = (iy >> 20) - 0x3ff; /* exponent */
if(k > 20) {
j = ly >> (52 - k);
if((MwU32)(j << (52 - k)) == ly) yisint = 2 - (j & 1);
if((j << (52 - k)) == ly) yisint = 2 - (j & 1);
} else if(ly == 0) {
j = iy >> (20 - k);
if((j << (20 - k)) == iy) yisint = 2 - (j & 1);
@@ -145,7 +141,7 @@ nbsd_pow(double x, double y) {
if(ly == 0) {
if(iy == 0x7ff00000) { /* y is +-inf */
if(((ix - 0x3ff00000) | lx) == 0)
return one; /* (-1)**+-inf is 1 */
return y - y; /* inf**+-1 is NaN */
else if(ix >= 0x3ff00000) /* (|x|>1)**+-inf = inf,0 */
return (hy >= 0) ? y : zero;
else /* (|x|<1)**-,+inf = inf,0 */
@@ -179,11 +175,7 @@ nbsd_pow(double x, double y) {
}
}
/* CYGNUS LOCAL + fdlibm-5.3 fix: This used to be
n = (hx>>31)+1;
but ANSI C says a right shift of a signed negative quantity is
implementation defined. */
n = ((MwU32)hx >> 31) - 1;
n = (hx >> 31) + 1;
/* (x<0)**(non-int) is NaN */
if((n | yisint) == 0) return (x - x) / (x - x);
@@ -207,7 +199,7 @@ nbsd_pow(double x, double y) {
u = ivln2_h * t; /* ivln2_h has 21 sig. bits */
v = t * ivln2_l - w * ivln2;
t1 = u + v;
SET_LOW_WORD(t1, 0);
__LO(t1) = 0;
t2 = v - (t1 - u);
} else {
double ss, s2, s_h, s_l, t_h, t_l;
@@ -216,7 +208,7 @@ nbsd_pow(double x, double y) {
if(ix < 0x00100000) {
ax *= two53;
n -= 53;
GET_HIGH_WORD(ix, ax);
ix = __HI(ax);
}
n += ((ix) >> 20) - 0x3ff;
j = ix & 0x000fffff;
@@ -230,17 +222,17 @@ nbsd_pow(double x, double y) {
n += 1;
ix -= 0x00100000;
}
SET_HIGH_WORD(ax, ix);
__HI(ax) = ix;
/* compute ss = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
u = ax - bp[k]; /* bp[0]=1.0, bp[1]=1.5 */
v = one / (ax + bp[k]);
ss = u * v;
s_h = ss;
SET_LOW_WORD(s_h, 0);
__LO(s_h) = 0;
/* t_h=ax+bp[k] High */
t_h = zero;
SET_HIGH_WORD(t_h, ((ix >> 1) | 0x20000000) + 0x00080000 + (k << 18));
__HI(t_h) = ((ix >> 1) | 0x20000000) + 0x00080000 + (k << 18);
t_l = ax - (t_h - bp[k]);
s_l = v * ((u - s_h * t_h) - s_h * t_l);
/* compute log(ax) */
@@ -249,31 +241,32 @@ nbsd_pow(double x, double y) {
r += s_l * (s_h + ss);
s2 = s_h * s_h;
t_h = 3.0 + s2 + r;
SET_LOW_WORD(t_h, 0);
__LO(t_h) = 0;
t_l = r - ((t_h - 3.0) - s2);
/* u+v = ss*(1+...) */
u = s_h * t_h;
v = s_l * t_h + t_l * ss;
/* 2/(3log2)*(ss+...) */
p_h = u + v;
SET_LOW_WORD(p_h, 0);
__LO(p_h) = 0;
p_l = v - (p_h - u);
z_h = cp_h * p_h; /* cp_h+cp_l = 2/(3*log2) */
z_l = cp_l * p_h + p_l * cp + dp_l[k];
/* log2(ax) = (ss+..)*2/(3*log2) = n + dp_h + z_h + z_l */
t = (double)n;
t1 = (((z_h + z_l) + dp_h[k]) + t);
SET_LOW_WORD(t1, 0);
__LO(t1) = 0;
t2 = z_l - (((t1 - t) - dp_h[k]) - z_h);
}
/* split up y into yy1+y2 and compute (yy1+y2)*(t1+t2) */
yy1 = y;
SET_LOW_WORD(yy1, 0);
p_l = (y - yy1) * t1 + y * t2;
p_h = yy1 * t1;
/* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */
y1 = y;
__LO(y1) = 0;
p_l = (y - y1) * t1 + y * t2;
p_h = y1 * t1;
z = p_l + p_h;
EXTRACT_WORDS(j, i, z);
j = __HI(z);
i = __LO(z);
if(j >= 0x40900000) { /* z >= 1024 */
if(((j - 0x40900000) | i) != 0) /* if z > 1024 */
return s * hugev * hugev; /* overflow */
@@ -297,13 +290,13 @@ nbsd_pow(double x, double y) {
n = j + (0x00100000 >> (k + 1));
k = ((n & 0x7fffffff) >> 20) - 0x3ff; /* new k for n */
t = zero;
SET_HIGH_WORD(t, n & ~(0x000fffff >> k));
__HI(t) = (n & ~(0x000fffff >> k));
n = ((n & 0x000fffff) | 0x00100000) >> (20 - k);
if(j < 0) n = -n;
p_h -= t;
}
t = p_l + p_h;
SET_LOW_WORD(t, 0);
__LO(t) = 0;
u = t * lg2_h;
v = (p_l - (t - p_h)) * lg2 + t * lg2_l;
z = u + v;
@@ -312,10 +305,10 @@ nbsd_pow(double x, double y) {
t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));
r = (z * t1) / (t1 - two) - (w + z * w);
z = one - (r - z);
GET_HIGH_WORD(j, z);
j = __HI(z);
j += (n << 20);
if((j >> 20) <= 0) z = nbsd_scalbn(z, n); /* subnormal output */
if((j >> 20) <= 0) z = scalbn(z, n); /* subnormal output */
else
SET_HIGH_WORD(z, j);
__HI(z) += (n << 20);
return s * z;
}

251
external/fdlibm/e_rem_pio2.c vendored Normal file
View File

@@ -0,0 +1,251 @@
/* @(#)e_rem_pio2.c 1.4 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* __fdlibm_rem_pio2(x,y)
*
* return the remainder of x rem pi/2 in y[0]+y[1]
* use __fdlibm_rem_pio2()
*/
#include "math.h"
/*
* Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
*/
static const int two_over_pi[] = {
0xA2F983,
0x6E4E44,
0x1529FC,
0x2757D1,
0xF534DD,
0xC0DB62,
0x95993C,
0x439041,
0xFE5163,
0xABDEBB,
0xC561B7,
0x246E3A,
0x424DD2,
0xE00649,
0x2EEA09,
0xD1921C,
0xFE1DEB,
0x1CB129,
0xA73EE8,
0x8235F5,
0x2EBB44,
0x84E99C,
0x7026B4,
0x5F7E41,
0x3991D6,
0x398353,
0x39F49C,
0x845F8B,
0xBDF928,
0x3B1FF8,
0x97FFDE,
0x05980F,
0xEF2F11,
0x8B5A0A,
0x6D1F6D,
0x367ECF,
0x27CB09,
0xB74F46,
0x3F669E,
0x5FEA2D,
0x7527BA,
0xC7EBE5,
0xF17B3D,
0x0739F7,
0x8A5292,
0xEA6BFB,
0x5FB11F,
0x8D5D08,
0x560330,
0x46FC7B,
0x6BABF0,
0xCFBC20,
0x9AF436,
0x1DA9E3,
0x91615E,
0xE61B08,
0x659985,
0x5F14A0,
0x68408D,
0xFFD880,
0x4D7327,
0x310606,
0x1556CA,
0x73A8C9,
0x60E27B,
0xC08C6B,
};
static const int npio2_hw[] = {
0x3FF921FB,
0x400921FB,
0x4012D97C,
0x401921FB,
0x401F6A7A,
0x4022D97C,
0x4025FDBB,
0x402921FB,
0x402C463A,
0x402F6A7A,
0x4031475C,
0x4032D97C,
0x40346B9C,
0x4035FDBB,
0x40378FDB,
0x403921FB,
0x403AB41B,
0x403C463A,
0x403DD85A,
0x403F6A7A,
0x40407E4C,
0x4041475C,
0x4042106C,
0x4042D97C,
0x4043A28C,
0x40446B9C,
0x404534AC,
0x4045FDBB,
0x4046C6CB,
0x40478FDB,
0x404858EB,
0x404921FB,
};
/*
* invpio2: 53 bits of 2/pi
* pio2_1: first 33 bit of pi/2
* pio2_1t: pi/2 - pio2_1
* pio2_2: second 33 bit of pi/2
* pio2_2t: pi/2 - (pio2_1+pio2_2)
* pio2_3: third 33 bit of pi/2
* pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
*/
static const double
zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
pio2_1t = 6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */
pio2_2 = 6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */
pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
pio2_3 = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */
int __fdlibm_rem_pio2(double x, double* y) {
double z, w, t, r, fn;
double tx[3];
int e0, i, j, nx, n, ix, hx;
hx = __HI(x); /* high word of x */
ix = hx & 0x7fffffff;
if(ix <= 0x3fe921fb) /* |x| ~<= pi/4 , no need for reduction */
{
y[0] = x;
y[1] = 0;
return 0;
}
if(ix < 0x4002d97c) { /* |x| < 3pi/4, special case with n=+-1 */
if(hx > 0) {
z = x - pio2_1;
if(ix != 0x3ff921fb) { /* 33+53 bit pi is good enough */
y[0] = z - pio2_1t;
y[1] = (z - y[0]) - pio2_1t;
} else { /* near pi/2, use 33+33+53 bit pi */
z -= pio2_2;
y[0] = z - pio2_2t;
y[1] = (z - y[0]) - pio2_2t;
}
return 1;
} else { /* negative x */
z = x + pio2_1;
if(ix != 0x3ff921fb) { /* 33+53 bit pi is good enough */
y[0] = z + pio2_1t;
y[1] = (z - y[0]) + pio2_1t;
} else { /* near pi/2, use 33+33+53 bit pi */
z += pio2_2;
y[0] = z + pio2_2t;
y[1] = (z - y[0]) + pio2_2t;
}
return -1;
}
}
if(ix <= 0x413921fb) { /* |x| ~<= 2^19*(pi/2), medium size */
t = fabs(x);
n = (int)(t * invpio2 + half);
fn = (double)n;
r = t - fn * pio2_1;
w = fn * pio2_1t; /* 1st round good to 85 bit */
if(n < 32 && ix != npio2_hw[n - 1]) {
y[0] = r - w; /* quick check no cancellation */
} else {
j = ix >> 20;
y[0] = r - w;
i = j - (((__HI(y[0])) >> 20) & 0x7ff);
if(i > 16) { /* 2nd iteration needed, good to 118 */
t = r;
w = fn * pio2_2;
r = t - w;
w = fn * pio2_2t - ((t - r) - w);
y[0] = r - w;
i = j - (((__HI(y[0])) >> 20) & 0x7ff);
if(i > 49) { /* 3rd iteration need, 151 bits acc */
t = r; /* will cover all possible cases */
w = fn * pio2_3;
r = t - w;
w = fn * pio2_3t - ((t - r) - w);
y[0] = r - w;
}
}
}
y[1] = (r - y[0]) - w;
if(hx < 0) {
y[0] = -y[0];
y[1] = -y[1];
return -n;
} else
return n;
}
/*
* all other (large) arguments
*/
if(ix >= 0x7ff00000) { /* x is inf or NaN */
y[0] = y[1] = x - x;
return 0;
}
/* set z = scalbn(|x|,ilogb(x)-23) */
__LO(z) = __LO(x);
e0 = (ix >> 20) - 1046; /* e0 = ilogb(z)-23; */
__HI(z) = ix - (e0 << 20);
for(i = 0; i < 2; i++) {
tx[i] = (double)((int)(z));
z = (z - tx[i]) * two24;
}
tx[2] = z;
nx = 3;
while(tx[nx - 1] == zero) nx--; /* skip zero term */
n = __fdlibm_kernel_rem_pio2(tx, y, e0, nx, 2, two_over_pi);
if(hx < 0) {
y[0] = -y[0];
y[1] = -y[1];
return -n;
}
return n;
}

65
external/fdlibm/e_remainder.c vendored Normal file
View File

@@ -0,0 +1,65 @@
/* @(#)e_remainder.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __fdlibm_remainder(x,p)
* Return :
* returns x REM p = x - [x/p]*p as if in infinite
* precise arithmetic, where [x/p] is the (infinite bit)
* integer nearest x/p (in half way case choose the even one).
* Method :
* Based on fmod() return x-[x/p]chopped*p exactlp.
*/
#include "math.h"
static const double zero = 0.0;
double __fdlibm_remainder(double x, double p) {
int hx, hp;
unsigned sx, lx, lp;
double p_half;
hx = __HI(x); /* high word of x */
lx = __LO(x); /* low word of x */
hp = __HI(p); /* high word of p */
lp = __LO(p); /* low word of p */
sx = hx & 0x80000000;
hp &= 0x7fffffff;
hx &= 0x7fffffff;
/* purge off exception values */
if((hp | lp) == 0) return (x * p) / (x * p); /* p = 0 */
if((hx >= 0x7ff00000) || /* x not finite */
((hp >= 0x7ff00000) && /* p is NaN */
(((hp - 0x7ff00000) | lp) != 0)))
return (x * p) / (x * p);
if(hp <= 0x7fdfffff) x = __fdlibm_fmod(x, p + p); /* now x < 2p */
if(((hx - hp) | (lx - lp)) == 0) return zero * x;
x = fabs(x);
p = fabs(p);
if(hp < 0x00200000) {
if(x + x > p) {
x -= p;
if(x + x >= p) x -= p;
}
} else {
p_half = 0.5 * p;
if(x > p_half) {
x -= p;
if(x >= p_half) x -= p;
}
}
__HI(x) ^= sx;
return x;
}

42
external/fdlibm/e_scalb.c vendored Normal file
View File

@@ -0,0 +1,42 @@
/* @(#)e_scalb.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* __fdlibm_scalb(x, fn) is provide for
* passing various standard test suite. One
* should use scalbn() instead.
*/
#include "math.h"
#ifdef _SCALB_INT
double __fdlibm_scalb(double x, int fn)
#else
double __fdlibm_scalb(double x, double fn)
#endif
{
#ifdef _SCALB_INT
return scalbn(x, fn);
#else
if(isnan(x) || isnan(fn)) return x * fn;
if(!finite(fn)) {
if(fn > 0.0) return x * fn;
else
return x / (-fn);
}
if(rint(fn) != fn) return (fn - fn) / (fn - fn);
if(fn > 65000.0) return scalbn(x, 65000);
if(-fn > 65000.0) return scalbn(x, -65000);
return scalbn(x, (int)fn);
#endif
}

72
external/fdlibm/e_sinh.c vendored Normal file
View File

@@ -0,0 +1,72 @@
/* @(#)e_sinh.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __fdlibm_sinh(x)
* Method :
* mathematically sinh(x) if defined to be (exp(x)-exp(-x))/2
* 1. Replace x by |x| (sinh(-x) = -sinh(x)).
* 2.
* E + E/(E+1)
* 0 <= x <= 22 : sinh(x) := --------------, E=expm1(x)
* 2
*
* 22 <= x <= lnovft : sinh(x) := exp(x)/2
* lnovft <= x <= ln2ovft: sinh(x) := exp(x/2)/2 * exp(x/2)
* ln2ovft < x : sinh(x) := x*shugev (overflow)
*
* Special cases:
* sinh(x) is |x| if x is +INF, -INF, or NaN.
* only sinh(0)=0 is exact for finite x.
*/
#include "math.h"
static const double one = 1.0, shugev = 1.0e307;
double __fdlibm_sinh(double x) {
double t, w, h;
int ix, jx;
unsigned lx;
/* High word of |x|. */
jx = __HI(x);
ix = jx & 0x7fffffff;
/* x is INF or NaN */
if(ix >= 0x7ff00000) return x + x;
h = 0.5;
if(jx < 0) h = -h;
/* |x| in [0,22], return sign(x)*0.5*(E+E/(E+1))) */
if(ix < 0x40360000) { /* |x|<22 */
if(ix < 0x3e300000) /* |x|<2**-28 */
if(shugev + x > one) return x; /* sinh(tinyv) = tinyv with inexact */
t = expm1(fabs(x));
if(ix < 0x3ff00000) return h * (2.0 * t - t * t / (t + one));
return h * (t + t / (t + one));
}
/* |x| in [22, log(maxdouble)] return 0.5*exp(|x|) */
if(ix < 0x40862E42) return h * __fdlibm_exp(fabs(x));
/* |x| in [log(maxdouble), overflowthresold] */
lx = *((((*(unsigned*)&one) >> 29)) + (unsigned*)&x);
if(ix < 0x408633CE || (ix == 0x408633ce) && (lx <= (unsigned)0x8fb9f87d)) {
w = __fdlibm_exp(0.5 * fabs(x));
t = h * w;
return t * w;
}
/* |x| > overflowthresold, sinh(x) overflow */
return x * shugev;
}

442
external/fdlibm/e_sqrt.c vendored Normal file
View File

@@ -0,0 +1,442 @@
/* @(#)e_sqrt.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __fdlibm_sqrt(x)
* Return correctly rounded sqrt.
* ------------------------------------------
* | Use the hardware sqrt if you have one |
* ------------------------------------------
* Method:
* Bit by bit method using integer arithmetic. (Slow, but portable)
* 1. Normalization
* Scale x to y in [1,4) with even powers of 2:
* find an integer k such that 1 <= (y=x*2^(2k)) < 4, then
* sqrt(x) = 2^k * sqrt(y)
* 2. Bit by bit computation
* Let q = sqrt(y) truncated to i bit after binary point (q = 1),
* i 0
* i+1 2
* s = 2*q , and y = 2 * ( y - q ). (1)
* i i i i
*
* To compute q from q , one checks whether
* i+1 i
*
* -(i+1) 2
* (q + 2 ) <= y. (2)
* i
* -(i+1)
* If (2) is false, then q = q ; otherwise q = q + 2 .
* i+1 i i+1 i
*
* With some algebric manipulation, it is not difficult to see
* that (2) is equivalent to
* -(i+1)
* s + 2 <= y (3)
* i i
*
* The advantage of (3) is that s and y can be computed by
* i i
* the following recurrence formula:
* if (3) is false
*
* s = s , y = y ; (4)
* i+1 i i+1 i
*
* otherwise,
* -i -(i+1)
* s = s + 2 , y = y - s - 2 (5)
* i+1 i i+1 i i
*
* One may easily use induction to prove (4) and (5).
* Note. Since the left hand side of (3) contain only i+2 bits,
* it does not necessary to do a full (53-bit) comparison
* in (3).
* 3. Final rounding
* After generating the 53 bits result, we compute one more bit.
* Together with the remainder, we can decide whether the
* result is exact, bigger than 1/2ulp, or less than 1/2ulp
* (it will never equal to 1/2ulp).
* The rounding mode can be detected by checking whether
* hugev + tinyv is equal to hugev, and whether hugev - tinyv is
* equal to hugev for some floating point number "hugev" and "tinyv".
*
* Special cases:
* sqrt(+-0) = +-0 ... exact
* sqrt(inf) = inf
* sqrt(-ve) = NaN ... with invalid signal
* sqrt(NaN) = NaN ... with invalid signal for signaling NaN
*
* Other methods : see the appended file at the end of the program below.
*---------------
*/
#include "math.h"
static const double one = 1.0, tinyv = 1.0e-300;
double __fdlibm_sqrt(double x) {
double z;
int sign = (int)0x80000000;
unsigned r, t1, s1, ix1, q1;
int ix0, s0, q, m, t, i;
ix0 = __HI(x); /* high word of x */
ix1 = __LO(x); /* low word of x */
/* take care of Inf and NaN */
if((ix0 & 0x7ff00000) == 0x7ff00000) {
return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf
sqrt(-inf)=sNaN */
}
/* take care of zero */
if(ix0 <= 0) {
if(((ix0 & (~sign)) | ix1) == 0) return x; /* sqrt(+-0) = +-0 */
else if(ix0 < 0)
return (x - x) / (x - x); /* sqrt(-ve) = sNaN */
}
/* normalize x */
m = (ix0 >> 20);
if(m == 0) { /* subnormal x */
while(ix0 == 0) {
m -= 21;
ix0 |= (ix1 >> 11);
ix1 <<= 21;
}
for(i = 0; (ix0 & 0x00100000) == 0; i++) ix0 <<= 1;
m -= i - 1;
ix0 |= (ix1 >> (32 - i));
ix1 <<= i;
}
m -= 1023; /* unbias exponent */
ix0 = (ix0 & 0x000fffff) | 0x00100000;
if(m & 1) { /* odd m, double x to make it even */
ix0 += ix0 + ((ix1 & sign) >> 31);
ix1 += ix1;
}
m >>= 1; /* m = [m/2] */
/* generate sqrt(x) bit by bit */
ix0 += ix0 + ((ix1 & sign) >> 31);
ix1 += ix1;
q = q1 = s0 = s1 = 0; /* [q,q1] = sqrt(x) */
r = 0x00200000; /* r = moving bit from right to left */
while(r != 0) {
t = s0 + r;
if(t <= ix0) {
s0 = t + r;
ix0 -= t;
q += r;
}
ix0 += ix0 + ((ix1 & sign) >> 31);
ix1 += ix1;
r >>= 1;
}
r = sign;
while(r != 0) {
t1 = s1 + r;
t = s0;
if((t < ix0) || ((t == ix0) && (t1 <= ix1))) {
s1 = t1 + r;
if(((t1 & sign) == sign) && (s1 & sign) == 0) s0 += 1;
ix0 -= t;
if(ix1 < t1) ix0 -= 1;
ix1 -= t1;
q1 += r;
}
ix0 += ix0 + ((ix1 & sign) >> 31);
ix1 += ix1;
r >>= 1;
}
/* use floating add to find out rounding direction */
if((ix0 | ix1) != 0) {
z = one - tinyv; /* trigger inexact flag */
if(z >= one) {
z = one + tinyv;
if(q1 == (unsigned)0xffffffff) {
q1 = 0;
q += 1;
} else if(z > one) {
if(q1 == (unsigned)0xfffffffe) q += 1;
q1 += 2;
} else
q1 += (q1 & 1);
}
}
ix0 = (q >> 1) + 0x3fe00000;
ix1 = q1 >> 1;
if((q & 1) == 1) ix1 |= sign;
ix0 += (m << 20);
__HI(z) = ix0;
__LO(z) = ix1;
return z;
}
/*
Other methods (use floating-point arithmetic)
-------------
(This is a copy of a drafted paper by Prof W. Kahan
and K.C. Ng, written in May, 1986)
Two algorithms are given here to implement sqrt(x)
(IEEE double precision arithmetic) in software.
Both supply sqrt(x) correctly rounded. The first algorithm (in
Section A) uses newton iterations and involves four divisions.
The second one uses reciproot iterations to avoid division, but
requires more multiplications. Both algorithms need the ability
to chop results of arithmetic operations instead of round them,
and the INEXACT flag to indicate when an arithmetic operation
is executed exactly with no roundoff error, all part of the
standard (IEEE 754-1985). The ability to perform shift, add,
subtract and logical AND operations upon 32-bit words is needed
too, though not part of the standard.
A. sqrt(x) by Newton Iteration
(1) Initial approximation
Let x0 and x1 be the leading and the trailing 32-bit words of
a floating point number x (in IEEE double format) respectively
1 11 52 ...widths
------------------------------------------------------
x: |s| e | f |
------------------------------------------------------
msb lsb msb lsb ...order
------------------------ ------------------------
x0: |s| e | f1 | x1: | f2 |
------------------------ ------------------------
By performing shifts and subtracts on x0 and x1 (both regarded
as integers), we obtain an 8-bit approximation of sqrt(x) as
follows.
k := (x0>>1) + 0x1ff80000;
y0 := k - T1[31&(k>>15)]. ... y ~ sqrt(x) to 8 bits
Here k is a 32-bit integer and T1[] is an integer array containing
correction terms. Now magically the floating value of y (y's
leading 32-bit word is y0, the value of its trailing word is 0)
approximates sqrt(x) to almost 8-bit.
Value of T1:
static int T1[32]= {
0, 1024, 3062, 5746, 9193, 13348, 18162, 23592,
29598, 36145, 43202, 50740, 58733, 67158, 75992, 85215,
83599, 71378, 60428, 50647, 41945, 34246, 27478, 21581,
16499, 12183, 8588, 5674, 3403, 1742, 661, 130,};
(2) Iterative refinement
Apply Heron's rule three times to y, we have y approximates
sqrt(x) to within 1 ulp (Unit in the Last Place):
y := (y+x/y)/2 ... almost 17 sig. bits
y := (y+x/y)/2 ... almost 35 sig. bits
y := y-(y-x/y)/2 ... within 1 ulp
Remark 1.
Another way to improve y to within 1 ulp is:
y := (y+x/y) ... almost 17 sig. bits to 2*sqrt(x)
y := y - 0x00100006 ... almost 18 sig. bits to sqrt(x)
2
(x-y )*y
y := y + 2* ---------- ...within 1 ulp
2
3y + x
This formula has one division fewer than the one above; however,
it requires more multiplications and additions. Also x must be
scaled in advance to avoid spurious overflow in evaluating the
expression 3y*y+x. Hence it is not recommended uless division
is slow. If division is very slow, then one should use the
reciproot algorithm given in section B.
(3) Final adjustment
By twiddling y's last bit it is possible to force y to be
correctly rounded according to the prevailing rounding mode
as follows. Let r and i be copies of the rounding mode and
inexact flag before entering the square root program. Also we
use the expression y+-ulp for the next representable floating
numbers (up and down) of y. Note that y+-ulp = either fixed
point y+-1, or multiply y by nextafter(1,+-inf) in chopped
mode.
I := FALSE; ... reset INEXACT flag I
R := RZ; ... set rounding mode to round-toward-zero
z := x/y; ... chopped quotient, possibly inexact
If(not I) then { ... if the quotient is exact
if(z=y) {
I := i; ... restore inexact flag
R := r; ... restore rounded mode
return sqrt(x):=y.
} else {
z := z - ulp; ... special rounding
}
}
i := TRUE; ... sqrt(x) is inexact
If (r=RN) then z=z+ulp ... rounded-to-nearest
If (r=RP) then { ... round-toward-+inf
y = y+ulp; z=z+ulp;
}
y := y+z; ... chopped sum
y0:=y0-0x00100000; ... y := y/2 is correctly rounded.
I := i; ... restore inexact flag
R := r; ... restore rounded mode
return sqrt(x):=y.
(4) Special cases
Square root of +inf, +-0, or NaN is itself;
Square root of a negative number is NaN with invalid signal.
B. sqrt(x) by Reciproot Iteration
(1) Initial approximation
Let x0 and x1 be the leading and the trailing 32-bit words of
a floating point number x (in IEEE double format) respectively
(see section A). By performing shifs and subtracts on x0 and y0,
we obtain a 7.8-bit approximation of 1/sqrt(x) as follows.
k := 0x5fe80000 - (x0>>1);
y0:= k - T2[63&(k>>14)]. ... y ~ 1/sqrt(x) to 7.8 bits
Here k is a 32-bit integer and T2[] is an integer array
containing correction terms. Now magically the floating
value of y (y's leading 32-bit word is y0, the value of
its trailing word y1 is set to zero) approximates 1/sqrt(x)
to almost 7.8-bit.
Value of T2:
static int T2[64]= {
0x1500, 0x2ef8, 0x4d67, 0x6b02, 0x87be, 0xa395, 0xbe7a, 0xd866,
0xf14a, 0x1091b,0x11fcd,0x13552,0x14999,0x15c98,0x16e34,0x17e5f,
0x18d03,0x19a01,0x1a545,0x1ae8a,0x1b5c4,0x1bb01,0x1bfde,0x1c28d,
0x1c2de,0x1c0db,0x1ba73,0x1b11c,0x1a4b5,0x1953d,0x18266,0x16be0,
0x1683e,0x179d8,0x18a4d,0x19992,0x1a789,0x1b445,0x1bf61,0x1c989,
0x1d16d,0x1d77b,0x1dddf,0x1e2ad,0x1e5bf,0x1e6e8,0x1e654,0x1e3cd,
0x1df2a,0x1d635,0x1cb16,0x1be2c,0x1ae4e,0x19bde,0x1868e,0x16e2e,
0x1527f,0x1334a,0x11051,0xe951, 0xbe01, 0x8e0d, 0x5924, 0x1edd,};
(2) Iterative refinement
Apply Reciproot iteration three times to y and multiply the
result by x to get an approximation z that matches sqrt(x)
to about 1 ulp. To be exact, we will have
-1ulp < sqrt(x)-z<1.0625ulp.
... set rounding mode to Round-to-nearest
y := y*(1.5-0.5*x*y*y) ... almost 15 sig. bits to 1/sqrt(x)
y := y*((1.5-2^-30)+0.5*x*y*y)... about 29 sig. bits to 1/sqrt(x)
... special arrangement for better accuracy
z := x*y ... 29 bits to sqrt(x), with z*y<1
z := z + 0.5*z*(1-z*y) ... about 1 ulp to sqrt(x)
Remark 2. The constant 1.5-2^-30 is chosen to bias the error so that
(a) the term z*y in the final iteration is always less than 1;
(b) the error in the final result is biased upward so that
-1 ulp < sqrt(x) - z < 1.0625 ulp
instead of |sqrt(x)-z|<1.03125ulp.
(3) Final adjustment
By twiddling y's last bit it is possible to force y to be
correctly rounded according to the prevailing rounding mode
as follows. Let r and i be copies of the rounding mode and
inexact flag before entering the square root program. Also we
use the expression y+-ulp for the next representable floating
numbers (up and down) of y. Note that y+-ulp = either fixed
point y+-1, or multiply y by nextafter(1,+-inf) in chopped
mode.
R := RZ; ... set rounding mode to round-toward-zero
switch(r) {
case RN: ... round-to-nearest
if(x<= z*(z-ulp)...chopped) z = z - ulp; else
if(x<= z*(z+ulp)...chopped) z = z; else z = z+ulp;
break;
case RZ:case RM: ... round-to-zero or round-to--inf
R:=RP; ... reset rounding mod to round-to-+inf
if(x<z*z ... rounded up) z = z - ulp; else
if(x>=(z+ulp)*(z+ulp) ...rounded up) z = z+ulp;
break;
case RP: ... round-to-+inf
if(x>(z+ulp)*(z+ulp)...chopped) z = z+2*ulp; else
if(x>z*z ...chopped) z = z+ulp;
break;
}
Remark 3. The above comparisons can be done in fixed point. For
example, to compare x and w=z*z chopped, it suffices to compare
x1 and w1 (the trailing parts of x and w), regarding them as
two's complement integers.
...Is z an exact square root?
To determine whether z is an exact square root of x, let z1 be the
trailing part of z, and also let x0 and x1 be the leading and
trailing parts of x.
If ((z1&0x03ffffff)!=0) ... not exact if trailing 26 bits of z!=0
I := 1; ... Raise Inexact flag: z is not exact
else {
j := 1 - [(x0>>20)&1] ... j = logb(x) mod 2
k := z1 >> 26; ... get z's 25-th and 26-th
fraction bits
I := i or (k&j) or ((k&(j+j+1))!=(x1&3));
}
R:= r ... restore rounded mode
return sqrt(x):=z.
If multiplication is cheaper then the foregoing red tape, the
Inexact flag can be evaluated by
I := i;
I := (z*z!=x) or I.
Note that z*z can overwrite I; this value must be sensed if it is
True.
Remark 4. If z*z = x exactly, then bit 25 to bit 0 of z1 must be
zero.
--------------------
z1: | f2 |
--------------------
bit 31 bit 0
Further more, bit 27 and 26 of z1, bit 0 and 1 of x1, and the odd
or even of logb(x) have the following relations:
-------------------------------------------------
bit 27,26 of z1 bit 1,0 of x1 logb(x)
-------------------------------------------------
00 00 odd and even
01 01 even
10 10 odd
10 00 even
11 01 even
-------------------------------------------------
(4) Special cases (see (4) of Section A).
*/

82
external/fdlibm/k_cos.c vendored Normal file
View File

@@ -0,0 +1,82 @@
/* @(#)k_cos.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* __fdlibm_kernel_cos( x, y )
* kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
*
* Algorithm
* 1. Since cos(-x) = cos(x), we need only to consider positive x.
* 2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0.
* 3. cos(x) is approximated by a polynomial of degree 14 on
* [0,pi/4]
* 4 14
* cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x
* where the remez error is
*
* | 2 4 6 8 10 12 14 | -58
* |cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x +C6*x )| <= 2
* | |
*
* 4 6 8 10 12 14
* 4. let r = C1*x +C2*x +C3*x +C4*x +C5*x +C6*x , then
* cos(x) = 1 - x*x/2 + r
* since cos(x+y) ~ cos(x) - sin(x)*y
* ~ cos(x) - x*y,
* a correction term is necessary in cos(x) and hence
* cos(x+y) = 1 - (x*x/2 - (r - x*y))
* For better accuracy when x > 0.3, let qx = |x|/4 with
* the last 32 bits mask off, and if x > 0.78125, let qx = 0.28125.
* Then
* cos(x+y) = (1-qx) - ((x*x/2-qx) - (r-x*y)).
* Note that 1-qx and (x*x/2-qx) is EXACT here, and the
* magnitude of the latter is at least a quarter of x*x/2,
* thus, reducing the rounding error in the subtraction.
*/
#include "math.h"
static const double
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
C1 = 4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */
C2 = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */
C3 = 2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */
C4 = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */
C5 = 2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */
C6 = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */
double __fdlibm_kernel_cos(double x, double y) {
double a, hz, z, r, qx;
int ix;
ix = __HI(x) & 0x7fffffff; /* ix = |x|'s high word*/
if(ix < 0x3e400000) { /* if x < 2**27 */
if(((int)x) == 0) return one; /* generate inexact */
}
z = x * x;
r = z * (C1 + z * (C2 + z * (C3 + z * (C4 + z * (C5 + z * C6)))));
if(ix < 0x3FD33333) /* if |x| < 0.3 */
return one - (0.5 * z - (z * r - x * y));
else {
if(ix > 0x3fe90000) { /* x > 0.78125 */
qx = 0.28125;
} else {
__HI(qx) = ix - 0x00200000; /* x/4 */
__LO(qx) = 0;
}
hz = 0.5 * z - qx;
a = one - qx;
return a - (hz - (z * r - x * y));
}
}

318
external/fdlibm/k_rem_pio2.c vendored Normal file
View File

@@ -0,0 +1,318 @@
/* @(#)k_rem_pio2.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* __fdlibm_kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
* double x[],y[]; int e0,nx,prec; int ipio2[];
*
* __fdlibm_kernel_rem_pio2 return the last three digits of N with
* y = x - N*pi/2
* so that |y| < pi/2.
*
* The method is to compute the integer (mod 8) and fraction parts of
* (2/pi)*x without doing the full multiplication. In general we
* skip the part of the product that are known to be a hugev integer (
* more accurately, = 0 mod 8 ). Thus the number of operations are
* independent of the exponent of the input.
*
* (2/pi) is represented by an array of 24-bit integers in ipio2[].
*
* Input parameters:
* x[] The input value (must be positive) is broken into nx
* pieces of 24-bit integers in double precision format.
* x[i] will be the i-th 24 bit of x. The scaled exponent
* of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
* match x's up to 24 bits.
*
* Example of breaking a double positive z into x[0]+x[1]+x[2]:
* e0 = ilogb(z)-23
* z = scalbn(z,-e0)
* for i = 0,1,2
* x[i] = floor(z)
* z = (z-x[i])*2**24
*
*
* y[] ouput result in an array of double precision numbers.
* The dimension of y[] is:
* 24-bit precision 1
* 53-bit precision 2
* 64-bit precision 2
* 113-bit precision 3
* The actual value is the sum of them. Thus for 113-bit
* precison, one may have to do something like:
*
* long double t,w,r_head, r_tail;
* t = (long double)y[2] + (long double)y[1];
* w = (long double)y[0];
* r_head = t+w;
* r_tail = w - (r_head - t);
*
* e0 The exponent of x[0]
*
* nx dimension of x[]
*
* prec an integer indicating the precision:
* 0 24 bits (single)
* 1 53 bits (double)
* 2 64 bits (extended)
* 3 113 bits (quad)
*
* ipio2[]
* integer array, contains the (24*i)-th to (24*i+23)-th
* bit of 2/pi after binary point. The corresponding
* floating value is
*
* ipio2[i] * 2^(-24(i+1)).
*
* External function:
* double scalbn(), floor();
*
*
* Here is the description of some local variables:
*
* jk jk+1 is the initial number of terms of ipio2[] needed
* in the computation. The recommended value is 2,3,4,
* 6 for single, double, extended,and quad.
*
* jz local integer variable indicating the number of
* terms of ipio2[] used.
*
* jx nx - 1
*
* jv index for pointing to the suitable ipio2[] for the
* computation. In general, we want
* ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
* is an integer. Thus
* e0-3-24*jv >= 0 or (e0-3)/24 >= jv
* Hence jv = max(0,(e0-3)/24).
*
* jp jp+1 is the number of terms in PIo2[] needed, jp = jk.
*
* q[] double array with integral value, representing the
* 24-bits chunk of the product of x and 2/pi.
*
* q0 the corresponding exponent of q[0]. Note that the
* exponent for q[i] would be q0-24*i.
*
* PIo2[] double precision array, obtained by cutting pi/2
* into 24 bits chunks.
*
* f[] ipio2[] in floating point
*
* iq[] integer array by breaking up q[] in 24-bits chunk.
*
* fq[] final product of x*(2/pi) in fq[0],..,fq[jk]
*
* ih integer. If >0 it indicates q[] is >= 0.5, hence
* it also indicates the *sign* of the result.
*
*/
/*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "math.h"
static const int init_jk[] = {2, 3, 4, 6}; /* initial value for jk */
static const double PIo2[] = {
1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
};
static const double
zero = 0.0,
one = 1.0,
two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
twon24 = 5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */
int __fdlibm_kernel_rem_pio2(double* x, double* y, int e0, int nx, int prec, const int* ipio2) {
int jz, jx, jv, jp, jk, carry, n, iq[20], i, j, k, m, q0, ih;
double z, fw, f[20], fq[20], q[20];
/* initialize jk*/
jk = init_jk[prec];
jp = jk;
/* determine jx,jv,q0, note that 3>q0 */
jx = nx - 1;
jv = (e0 - 3) / 24;
if(jv < 0) jv = 0;
q0 = e0 - 24 * (jv + 1);
/* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
j = jv - jx;
m = jx + jk;
for(i = 0; i <= m; i++, j++) f[i] = (j < 0) ? zero : (double)ipio2[j];
/* compute q[0],q[1],...q[jk] */
for(i = 0; i <= jk; i++) {
for(j = 0, fw = 0.0; j <= jx; j++) fw += x[j] * f[jx + i - j];
q[i] = fw;
}
jz = jk;
recompute:
/* distill q[] into iq[] reversingly */
for(i = 0, j = jz, z = q[jz]; j > 0; i++, j--) {
fw = (double)((int)(twon24 * z));
iq[i] = (int)(z - two24 * fw);
z = q[j - 1] + fw;
}
/* compute n */
z = scalbn(z, q0); /* actual value of z */
z -= 8.0 * floor(z * 0.125); /* trim off integer >= 8 */
n = (int)z;
z -= (double)n;
ih = 0;
if(q0 > 0) { /* need iq[jz-1] to determine n */
i = (iq[jz - 1] >> (24 - q0));
n += i;
iq[jz - 1] -= i << (24 - q0);
ih = iq[jz - 1] >> (23 - q0);
} else if(q0 == 0)
ih = iq[jz - 1] >> 23;
else if(z >= 0.5)
ih = 2;
if(ih > 0) { /* q > 0.5 */
n += 1;
carry = 0;
for(i = 0; i < jz; i++) { /* compute 1-q */
j = iq[i];
if(carry == 0) {
if(j != 0) {
carry = 1;
iq[i] = 0x1000000 - j;
}
} else
iq[i] = 0xffffff - j;
}
if(q0 > 0) { /* rare case: chance is 1 in 12 */
switch(q0) {
case 1:
iq[jz - 1] &= 0x7fffff;
break;
case 2:
iq[jz - 1] &= 0x3fffff;
break;
}
}
if(ih == 2) {
z = one - z;
if(carry != 0) z -= scalbn(one, q0);
}
}
/* check if recomputation is needed */
if(z == zero) {
j = 0;
for(i = jz - 1; i >= jk; i--) j |= iq[i];
if(j == 0) { /* need recomputation */
for(k = 1; iq[jk - k] == 0; k++); /* k = no. of terms needed */
for(i = jz + 1; i <= jz + k; i++) { /* add q[jz+1] to q[jz+k] */
f[jx + i] = (double)ipio2[jv + i];
for(j = 0, fw = 0.0; j <= jx; j++) fw += x[j] * f[jx + i - j];
q[i] = fw;
}
jz += k;
goto recompute;
}
}
/* chop off zero terms */
if(z == 0.0) {
jz -= 1;
q0 -= 24;
while(iq[jz] == 0) {
jz--;
q0 -= 24;
}
} else { /* break z into 24-bit if necessary */
z = scalbn(z, -q0);
if(z >= two24) {
fw = (double)((int)(twon24 * z));
iq[jz] = (int)(z - two24 * fw);
jz += 1;
q0 += 24;
iq[jz] = (int)fw;
} else
iq[jz] = (int)z;
}
/* convert integer "bit" chunk to floating-point value */
fw = scalbn(one, q0);
for(i = jz; i >= 0; i--) {
q[i] = fw * (double)iq[i];
fw *= twon24;
}
/* compute PIo2[0,...,jp]*q[jz,...,0] */
for(i = jz; i >= 0; i--) {
for(fw = 0.0, k = 0; k <= jp && k <= jz - i; k++) fw += PIo2[k] * q[i + k];
fq[jz - i] = fw;
}
/* compress fq[] into y[] */
switch(prec) {
case 0:
fw = 0.0;
for(i = jz; i >= 0; i--) fw += fq[i];
y[0] = (ih == 0) ? fw : -fw;
break;
case 1:
case 2:
fw = 0.0;
for(i = jz; i >= 0; i--) fw += fq[i];
y[0] = (ih == 0) ? fw : -fw;
fw = fq[0] - fw;
for(i = 1; i <= jz; i++) fw += fq[i];
y[1] = (ih == 0) ? fw : -fw;
break;
case 3: /* painful */
for(i = jz; i > 0; i--) {
fw = fq[i - 1] + fq[i];
fq[i] += fq[i - 1] - fw;
fq[i - 1] = fw;
}
for(i = jz; i > 1; i--) {
fw = fq[i - 1] + fq[i];
fq[i] += fq[i - 1] - fw;
fq[i - 1] = fw;
}
for(fw = 0.0, i = jz; i >= 2; i--) fw += fq[i];
if(ih == 0) {
y[0] = fq[0];
y[1] = fq[1];
y[2] = fw;
} else {
y[0] = -fq[0];
y[1] = -fq[1];
y[2] = -fw;
}
}
return n & 7;
}

67
external/fdlibm/k_sin.c vendored Normal file
View File

@@ -0,0 +1,67 @@
/* @(#)k_sin.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* __fdlibm_kernel_sin( x, y, iy)
* kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
* Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
*
* Algorithm
* 1. Since sin(-x) = -sin(x), we need only to consider positive x.
* 2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0.
* 3. sin(x) is approximated by a polynomial of degree 13 on
* [0,pi/4]
* 3 13
* sin(x) ~ x + S1*x + ... + S6*x
* where
*
* |sin(x) 2 4 6 8 10 12 | -58
* |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2
* | x |
*
* 4. sin(x+y) = sin(x) + sin'(x')*y
* ~ sin(x) + (1-x*x/2)*y
* For better accuracy, let
* 3 2 2 2 2
* r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
* then 3 2
* sin(x) = x + (S1*x + (x *(r-y/2)+y))
*/
#include "math.h"
static const double
half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */
S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */
S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */
S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */
S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */
S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */
double __fdlibm_kernel_sin(double x, double y, int iy) {
double z, r, v;
int ix;
ix = __HI(x) & 0x7fffffff; /* high word of x */
if(ix < 0x3e400000) /* |x| < 2**-27 */
{
if((int)x == 0) return x;
} /* generate inexact */
z = x * x;
v = z * x;
r = S2 + z * (S3 + z * (S4 + z * (S5 + z * S6)));
if(iy == 0) return x + v * (S1 + z * r);
else
return x - ((z * (half * y - v * r) - y) - v * S1);
}

146
external/fdlibm/k_tan.c vendored Normal file
View File

@@ -0,0 +1,146 @@
/*
* ====================================================
* Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* INDENT OFF */
/* __fdlibm_kernel_tan( x, y, k )
* kernel tan function on [-pi/4, pi/4], pi/4 ~ 0.7854
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
* Input k indicates whether tan (if k = 1) or -1/tan (if k = -1) is returned.
*
* Algorithm
* 1. Since tan(-x) = -tan(x), we need only to consider positive x.
* 2. if x < 2^-28 (hx<0x3e300000 0), return x with inexact if x!=0.
* 3. tan(x) is approximated by a odd polynomial of degree 27 on
* [0,0.67434]
* 3 27
* tan(x) ~ x + T1*x + ... + T13*x
* where
*
* |tan(x) 2 4 26 | -59.2
* |----- - (1+T1*x +T2*x +.... +T13*x )| <= 2
* | x |
*
* Note: tan(x+y) = tan(x) + tan'(x)*y
* ~ tan(x) + (1+x*x)*y
* Therefore, for better accuracy in computing tan(x+y), let
* 3 2 2 2 2
* r = x *(T2+x *(T3+x *(...+x *(T12+x *T13))))
* then
* 3 2
* tan(x+y) = x + (T1*x + (x *(r+y)+y))
*
* 4. For x in [0.67434,pi/4], let y = pi/4 - x, then
* tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))
* = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
*/
#include "math.h"
static const double xxx[] = {
3.33333333333334091986e-01, /* 3FD55555, 55555563 */
1.33333333333201242699e-01, /* 3FC11111, 1110FE7A */
5.39682539762260521377e-02, /* 3FABA1BA, 1BB341FE */
2.18694882948595424599e-02, /* 3F9664F4, 8406D637 */
8.86323982359930005737e-03, /* 3F8226E3, E96E8493 */
3.59207910759131235356e-03, /* 3F6D6D22, C9560328 */
1.45620945432529025516e-03, /* 3F57DBC8, FEE08315 */
5.88041240820264096874e-04, /* 3F4344D8, F2F26501 */
2.46463134818469906812e-04, /* 3F3026F7, 1A8D1068 */
7.81794442939557092300e-05, /* 3F147E88, A03792A6 */
7.14072491382608190305e-05, /* 3F12B80F, 32F0A7E9 */
-1.85586374855275456654e-05, /* BEF375CB, DB605373 */
2.59073051863633712884e-05, /* 3EFB2A70, 74BF7AD4 */
/* one */ 1.00000000000000000000e+00, /* 3FF00000, 00000000 */
/* pio4 */ 7.85398163397448278999e-01, /* 3FE921FB, 54442D18 */
/* pio4lo */ 3.06161699786838301793e-17 /* 3C81A626, 33145C07 */
};
#define one xxx[13]
#define pio4 xxx[14]
#define pio4lo xxx[15]
#define T xxx
/* INDENT ON */
double
__fdlibm_kernel_tan(double x, double y, int iy) {
double z, r, v, w, s;
int ix, hx;
hx = __HI(x); /* high word of x */
ix = hx & 0x7fffffff; /* high word of |x| */
if(ix < 0x3e300000) { /* x < 2**-28 */
if((int)x == 0) { /* generate inexact */
if(((ix | __LO(x)) | (iy + 1)) == 0)
return one / fabs(x);
else {
if(iy == 1)
return x;
else { /* compute -1 / (x+y) carefully */
double a, t;
z = w = x + y;
__LO(z) = 0;
v = y - (z - x);
t = a = -one / w;
__LO(t) = 0;
s = one + t * z;
return t + a * (s + t * v);
}
}
}
}
if(ix >= 0x3FE59428) { /* |x| >= 0.6744 */
if(hx < 0) {
x = -x;
y = -y;
}
z = pio4 - x;
w = pio4lo - y;
x = z + w;
y = 0.0;
}
z = x * x;
w = z * z;
/*
* Break x^5*(T[1]+x^2*T[2]+...) into
* x^5(T[1]+x^4*T[3]+...+x^20*T[11]) +
* x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12]))
*/
r = T[1] + w * (T[3] + w * (T[5] + w * (T[7] + w * (T[9] +
w * T[11]))));
v = z * (T[2] + w * (T[4] + w * (T[6] + w * (T[8] + w * (T[10] +
w * T[12])))));
s = z * x;
r = y + z * (s * (r + v) + y);
r += T[0] * s;
w = x + r;
if(ix >= 0x3FE59428) {
v = (double)iy;
return (double)(1 - ((hx >> 30) & 2)) *
(v - 2.0 * (x - (w * w / (w + v) - r)));
}
if(iy == 1)
return w;
else {
/*
* if allow error up to 2 ulp, simply return
* -1.0 / (x+r) here
*/
/* compute -1.0 / (x+r) accurately */
double a, t;
z = w;
__LO(z) = 0;
v = r - (z - x); /* z+v = r+x */
t = a = -1.0 / w; /* a = -1.0/w */
__LO(t) = 0;
s = 1.0 + t * z;
return t + a * (s + t * v);
}
}

245
external/fdlibm/math.h vendored Normal file
View File

@@ -0,0 +1,245 @@
/* @(#)fdlibm.h 1.5 04/04/22 */
/*
* ====================================================
* Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
*
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#ifndef _MATH_H_
#define _MATH_H_
/* Sometimes it's necessary to define __LITTLE_ENDIAN explicitly
but these catch some common cases. */
#if defined(__WATCOMC__) || defined(_MSC_VER) || defined(i386) || defined(i486) || defined(intel) || defined(x86) || defined(i86pc) || defined(__alpha) || defined(__osf__) || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#define __LITTLE_ENDIAN
#endif
#ifdef __LITTLE_ENDIAN
#define __HI(x) *(1 + (int*)&x)
#define __LO(x) *(int*)&x
#define __HIp(x) *(1 + (int*)x)
#define __LOp(x) *(int*)x
#else
#define __HI(x) *(int*)&x
#define __LO(x) *(1 + (int*)&x)
#define __HIp(x) *(int*)x
#define __LOp(x) *(1 + (int*)x)
#endif
#define signgam fdlibm_signgam
#define acos fdlibm_acos
#define asin fdlibm_asin
#define atan fdlibm_atan
#define atan2 fdlibm_atan2
#define cos fdlibm_cos
#define sin fdlibm_sin
#define tan fdlibm_tan
#define cosh fdlibm_cosh
#define sinh fdlibm_sinh
#define tanh fdlibm_tanh
#define exp fdlibm_exp
#define frexp fdlibm_frexp
#define ldexp fdlibm_ldexp
#define log fdlibm_log
#define log10 fdlibm_log10
#define modf fdlibm_modf
#define pow fdlibm_pow
#define sqrt fdlibm_sqrt
#define ceil fdlibm_ceil
#define fabs fdlibm_fabs
#define floor fdlibm_floor
#define fmod fdlibm_fmod
#define erf fdlibm_erf
#define erfc fdlibm_erfc
#define gamma fdlibm_gamma
#define hypot fdlibm_hypot
#define isnan fdlibm_isnan
#define finite fdlibm_finite
#define j0 fdlibm_j0
#define j1 fdlibm_j1
#define jn fdlibm_jn
#define lgamma fdlibm_lgamma
#define y0 fdlibm_y0
#define y1 fdlibm_y1
#define yn fdlibm_yn
#define acosh fdlibm_acosh
#define asinh fdlibm_asinh
#define atanh fdlibm_atanh
#define cbrt fdlibm_cbrt
#define logb fdlibm_logb
#define nextafter fdlibm_nextafter
#define remainder fdlibm_remainder
#define scalb fdlibm_scalb
#define significand fdlibm_significand
#define copysign fdlibm_copysign
#define ilogb fdlibm_ilogb
#define rint fdlibm_rint
#define scalbn fdlibm_scalbn
#define expm1 fdlibm_expm1
#define log1p fdlibm_log1p
/*
* ANSI/POSIX
*/
extern int signgam;
#define MAXFLOAT ((float)3.40282346638528860e+38)
#define HUGE MAXFLOAT
/*
* set X_TLOSS = pi*2**52, which is possibly defined in <values.h>
* (one may replace the following line by "#include <values.h>")
*/
#define X_TLOSS 1.41484755040568800000e+16
#define DOMAIN 1
#define SING 2
#define OVERFLOW 3
#define UNDERFLOW 4
#define TLOSS 5
#define PLOSS 6
/*
* ANSI/POSIX
*/
extern double acos(double);
extern double asin(double);
extern double atan(double);
extern double atan2(double, double);
extern double cos(double);
extern double sin(double);
extern double tan(double);
extern double cosh(double);
extern double sinh(double);
extern double tanh(double);
extern double exp(double);
extern double frexp(double, int*);
extern double ldexp(double, int);
extern double log(double);
extern double log10(double);
extern double modf(double, double*);
extern double pow(double, double);
extern double sqrt(double);
extern double ceil(double);
extern double fabs(double);
extern double floor(double);
extern double fmod(double, double);
extern double erf(double);
extern double erfc(double);
extern double gamma(double);
extern double hypot(double, double);
extern int isnan(double);
extern int finite(double);
extern double j0(double);
extern double j1(double);
extern double jn(int, double);
extern double lgamma(double);
extern double y0(double);
extern double y1(double);
extern double yn(int, double);
extern double acosh(double);
extern double asinh(double);
extern double atanh(double);
extern double cbrt(double);
extern double logb(double);
extern double nextafter(double, double);
extern double remainder(double, double);
extern double scalb(double, double);
/*
* IEEE Test Vector
*/
extern double significand(double);
/*
* Functions callable from C, intended to support IEEE arithmetic.
*/
extern double copysign(double, double);
extern int ilogb(double);
extern double rint(double);
extern double scalbn(double, int);
/*
* BSD math library entry points
*/
extern double expm1(double);
extern double log1p(double);
/*
* Reentrant version of gamma & lgamma; passes signgam back by reference
* as the second argument; user must allocate space for signgam.
*/
#ifdef _REENTRANT
#define gamma_r fdlibm_gamma_r
#define lgamma_r fdlibm_lgamma_r
extern double gamma_r(double, int*);
extern double lgamma_r(double, int*);
#endif /* _REENTRANT */
/* ieee style elementary functions */
extern double __fdlibm_sqrt(double);
extern double __fdlibm_acos(double);
extern double __fdlibm_acosh(double);
extern double __fdlibm_log(double);
extern double __fdlibm_atanh(double);
extern double __fdlibm_asin(double);
extern double __fdlibm_atan2(double, double);
extern double __fdlibm_exp(double);
extern double __fdlibm_cosh(double);
extern double __fdlibm_fmod(double, double);
extern double __fdlibm_pow(double, double);
extern double __fdlibm_lgamma_r(double, int*);
extern double __fdlibm_gamma_r(double, int*);
extern double __fdlibm_lgamma(double);
extern double __fdlibm_gamma(double);
extern double __fdlibm_log10(double);
extern double __fdlibm_sinh(double);
extern double __fdlibm_hypot(double, double);
extern double __fdlibm_j0(double);
extern double __fdlibm_j1(double);
extern double __fdlibm_y0(double);
extern double __fdlibm_y1(double);
extern double __fdlibm_jn(int, double);
extern double __fdlibm_yn(int, double);
extern double __fdlibm_remainder(double, double);
extern int __fdlibm_rem_pio2(double, double*);
#ifdef _SCALB_INT
extern double __fdlibm_scalb(double, int);
#else
extern double __fdlibm_scalb(double, double);
#endif
/* fdlibm kernel function */
extern double __fdlibm_kernel_sin(double, double, int);
extern double __fdlibm_kernel_cos(double, double);
extern double __fdlibm_kernel_tan(double, double, int);
extern int __fdlibm_kernel_rem_pio2(double*, double*, int, int, int, const int*);
#endif

53
external/fdlibm/s_asinh.c vendored Normal file
View File

@@ -0,0 +1,53 @@
/* @(#)s_asinh.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* asinh(x)
* Method :
* Based on
* asinh(x) = sign(x) * log [ |x| + sqrt(x*x+1) ]
* we have
* asinh(x) := x if 1+x*x=1,
* := sign(x)*(log(x)+ln2)) for large |x|, else
* := sign(x)*log(2|x|+1/(|x|+sqrt(x*x+1))) if|x|>2, else
* := sign(x)*log1p(|x| + x^2/(1 + sqrt(1+x^2)))
*/
#include "math.h"
static const double
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
ln2 = 6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
hugev = 1.00000000000000000000e+300;
double asinh(double x) {
double t, w;
int hx, ix;
hx = __HI(x);
ix = hx & 0x7fffffff;
if(ix >= 0x7ff00000) return x + x; /* x is inf or NaN */
if(ix < 0x3e300000) { /* |x|<2**-28 */
if(hugev + x > one) return x; /* return x inexact except 0 */
}
if(ix > 0x41b00000) { /* |x| > 2**28 */
w = __fdlibm_log(fabs(x)) + ln2;
} else if(ix > 0x40000000) { /* 2**28 > |x| > 2.0 */
t = fabs(x);
w = __fdlibm_log(2.0 * t + one / (sqrt(x * x + one) + t));
} else { /* 2.0 > |x| > 2**-28 */
t = x * x;
w = log1p(fabs(x) + t / (one + sqrt(one + t)));
}
if(hx > 0) return w;
else
return -w;
}

119
external/fdlibm/s_atan.c vendored Normal file
View File

@@ -0,0 +1,119 @@
/* @(#)s_atan.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* atan(x)
* Method
* 1. Reduce x to positive by atan(x) = -atan(-x).
* 2. According to the integer k=4t+0.25 chopped, t=x, the argument
* is further reduced to one of the following intervals and the
* arctangent of t is evaluated by the corresponding formula:
*
* [0,7/16] atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
* [7/16,11/16] atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) )
* [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) )
* [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) )
* [39/16,INF] atan(x) = atan(INF) + atan( -1/t )
*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "math.h"
static const double atanhi[] = {
4.63647609000806093515e-01, /* atan(0.5)hi 0x3FDDAC67, 0x0561BB4F */
7.85398163397448278999e-01, /* atan(1.0)hi 0x3FE921FB, 0x54442D18 */
9.82793723247329054082e-01, /* atan(1.5)hi 0x3FEF730B, 0xD281F69B */
1.57079632679489655800e+00, /* atan(inf)hi 0x3FF921FB, 0x54442D18 */
};
static const double atanlo[] = {
2.26987774529616870924e-17, /* atan(0.5)lo 0x3C7A2B7F, 0x222F65E2 */
3.06161699786838301793e-17, /* atan(1.0)lo 0x3C81A626, 0x33145C07 */
1.39033110312309984516e-17, /* atan(1.5)lo 0x3C700788, 0x7AF0CBBD */
6.12323399573676603587e-17, /* atan(inf)lo 0x3C91A626, 0x33145C07 */
};
static const double aT[] = {
3.33333333333329318027e-01, /* 0x3FD55555, 0x5555550D */
-1.99999999998764832476e-01, /* 0xBFC99999, 0x9998EBC4 */
1.42857142725034663711e-01, /* 0x3FC24924, 0x920083FF */
-1.11111104054623557880e-01, /* 0xBFBC71C6, 0xFE231671 */
9.09088713343650656196e-02, /* 0x3FB745CD, 0xC54C206E */
-7.69187620504482999495e-02, /* 0xBFB3B0F2, 0xAF749A6D */
6.66107313738753120669e-02, /* 0x3FB10D66, 0xA0D03D51 */
-5.83357013379057348645e-02, /* 0xBFADDE2D, 0x52DEFD9A */
4.97687799461593236017e-02, /* 0x3FA97B4B, 0x24760DEB */
-3.65315727442169155270e-02, /* 0xBFA2B444, 0x2C6A6C2F */
1.62858201153657823623e-02, /* 0x3F90AD3A, 0xE322DA11 */
};
static const double
one = 1.0,
hugev = 1.0e300;
double atan(double x) {
double w, s1, s2, z;
int ix, hx, id;
hx = __HI(x);
ix = hx & 0x7fffffff;
if(ix >= 0x44100000) { /* if |x| >= 2^66 */
if(ix > 0x7ff00000 ||
(ix == 0x7ff00000 && (__LO(x) != 0)))
return x + x; /* NaN */
if(hx > 0) return atanhi[3] + atanlo[3];
else
return -atanhi[3] - atanlo[3];
}
if(ix < 0x3fdc0000) { /* |x| < 0.4375 */
if(ix < 0x3e200000) { /* |x| < 2^-29 */
if(hugev + x > one) return x; /* raise inexact */
}
id = -1;
} else {
x = fabs(x);
if(ix < 0x3ff30000) { /* |x| < 1.1875 */
if(ix < 0x3fe60000) { /* 7/16 <=|x|<11/16 */
id = 0;
x = (2.0 * x - one) / (2.0 + x);
} else { /* 11/16<=|x|< 19/16 */
id = 1;
x = (x - one) / (x + one);
}
} else {
if(ix < 0x40038000) { /* |x| < 2.4375 */
id = 2;
x = (x - 1.5) / (one + 1.5 * x);
} else { /* 2.4375 <= |x| < 2^66 */
id = 3;
x = -1.0 / x;
}
}
}
/* end of argument reduction */
z = x * x;
w = z * z;
/* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */
s1 = z * (aT[0] + w * (aT[2] + w * (aT[4] + w * (aT[6] + w * (aT[8] + w * aT[10])))));
s2 = w * (aT[1] + w * (aT[3] + w * (aT[5] + w * (aT[7] + w * aT[9]))));
if(id < 0) return x - x * (s1 + s2);
else {
z = atanhi[id] - ((x * (s1 + s2) - atanlo[id]) - x);
return (hx < 0) ? -z : z;
}
}

72
external/fdlibm/s_cbrt.c vendored Normal file
View File

@@ -0,0 +1,72 @@
/* @(#)s_cbrt.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
#include "math.h"
/* cbrt(x)
* Return cube root of x
*/
static const unsigned
B1 = 715094163, /* B1 = (682-0.03306235651)*2**20 */
B2 = 696219795; /* B2 = (664-0.03306235651)*2**20 */
static const double
C = 5.42857142857142815906e-01, /* 19/35 = 0x3FE15F15, 0xF15F15F1 */
D = -7.05306122448979611050e-01, /* -864/1225 = 0xBFE691DE, 0x2532C834 */
E = 1.41428571428571436819e+00, /* 99/70 = 0x3FF6A0EA, 0x0EA0EA0F */
F = 1.60714285714285720630e+00, /* 45/28 = 0x3FF9B6DB, 0x6DB6DB6E */
G = 3.57142857142857150787e-01; /* 5/14 = 0x3FD6DB6D, 0xB6DB6DB7 */
double cbrt(double x) {
int hx;
double r, s, t = 0.0, w;
unsigned sign;
hx = __HI(x); /* high word of x */
sign = hx & 0x80000000; /* sign= sign(x) */
hx ^= sign;
if(hx >= 0x7ff00000) return (x + x); /* cbrt(NaN,INF) is itself */
if((hx | __LO(x)) == 0)
return (x); /* cbrt(0) is itself */
__HI(x) = hx; /* x <- |x| */
/* rough cbrt to 5 bits */
if(hx < 0x00100000) /* subnormal number */
{
__HI(t) = 0x43500000; /* set t= 2**54 */
t *= x;
__HI(t) = __HI(t) / 3 + B2;
} else
__HI(t) = hx / 3 + B1;
/* new cbrt to 23 bits, may be implemented in single precision */
r = t * t / x;
s = C + r * t;
t *= G + F / (s + E + D / s);
/* chopped to 20 bits and make it larger than cbrt(x) */
__LO(t) = 0;
__HI(t) += 0x00000001;
/* one step newton iteration to 53 bits with error less than 0.667 ulps */
s = t * t; /* t*t is exact */
r = x / s;
w = t + t;
r = (r - t) / (w + r); /* r-s is exact */
t = t + t * r;
/* retore the sign bit */
__HI(t) |= sign;
return (t);
}

75
external/fdlibm/s_ceil.c vendored Normal file
View File

@@ -0,0 +1,75 @@
/* @(#)s_ceil.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* ceil(x)
* Return x rounded toward -inf to integral value
* Method:
* Bit twiddling.
* Exception:
* Inexact flag raised if x not equal to ceil(x).
*/
#include "math.h"
static const double hugev = 1.0e300;
double ceil(double x) {
int i0, i1, j0;
unsigned i, j;
i0 = __HI(x);
i1 = __LO(x);
j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
if(j0 < 20) {
if(j0 < 0) { /* raise inexact if x != 0 */
if(hugev + x > 0.0) { /* return 0*sign(x) if |x|<1 */
if(i0 < 0) {
i0 = 0x80000000;
i1 = 0;
} else if((i0 | i1) != 0) {
i0 = 0x3ff00000;
i1 = 0;
}
}
} else {
i = (0x000fffff) >> j0;
if(((i0 & i) | i1) == 0) return x; /* x is integral */
if(hugev + x > 0.0) { /* raise inexact flag */
if(i0 > 0) i0 += (0x00100000) >> j0;
i0 &= (~i);
i1 = 0;
}
}
} else if(j0 > 51) {
if(j0 == 0x400) return x + x; /* inf or NaN */
else
return x; /* x is integral */
} else {
i = ((unsigned)(0xffffffff)) >> (j0 - 20);
if((i1 & i) == 0) return x; /* x is integral */
if(hugev + x > 0.0) { /* raise inexact flag */
if(i0 > 0) {
if(j0 == 20) i0 += 1;
else {
j = i1 + (1 << (52 - j0));
if(j < i1) i0 += 1; /* got a carry */
i1 = j;
}
}
i1 &= (~i);
}
}
__HI(x) = i0;
__LO(x) = i1;
return x;
}

View File

@@ -1,31 +1,25 @@
/* @(#)s_copysign.c 5.1 93/09/24 */
/* @(#)s_copysign.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* $Id$ */
#include <Mw/BaseTypes.h>
#include "math_internal.h"
/*
* copysign(double x, double y)
* copysign(x,y) returns a value with the magnitude of x and
* with the sign bit of y.
*/
double
nbsd_copysign(double x, double y) {
MwU32 hx, hy;
GET_HIGH_WORD(hx, x);
GET_HIGH_WORD(hy, y);
SET_HIGH_WORD(x, (hx & 0x7fffffff) | (hy & 0x80000000));
#include "math.h"
double copysign(double x, double y) {
__HI(x) = (__HI(x) & 0x7fffffff) | (__HI(y) & 0x80000000);
return x;
}

76
external/fdlibm/s_cos.c vendored Normal file
View File

@@ -0,0 +1,76 @@
/* @(#)s_cos.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* cos(x)
* Return cosine function of x.
*
* kernel function:
* __fdlibm_kernel_sin ... sine function on [-pi/4,pi/4]
* __fdlibm_kernel_cos ... cosine function on [-pi/4,pi/4]
* __fdlibm_kernel_rem_pio2 ... argument reduction routine
*
* Method.
* Let S,C and T denote the sin, cos and tan respectively on
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
* in [-pi/4 , +pi/4], and let n = k mod 4.
* We have
*
* n sin(x) cos(x) tan(x)
* ----------------------------------------------------------
* 0 S C T
* 1 C -S -1/T
* 2 -S -C T
* 3 -C S -1/T
* ----------------------------------------------------------
*
* Special cases:
* Let trig be any of sin, cos, or tan.
* trig(+-INF) is NaN, with signals;
* trig(NaN) is that NaN;
*
* Accuracy:
* TRIG(x) returns trig(x) nearly rounded
*/
#include "math.h"
double cos(double x) {
double y[2], z = 0.0;
int n, ix;
/* High word of x. */
ix = __HI(x);
/* |x| ~< pi/4 */
ix &= 0x7fffffff;
if(ix <= 0x3fe921fb) return __fdlibm_kernel_cos(x, z);
/* cos(Inf or NaN) is NaN */
else if(ix >= 0x7ff00000)
return x - x;
/* argument reduction needed */
else {
n = __fdlibm_rem_pio2(x, y);
switch(n & 3) {
case 0:
return __fdlibm_kernel_cos(y[0], y[1]);
case 1:
return -__fdlibm_kernel_sin(y[0], y[1], 1);
case 2:
return -__fdlibm_kernel_cos(y[0], y[1]);
default:
return __fdlibm_kernel_sin(y[0], y[1], 1);
}
}
}

297
external/fdlibm/s_erf.c vendored Normal file
View File

@@ -0,0 +1,297 @@
/* @(#)s_erf.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* double erf(double x)
* double erfc(double x)
* x
* 2 |\
* erf(x) = --------- | exp(-t*t)dt
* sqrt(pi) \|
* 0
*
* erfc(x) = 1-erf(x)
* Note that
* erf(-x) = -erf(x)
* erfc(-x) = 2 - erfc(x)
*
* Method:
* 1. For |x| in [0, 0.84375]
* erf(x) = x + x*R(x^2)
* erfc(x) = 1 - erf(x) if x in [-.84375,0.25]
* = 0.5 + ((0.5-x)-x*R) if x in [0.25,0.84375]
* where R = P/Q where P is an odd poly of degree 8 and
* Q is an odd poly of degree 10.
* -57.90
* | R - (erf(x)-x)/x | <= 2
*
*
* Remark. The formula is derived by noting
* erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....)
* and that
* 2/sqrt(pi) = 1.128379167095512573896158903121545171688
* is close to one. The interval is chosen because the fix
* point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is
* near 0.6174), and by some experiment, 0.84375 is chosen to
* guarantee the error is less than one ulp for erf.
*
* 2. For |x| in [0.84375,1.25], let s = |x| - 1, and
* c = 0.84506291151 rounded to single (24 bits)
* erf(x) = sign(x) * (c + P1(s)/Q1(s))
* erfc(x) = (1-c) - P1(s)/Q1(s) if x > 0
* 1+(c+P1(s)/Q1(s)) if x < 0
* |P1/Q1 - (erf(|x|)-c)| <= 2**-59.06
* Remark: here we use the taylor series expansion at x=1.
* erf(1+s) = erf(1) + s*Poly(s)
* = 0.845.. + P1(s)/Q1(s)
* That is, we use rational approximation to approximate
* erf(1+s) - (c = (single)0.84506291151)
* Note that |P1/Q1|< 0.078 for x in [0.84375,1.25]
* where
* P1(s) = degree 6 poly in s
* Q1(s) = degree 6 poly in s
*
* 3. For x in [1.25,1/0.35(~2.857143)],
* erfc(x) = (1/x)*exp(-x*x-0.5625+R1/S1)
* erf(x) = 1 - erfc(x)
* where
* R1(z) = degree 7 poly in z, (z=1/x^2)
* S1(z) = degree 8 poly in z
*
* 4. For x in [1/0.35,28]
* erfc(x) = (1/x)*exp(-x*x-0.5625+R2/S2) if x > 0
* = 2.0 - (1/x)*exp(-x*x-0.5625+R2/S2) if -6<x<0
* = 2.0 - tinyv (if x <= -6)
* erf(x) = sign(x)*(1.0 - erfc(x)) if x < 6, else
* erf(x) = sign(x)*(1.0 - tinyv)
* where
* R2(z) = degree 6 poly in z, (z=1/x^2)
* S2(z) = degree 7 poly in z
*
* Note1:
* To compute exp(-x*x-0.5625+R/S), let s be a single
* precision number and s := x; then
* -x*x = -s*s + (s-x)*(s+x)
* exp(-x*x-0.5626+R/S) =
* exp(-s*s-0.5625)*exp((s-x)*(s+x)+R/S);
* Note2:
* Here 4 and 5 make use of the asymptotic series
* exp(-x*x)
* erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) )
* x*sqrt(pi)
* We use rational approximation to approximate
* g(s)=f(1/x^2) = log(erfc(x)*x) - x*x + 0.5625
* Here is the error bound for R1/S1 and R2/S2
* |R1/S1 - f(x)| < 2**(-62.57)
* |R2/S2 - f(x)| < 2**(-61.52)
*
* 5. For inf > x >= 28
* erf(x) = sign(x) *(1 - tinyv) (raise inexact)
* erfc(x) = tinyv*tinyv (raise underflow) if x > 0
* = 2 - tinyv if x<0
*
* 7. Special case:
* erf(0) = 0, erf(inf) = 1, erf(-inf) = -1,
* erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2,
* erfc/erf(NaN) is NaN
*/
#include "math.h"
static const double
tinyv = 1e-300,
half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
two = 2.00000000000000000000e+00, /* 0x40000000, 0x00000000 */
/* c = (float)0.84506291151 */
erx = 8.45062911510467529297e-01, /* 0x3FEB0AC1, 0x60000000 */
/*
* Coefficients for approximation to erf on [0,0.84375]
*/
efx = 1.28379167095512586316e-01, /* 0x3FC06EBA, 0x8214DB69 */
efx8 = 1.02703333676410069053e+00, /* 0x3FF06EBA, 0x8214DB69 */
pp0 = 1.28379167095512558561e-01, /* 0x3FC06EBA, 0x8214DB68 */
pp1 = -3.25042107247001499370e-01, /* 0xBFD4CD7D, 0x691CB913 */
pp2 = -2.84817495755985104766e-02, /* 0xBF9D2A51, 0xDBD7194F */
pp3 = -5.77027029648944159157e-03, /* 0xBF77A291, 0x236668E4 */
pp4 = -2.37630166566501626084e-05, /* 0xBEF8EAD6, 0x120016AC */
qq1 = 3.97917223959155352819e-01, /* 0x3FD97779, 0xCDDADC09 */
qq2 = 6.50222499887672944485e-02, /* 0x3FB0A54C, 0x5536CEBA */
qq3 = 5.08130628187576562776e-03, /* 0x3F74D022, 0xC4D36B0F */
qq4 = 1.32494738004321644526e-04, /* 0x3F215DC9, 0x221C1A10 */
qq5 = -3.96022827877536812320e-06, /* 0xBED09C43, 0x42A26120 */
/*
* Coefficients for approximation to erf in [0.84375,1.25]
*/
pa0 = -2.36211856075265944077e-03, /* 0xBF6359B8, 0xBEF77538 */
pa1 = 4.14856118683748331666e-01, /* 0x3FDA8D00, 0xAD92B34D */
pa2 = -3.72207876035701323847e-01, /* 0xBFD7D240, 0xFBB8C3F1 */
pa3 = 3.18346619901161753674e-01, /* 0x3FD45FCA, 0x805120E4 */
pa4 = -1.10894694282396677476e-01, /* 0xBFBC6398, 0x3D3E28EC */
pa5 = 3.54783043256182359371e-02, /* 0x3FA22A36, 0x599795EB */
pa6 = -2.16637559486879084300e-03, /* 0xBF61BF38, 0x0A96073F */
qa1 = 1.06420880400844228286e-01, /* 0x3FBB3E66, 0x18EEE323 */
qa2 = 5.40397917702171048937e-01, /* 0x3FE14AF0, 0x92EB6F33 */
qa3 = 7.18286544141962662868e-02, /* 0x3FB2635C, 0xD99FE9A7 */
qa4 = 1.26171219808761642112e-01, /* 0x3FC02660, 0xE763351F */
qa5 = 1.36370839120290507362e-02, /* 0x3F8BEDC2, 0x6B51DD1C */
qa6 = 1.19844998467991074170e-02, /* 0x3F888B54, 0x5735151D */
/*
* Coefficients for approximation to erfc in [1.25,1/0.35]
*/
ra0 = -9.86494403484714822705e-03, /* 0xBF843412, 0x600D6435 */
ra1 = -6.93858572707181764372e-01, /* 0xBFE63416, 0xE4BA7360 */
ra2 = -1.05586262253232909814e+01, /* 0xC0251E04, 0x41B0E726 */
ra3 = -6.23753324503260060396e+01, /* 0xC04F300A, 0xE4CBA38D */
ra4 = -1.62396669462573470355e+02, /* 0xC0644CB1, 0x84282266 */
ra5 = -1.84605092906711035994e+02, /* 0xC067135C, 0xEBCCABB2 */
ra6 = -8.12874355063065934246e+01, /* 0xC0545265, 0x57E4D2F2 */
ra7 = -9.81432934416914548592e+00, /* 0xC023A0EF, 0xC69AC25C */
sa1 = 1.96512716674392571292e+01, /* 0x4033A6B9, 0xBD707687 */
sa2 = 1.37657754143519042600e+02, /* 0x4061350C, 0x526AE721 */
sa3 = 4.34565877475229228821e+02, /* 0x407B290D, 0xD58A1A71 */
sa4 = 6.45387271733267880336e+02, /* 0x40842B19, 0x21EC2868 */
sa5 = 4.29008140027567833386e+02, /* 0x407AD021, 0x57700314 */
sa6 = 1.08635005541779435134e+02, /* 0x405B28A3, 0xEE48AE2C */
sa7 = 6.57024977031928170135e+00, /* 0x401A47EF, 0x8E484A93 */
sa8 = -6.04244152148580987438e-02, /* 0xBFAEEFF2, 0xEE749A62 */
/*
* Coefficients for approximation to erfc in [1/.35,28]
*/
rb0 = -9.86494292470009928597e-03, /* 0xBF843412, 0x39E86F4A */
rb1 = -7.99283237680523006574e-01, /* 0xBFE993BA, 0x70C285DE */
rb2 = -1.77579549177547519889e+01, /* 0xC031C209, 0x555F995A */
rb3 = -1.60636384855821916062e+02, /* 0xC064145D, 0x43C5ED98 */
rb4 = -6.37566443368389627722e+02, /* 0xC083EC88, 0x1375F228 */
rb5 = -1.02509513161107724954e+03, /* 0xC0900461, 0x6A2E5992 */
rb6 = -4.83519191608651397019e+02, /* 0xC07E384E, 0x9BDC383F */
sb1 = 3.03380607434824582924e+01, /* 0x403E568B, 0x261D5190 */
sb2 = 3.25792512996573918826e+02, /* 0x40745CAE, 0x221B9F0A */
sb3 = 1.53672958608443695994e+03, /* 0x409802EB, 0x189D5118 */
sb4 = 3.19985821950859553908e+03, /* 0x40A8FFB7, 0x688C246A */
sb5 = 2.55305040643316442583e+03, /* 0x40A3F219, 0xCEDF3BE6 */
sb6 = 4.74528541206955367215e+02, /* 0x407DA874, 0xE79FE763 */
sb7 = -2.24409524465858183362e+01; /* 0xC03670E2, 0x42712D62 */
double erf(double x) {
int hx, ix, i;
double R, S, P, Q, s, y, z, r;
hx = __HI(x);
ix = hx & 0x7fffffff;
if(ix >= 0x7ff00000) { /* erf(nan)=nan */
i = ((unsigned)hx >> 31) << 1;
return (double)(1 - i) + one / x; /* erf(+-inf)=+-1 */
}
if(ix < 0x3feb0000) { /* |x|<0.84375 */
if(ix < 0x3e300000) { /* |x|<2**-28 */
if(ix < 0x00800000)
return 0.125 * (8.0 * x + efx8 * x); /*avoid underflow */
return x + efx * x;
}
z = x * x;
r = pp0 + z * (pp1 + z * (pp2 + z * (pp3 + z * pp4)));
s = one + z * (qq1 + z * (qq2 + z * (qq3 + z * (qq4 + z * qq5))));
y = r / s;
return x + x * y;
}
if(ix < 0x3ff40000) { /* 0.84375 <= |x| < 1.25 */
s = fabs(x) - one;
P = pa0 + s * (pa1 + s * (pa2 + s * (pa3 + s * (pa4 + s * (pa5 + s * pa6)))));
Q = one + s * (qa1 + s * (qa2 + s * (qa3 + s * (qa4 + s * (qa5 + s * qa6)))));
if(hx >= 0) return erx + P / Q;
else
return -erx - P / Q;
}
if(ix >= 0x40180000) { /* inf>|x|>=6 */
if(hx >= 0) return one - tinyv;
else
return tinyv - one;
}
x = fabs(x);
s = one / (x * x);
if(ix < 0x4006DB6E) { /* |x| < 1/0.35 */
R = ra0 + s * (ra1 + s * (ra2 + s * (ra3 + s * (ra4 + s * (ra5 + s * (ra6 + s * ra7))))));
S = one + s * (sa1 + s * (sa2 + s * (sa3 + s * (sa4 + s * (sa5 + s * (sa6 + s * (sa7 + s * sa8)))))));
} else { /* |x| >= 1/0.35 */
R = rb0 + s * (rb1 + s * (rb2 + s * (rb3 + s * (rb4 + s * (rb5 + s * rb6)))));
S = one + s * (sb1 + s * (sb2 + s * (sb3 + s * (sb4 + s * (sb5 + s * (sb6 + s * sb7))))));
}
z = x;
__LO(z) = 0;
r = __fdlibm_exp(-z * z - 0.5625) * __fdlibm_exp((z - x) * (z + x) + R / S);
if(hx >= 0) return one - r / x;
else
return r / x - one;
}
double erfc(double x) {
int hx, ix;
double R, S, P, Q, s, y, z, r;
hx = __HI(x);
ix = hx & 0x7fffffff;
if(ix >= 0x7ff00000) { /* erfc(nan)=nan */
/* erfc(+-inf)=0,2 */
return (double)(((unsigned)hx >> 31) << 1) + one / x;
}
if(ix < 0x3feb0000) { /* |x|<0.84375 */
if(ix < 0x3c700000) /* |x|<2**-56 */
return one - x;
z = x * x;
r = pp0 + z * (pp1 + z * (pp2 + z * (pp3 + z * pp4)));
s = one + z * (qq1 + z * (qq2 + z * (qq3 + z * (qq4 + z * qq5))));
y = r / s;
if(hx < 0x3fd00000) { /* x<1/4 */
return one - (x + x * y);
} else {
r = x * y;
r += (x - half);
return half - r;
}
}
if(ix < 0x3ff40000) { /* 0.84375 <= |x| < 1.25 */
s = fabs(x) - one;
P = pa0 + s * (pa1 + s * (pa2 + s * (pa3 + s * (pa4 + s * (pa5 + s * pa6)))));
Q = one + s * (qa1 + s * (qa2 + s * (qa3 + s * (qa4 + s * (qa5 + s * qa6)))));
if(hx >= 0) {
z = one - erx;
return z - P / Q;
} else {
z = erx + P / Q;
return one + z;
}
}
if(ix < 0x403c0000) { /* |x|<28 */
x = fabs(x);
s = one / (x * x);
if(ix < 0x4006DB6D) { /* |x| < 1/.35 ~ 2.857143*/
R = ra0 + s * (ra1 + s * (ra2 + s * (ra3 + s * (ra4 + s * (ra5 + s * (ra6 + s * ra7))))));
S = one + s * (sa1 + s * (sa2 + s * (sa3 + s * (sa4 + s * (sa5 + s * (sa6 + s * (sa7 + s * sa8)))))));
} else { /* |x| >= 1/.35 ~ 2.857143 */
if(hx < 0 && ix >= 0x40180000) return two - tinyv; /* x < -6 */
R = rb0 + s * (rb1 + s * (rb2 + s * (rb3 + s * (rb4 + s * (rb5 + s * rb6)))));
S = one + s * (sb1 + s * (sb2 + s * (sb3 + s * (sb4 + s * (sb5 + s * (sb6 + s * sb7))))));
}
z = x;
__LO(z) = 0;
r = __fdlibm_exp(-z * z - 0.5625) *
__fdlibm_exp((z - x) * (z + x) + R / S);
if(hx > 0) return r / x;
else
return two - r / x;
} else {
if(hx > 0) return tinyv * tinyv;
else
return two - tinyv;
}
}

213
external/fdlibm/s_expm1.c vendored Normal file
View File

@@ -0,0 +1,213 @@
/* @(#)s_expm1.c 1.5 04/04/22 */
/*
* ====================================================
* Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
*
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* expm1(x)
* Returns exp(x)-1, the exponential of x minus 1.
*
* Method
* 1. Argument reduction:
* Given x, find r and integer k such that
*
* x = k*ln2 + r, |r| <= 0.5*ln2 ~ 0.34658
*
* Here a correction term c will be computed to compensate
* the error in r when rounded to a floating-point number.
*
* 2. Approximating expm1(r) by a special rational function on
* the interval [0,0.34658]:
* Since
* r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 - r^4/360 + ...
* we define R1(r*r) by
* r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 * R1(r*r)
* That is,
* R1(r**2) = 6/r *((exp(r)+1)/(exp(r)-1) - 2/r)
* = 6/r * ( 1 + 2.0*(1/(exp(r)-1) - 1/r))
* = 1 - r^2/60 + r^4/2520 - r^6/100800 + ...
* We use a special Remes algorithm on [0,0.347] to generate
* a polynomial of degree 5 in r*r to approximate R1. The
* maximum error of this polynomial approximation is bounded
* by 2**-61. In other words,
* R1(z) ~ 1.0 + Q1*z + Q2*z**2 + Q3*z**3 + Q4*z**4 + Q5*z**5
* where Q1 = -1.6666666666666567384E-2,
* Q2 = 3.9682539681370365873E-4,
* Q3 = -9.9206344733435987357E-6,
* Q4 = 2.5051361420808517002E-7,
* Q5 = -6.2843505682382617102E-9;
* (where z=r*r, and the values of Q1 to Q5 are listed below)
* with error bounded by
* | 5 | -61
* | 1.0+Q1*z+...+Q5*z - R1(z) | <= 2
* | |
*
* expm1(r) = exp(r)-1 is then computed by the following
* specific way which minimize the accumulation rounding error:
* 2 3
* r r [ 3 - (R1 + R1*r/2) ]
* expm1(r) = r + --- + --- * [--------------------]
* 2 2 [ 6 - r*(3 - R1*r/2) ]
*
* To compensate the error in the argument reduction, we use
* expm1(r+c) = expm1(r) + c + expm1(r)*c
* ~ expm1(r) + c + r*c
* Thus c+r*c will be added in as the correction terms for
* expm1(r+c). Now rearrange the term to avoid optimization
* screw up:
* ( 2 2 )
* ({ ( r [ R1 - (3 - R1*r/2) ] ) } r )
* expm1(r+c)~r - ({r*(--- * [--------------------]-c)-c} - --- )
* ({ ( 2 [ 6 - r*(3 - R1*r/2) ] ) } 2 )
* ( )
*
* = r - E
* 3. Scale back to obtain expm1(x):
* From step 1, we have
* expm1(x) = either 2^k*[expm1(r)+1] - 1
* = or 2^k*[expm1(r) + (1-2^-k)]
* 4. Implementation notes:
* (A). To save one multiplication, we scale the coefficient Qi
* to Qi*2^i, and replace z by (x^2)/2.
* (B). To achieve maximum accuracy, we compute expm1(x) by
* (i) if x < -56*ln2, return -1.0, (raise inexact if x!=inf)
* (ii) if k=0, return r-E
* (iii) if k=-1, return 0.5*(r-E)-0.5
* (iv) if k=1 if r < -0.25, return 2*((r+0.5)- E)
* else return 1.0+2.0*(r-E);
* (v) if (k<-2||k>56) return 2^k(1-(E-r)) - 1 (or exp(x)-1)
* (vi) if k <= 20, return 2^k((1-2^-k)-(E-r)), else
* (vii) return 2^k(1-((E+2^-k)-r))
*
* Special cases:
* expm1(INF) is INF, expm1(NaN) is NaN;
* expm1(-INF) is -1, and
* for finite argument, only expm1(0)=0 is exact.
*
* Accuracy:
* according to an error analysis, the error is always less than
* 1 ulp (unit in the last place).
*
* Misc. info.
* For IEEE double
* if x > 7.09782712893383973096e+02 then expm1(x) overflow
*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*/
#include "math.h"
static const double
one = 1.0,
hugev = 1.0e+300,
tinyv = 1.0e-300,
o_threshold = 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */
ln2_hi = 6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */
ln2_lo = 1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */
invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */
/* scaled coefficients related to expm1 */
Q1 = -3.33333333333331316428e-02, /* BFA11111 111110F4 */
Q2 = 1.58730158725481460165e-03, /* 3F5A01A0 19FE5585 */
Q3 = -7.93650757867487942473e-05, /* BF14CE19 9EAADBB7 */
Q4 = 4.00821782732936239552e-06, /* 3ED0CFCA 86E65239 */
Q5 = -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */
double expm1(double x) {
double y, hi, lo, c, t, e, hxs, hfx, r1;
int k, xsb;
unsigned hx;
hx = __HI(x); /* high word of x */
xsb = hx & 0x80000000; /* sign bit of x */
if(xsb == 0) y = x;
else
y = -x; /* y = |x| */
hx &= 0x7fffffff; /* high word of |x| */
/* filter out hugev and non-finite argument */
if(hx >= 0x4043687A) { /* if |x|>=56*ln2 */
if(hx >= 0x40862E42) { /* if |x|>=709.78... */
if(hx >= 0x7ff00000) {
if(((hx & 0xfffff) | __LO(x)) != 0)
return x + x; /* NaN */
else
return (xsb == 0) ? x : -1.0; /* exp(+-inf)={inf,-1} */
}
if(x > o_threshold) return hugev * hugev; /* overflow */
}
if(xsb != 0) { /* x < -56*ln2, return -1.0 with inexact */
if(x + tinyv < 0.0) /* raise inexact */
return tinyv - one; /* return -1 */
}
}
/* argument reduction */
if(hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */
if(hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */
if(xsb == 0) {
hi = x - ln2_hi;
lo = ln2_lo;
k = 1;
} else {
hi = x + ln2_hi;
lo = -ln2_lo;
k = -1;
}
} else {
k = invln2 * x + ((xsb == 0) ? 0.5 : -0.5);
t = k;
hi = x - t * ln2_hi; /* t*ln2_hi is exact here */
lo = t * ln2_lo;
}
x = hi - lo;
c = (hi - x) - lo;
} else if(hx < 0x3c900000) { /* when |x|<2**-54, return x */
t = hugev + x; /* return x with inexact flags when x!=0 */
return x - (t - (hugev + x));
} else
k = 0;
/* x is now in primary range */
hfx = 0.5 * x;
hxs = x * hfx;
r1 = one + hxs * (Q1 + hxs * (Q2 + hxs * (Q3 + hxs * (Q4 + hxs * Q5))));
t = 3.0 - r1 * hfx;
e = hxs * ((r1 - t) / (6.0 - x * t));
if(k == 0) return x - (x * e - hxs); /* c is 0 */
else {
e = (x * (e - c) - c);
e -= hxs;
if(k == -1) return 0.5 * (x - e) - 0.5;
if(k == 1)
if(x < -0.25) return -2.0 * (e - (x + 0.5));
else
return one + 2.0 * (x - e);
if(k <= -2 || k > 56) { /* suffice to return exp(x)-1 */
y = one - (e - x);
__HI(y) += (k << 20); /* add k to y's exponent */
return y - one;
}
t = one;
if(k < 20) {
__HI(t) = 0x3ff00000 - (0x200000 >> k); /* t=1-2^-k */
y = t - (e - x);
__HI(y) += (k << 20); /* add k to y's exponent */
} else {
__HI(t) = ((0x3ff - k) << 20); /* 2^-k */
y = x - (e + t);
y += one;
__HI(y) += (k << 20); /* add k to y's exponent */
}
}
return y;
}

23
external/fdlibm/s_fabs.c vendored Normal file
View File

@@ -0,0 +1,23 @@
/* @(#)s_fabs.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* fabs(x) returns the absolute value of x.
*/
#include "math.h"
double fabs(double x) {
__HI(x) &= 0x7fffffff;
return x;
}

25
external/fdlibm/s_finite.c vendored Normal file
View File

@@ -0,0 +1,25 @@
/* @(#)s_finite.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* finite(x) returns 1 is x is finite, else 0;
* no branching!
*/
#include "math.h"
int finite(double x) {
int hx;
hx = __HI(x);
return (unsigned)((hx & 0x7fffffff) - 0x7ff00000) >> 31;
}

74
external/fdlibm/s_floor.c vendored Normal file
View File

@@ -0,0 +1,74 @@
/* @(#)s_floor.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* floor(x)
* Return x rounded toward -inf to integral value
* Method:
* Bit twiddling.
* Exception:
* Inexact flag raised if x not equal to floor(x).
*/
#include "math.h"
static const double hugev = 1.0e300;
double floor(double x) {
int i0, i1, j0;
unsigned i, j;
i0 = __HI(x);
i1 = __LO(x);
j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
if(j0 < 20) {
if(j0 < 0) { /* raise inexact if x != 0 */
if(hugev + x > 0.0) { /* return 0*sign(x) if |x|<1 */
if(i0 >= 0) {
i0 = i1 = 0;
} else if(((i0 & 0x7fffffff) | i1) != 0) {
i0 = 0xbff00000;
i1 = 0;
}
}
} else {
i = (0x000fffff) >> j0;
if(((i0 & i) | i1) == 0) return x; /* x is integral */
if(hugev + x > 0.0) { /* raise inexact flag */
if(i0 < 0) i0 += (0x00100000) >> j0;
i0 &= (~i);
i1 = 0;
}
}
} else if(j0 > 51) {
if(j0 == 0x400) return x + x; /* inf or NaN */
else
return x; /* x is integral */
} else {
i = ((unsigned)(0xffffffff)) >> (j0 - 20);
if((i1 & i) == 0) return x; /* x is integral */
if(hugev + x > 0.0) { /* raise inexact flag */
if(i0 < 0) {
if(j0 == 20) i0 += 1;
else {
j = i1 + (1 << (52 - j0));
if(j < i1) i0 += 1; /* got a carry */
i1 = j;
}
}
i1 &= (~i);
}
}
__HI(x) = i0;
__LO(x) = i1;
return x;
}

46
external/fdlibm/s_frexp.c vendored Normal file
View File

@@ -0,0 +1,46 @@
/* @(#)s_frexp.c 1.4 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* for non-zero x
* x = frexp(arg,&exp);
* return a double fp quantity x such that 0.5 <= |x| <1.0
* and the corresponding binary exponent "exp". That is
* arg = x*2^exp.
* If arg is inf, 0.0, or NaN, then frexp(arg,&exp) returns arg
* with *exp=0.
*/
#include "math.h"
static const double
two54 = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */
double frexp(double x, int* eptr) {
int hx, ix, lx;
hx = __HI(x);
ix = 0x7fffffff & hx;
lx = __LO(x);
*eptr = 0;
if(ix >= 0x7ff00000 || ((ix | lx) == 0)) return x; /* 0,inf,nan */
if(ix < 0x00100000) { /* subnormal */
x *= two54;
hx = __HI(x);
ix = hx & 0x7fffffff;
*eptr = -54;
}
*eptr += (ix >> 20) - 1022;
hx = (hx & 0x800fffff) | 0x3fe00000;
__HI(x) = hx;
return x;
}

41
external/fdlibm/s_ilogb.c vendored Normal file
View File

@@ -0,0 +1,41 @@
/* @(#)s_ilogb.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* ilogb(double x)
* return the binary exponent of non-zero x
* ilogb(0) = 0x80000001
* ilogb(inf/NaN) = 0x7fffffff (no signal is raised)
*/
#include "math.h"
int ilogb(double x) {
int hx, lx, ix;
hx = (__HI(x)) & 0x7fffffff; /* high word of x */
if(hx < 0x00100000) {
lx = __LO(x);
if((hx | lx) == 0)
return 0x80000001; /* ilogb(0) = 0x80000001 */
else /* subnormal x */
if(hx == 0) {
for(ix = -1043; lx > 0; lx <<= 1) ix -= 1;
} else {
for(ix = -1022, hx <<= 11; hx > 0; hx <<= 1) ix -= 1;
}
return ix;
} else if(hx < 0x7ff00000)
return (hx >> 20) - 1023;
else
return 0x7fffffff;
}

28
external/fdlibm/s_isnan.c vendored Normal file
View File

@@ -0,0 +1,28 @@
/* @(#)s_isnan.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* isnan(x) returns 1 is x is nan, else 0;
* no branching!
*/
#include "math.h"
int isnan(double x) {
int hx, lx;
hx = (__HI(x) & 0x7fffffff);
lx = __LO(x);
hx |= (unsigned)(lx | (-lx)) >> 31;
hx = 0x7ff00000 - hx;
return ((unsigned)(hx)) >> 31;
}

22
external/fdlibm/s_ldexp.c vendored Normal file
View File

@@ -0,0 +1,22 @@
/* @(#)s_ldexp.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#include "math.h"
#include <errno.h>
double ldexp(double value, int exp) {
if(!finite(value) || value == 0.0) return value;
value = scalbn(value, exp);
if(!finite(value) || value == 0.0) errno = ERANGE;
return value;
}

165
external/fdlibm/s_log1p.c vendored Normal file
View File

@@ -0,0 +1,165 @@
/* @(#)s_log1p.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* double log1p(double x)
*
* Method :
* 1. Argument Reduction: find k and f such that
* 1+x = 2^k * (1+f),
* where sqrt(2)/2 < 1+f < sqrt(2) .
*
* Note. If k=0, then f=x is exact. However, if k!=0, then f
* may not be representable exactly. In that case, a correction
* term is need. Let u=1+x rounded. Let c = (1+x)-u, then
* log(1+x) - log(u) ~ c/u. Thus, we proceed to compute log(u),
* and add back the correction term c/u.
* (Note: when x > 2**53, one can simply return log(x))
*
* 2. Approximation of log1p(f).
* Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
* = 2s + 2/3 s**3 + 2/5 s**5 + .....,
* = 2s + s*R
* We use a special Reme algorithm on [0,0.1716] to generate
* a polynomial of degree 14 to approximate R The maximum error
* of this polynomial approximation is bounded by 2**-58.45. In
* other words,
* 2 4 6 8 10 12 14
* R(z) ~ Lp1*s +Lp2*s +Lp3*s +Lp4*s +Lp5*s +Lp6*s +Lp7*s
* (the values of Lp1 to Lp7 are listed in the program)
* and
* | 2 14 | -58.45
* | Lp1*s +...+Lp7*s - R(z) | <= 2
* | |
* Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
* In order to guarantee error in log below 1ulp, we compute log
* by
* log1p(f) = f - (hfsq - s*(hfsq+R)).
*
* 3. Finally, log1p(x) = k*ln2 + log1p(f).
* = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
* Here ln2 is split into two floating point number:
* ln2_hi + ln2_lo,
* where n*ln2_hi is always exact for |n| < 2000.
*
* Special cases:
* log1p(x) is NaN with signal if x < -1 (including -INF) ;
* log1p(+INF) is +INF; log1p(-1) is -INF with signal;
* log1p(NaN) is that NaN with no signal.
*
* Accuracy:
* according to an error analysis, the error is always less than
* 1 ulp (unit in the last place).
*
* Constants:
* The hexadecimal values are the intended ones for the following
* constants. The decimal values may be used, provided that the
* compiler will convert from decimal to binary accurately enough
* to produce the hexadecimal values shown.
*
* Note: Assuming log() return accurate answer, the following
* algorithm can be used to compute log1p(x) to within a few ULP:
*
* u = 1+x;
* if(u==1.0) return x ; else
* return log(u)*(x/(u-1.0));
*
* See HP-15C Advanced Functions Handbook, p.193.
*/
#include "math.h"
static const double
ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */
ln2_lo = 1.90821492927058770002e-10, /* 3dea39ef 35793c76 */
two54 = 1.80143985094819840000e+16, /* 43500000 00000000 */
Lp1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */
Lp2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */
Lp3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */
Lp4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */
Lp5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */
Lp6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */
Lp7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */
static double zero = 0.0;
double log1p(double x) {
double hfsq, f, c, s, z, R, u;
int k, hx, hu, ax;
hx = __HI(x); /* high word of x */
ax = hx & 0x7fffffff;
k = 1;
if(hx < 0x3FDA827A) { /* x < 0.41422 */
if(ax >= 0x3ff00000) { /* x <= -1.0 */
if(x == -1.0) return -two54 / zero; /* log1p(-1)=+inf */
else
return (x - x) / (x - x); /* log1p(x<-1)=NaN */
}
if(ax < 0x3e200000) { /* |x| < 2**-29 */
if(two54 + x > zero /* raise inexact */
&& ax < 0x3c900000) /* |x| < 2**-54 */
return x;
else
return x - x * x * 0.5;
}
if(hx > 0 || hx <= ((int)0xbfd2bec3)) {
k = 0;
f = x;
hu = 1;
} /* -0.2929<x<0.41422 */
}
if(hx >= 0x7ff00000) return x + x;
if(k != 0) {
if(hx < 0x43400000) {
u = 1.0 + x;
hu = __HI(u); /* high word of u */
k = (hu >> 20) - 1023;
c = (k > 0) ? 1.0 - (u - x) : x - (u - 1.0); /* correction term */
c /= u;
} else {
u = x;
hu = __HI(u); /* high word of u */
k = (hu >> 20) - 1023;
c = 0;
}
hu &= 0x000fffff;
if(hu < 0x6a09e) {
__HI(u) = hu | 0x3ff00000; /* normalize u */
} else {
k += 1;
__HI(u) = hu | 0x3fe00000; /* normalize u/2 */
hu = (0x00100000 - hu) >> 2;
}
f = u - 1.0;
}
hfsq = 0.5 * f * f;
if(hu == 0) { /* |f| < 2**-20 */
if(f == zero)
if(k == 0) return zero;
else {
c += k * ln2_lo;
return k * ln2_hi + c;
}
R = hfsq * (1.0 - 0.66666666666666666 * f);
if(k == 0) return f - R;
else
return k * ln2_hi - ((R - (k * ln2_lo + c)) - f);
}
s = f / (2.0 + f);
z = s * s;
R = z * (Lp1 + z * (Lp2 + z * (Lp3 + z * (Lp4 + z * (Lp5 + z * (Lp6 + z * Lp7))))));
if(k == 0) return f - (hfsq - s * (hfsq + R));
else
return k * ln2_hi - ((hfsq - (s * (hfsq + R) + (k * ln2_lo + c))) - f);
}

32
external/fdlibm/s_logb.c vendored Normal file
View File

@@ -0,0 +1,32 @@
/* @(#)s_logb.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* double logb(x)
* IEEE 754 logb. Included to pass IEEE test suite. Not recommend.
* Use ilogb instead.
*/
#include "math.h"
double logb(double x) {
int lx, ix;
ix = (__HI(x)) & 0x7fffffff; /* high |x| */
lx = __LO(x); /* low x */
if((ix | lx) == 0) return -1.0 / fabs(x);
if(ix >= 0x7ff00000) return x * x;
if((ix >>= 20) == 0) /* IEEE 754 logb */
return -1022.0;
else
return (double)(ix - 1023);
}

70
external/fdlibm/s_modf.c vendored Normal file
View File

@@ -0,0 +1,70 @@
/* @(#)s_modf.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* modf(double x, double *iptr)
* return fraction part of x, and return x's integral part in *iptr.
* Method:
* Bit twiddling.
*
* Exception:
* No exception.
*/
#include "math.h"
static const double one = 1.0;
double modf(double x, double* iptr) {
int i0, i1, j0;
unsigned i;
i0 = __HI(x); /* high x */
i1 = __LO(x); /* low x */
j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; /* exponent of x */
if(j0 < 20) { /* integer part in high x */
if(j0 < 0) { /* |x|<1 */
__HIp(iptr) = i0 & 0x80000000;
__LOp(iptr) = 0; /* *iptr = +-0 */
return x;
} else {
i = (0x000fffff) >> j0;
if(((i0 & i) | i1) == 0) { /* x is integral */
*iptr = x;
__HI(x) &= 0x80000000;
__LO(x) = 0; /* return +-0 */
return x;
} else {
__HIp(iptr) = i0 & (~i);
__LOp(iptr) = 0;
return x - *iptr;
}
}
} else if(j0 > 51) { /* no fraction part */
*iptr = x * one;
__HI(x) &= 0x80000000;
__LO(x) = 0; /* return +-0 */
return x;
} else { /* fraction part in low x */
i = ((unsigned)(0xffffffff)) >> (j0 - 20);
if((i1 & i) == 0) { /* x is integral */
*iptr = x;
__HI(x) &= 0x80000000;
__LO(x) = 0; /* return +-0 */
return x;
} else {
__HIp(iptr) = i0;
__LOp(iptr) = i1 & (~i);
return x - *iptr;
}
}
}

76
external/fdlibm/s_nextafter.c vendored Normal file
View File

@@ -0,0 +1,76 @@
/* @(#)s_nextafter.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* IEEE functions
* nextafter(x,y)
* return the next machine floating-point number of x in the
* direction toward y.
* Special cases:
*/
#include "math.h"
double nextafter(double x, double y) {
int hx, hy, ix, iy;
unsigned lx, ly;
hx = __HI(x); /* high word of x */
lx = __LO(x); /* low word of x */
hy = __HI(y); /* high word of y */
ly = __LO(y); /* low word of y */
ix = hx & 0x7fffffff; /* |x| */
iy = hy & 0x7fffffff; /* |y| */
if(((ix >= 0x7ff00000) && ((ix - 0x7ff00000) | lx) != 0) || /* x is nan */
((iy >= 0x7ff00000) && ((iy - 0x7ff00000) | ly) != 0)) /* y is nan */
return x + y;
if(x == y) return x; /* x=y, return x */
if((ix | lx) == 0) { /* x == 0 */
__HI(x) = hy & 0x80000000; /* return +-minsubnormal */
__LO(x) = 1;
y = x * x;
if(y == x) return y;
else
return x; /* raise underflow flag */
}
if(hx >= 0) { /* x > 0 */
if(hx > hy || ((hx == hy) && (lx > ly))) { /* x > y, x -= ulp */
if(lx == 0) hx -= 1;
lx -= 1;
} else { /* x < y, x += ulp */
lx += 1;
if(lx == 0) hx += 1;
}
} else { /* x < 0 */
if(hy >= 0 || hx > hy || ((hx == hy) && (lx > ly))) { /* x < y, x -= ulp */
if(lx == 0) hx -= 1;
lx -= 1;
} else { /* x > y, x += ulp */
lx += 1;
if(lx == 0) hx += 1;
}
}
hy = hx & 0x7ff00000;
if(hy >= 0x7ff00000) return x + x; /* overflow */
if(hy < 0x00100000) { /* underflow */
y = x * x;
if(y != x) { /* raise underflow flag */
__HI(y) = hx;
__LO(y) = lx;
return y;
}
}
__HI(x) = hx;
__LO(x) = lx;
return x;
}

76
external/fdlibm/s_rint.c vendored Normal file
View File

@@ -0,0 +1,76 @@
/* @(#)s_rint.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* rint(x)
* Return x rounded to integral value according to the prevailing
* rounding mode.
* Method:
* Using floating addition.
* Exception:
* Inexact flag raised if x not equal to rint(x).
*/
#include "math.h"
static const double
TWO52[2] = {
4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
-4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
};
double rint(double x) {
int i0, j0, sx;
unsigned i, i1;
double w, t;
i0 = __HI(x);
sx = (i0 >> 31) & 1;
i1 = __LO(x);
j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
if(j0 < 20) {
if(j0 < 0) {
if(((i0 & 0x7fffffff) | i1) == 0) return x;
i1 |= (i0 & 0x0fffff);
i0 &= 0xfffe0000;
i0 |= ((i1 | -i1) >> 12) & 0x80000;
__HI(x) = i0;
w = TWO52[sx] + x;
t = w - TWO52[sx];
i0 = __HI(t);
__HI(t) = (i0 & 0x7fffffff) | (sx << 31);
return t;
} else {
i = (0x000fffff) >> j0;
if(((i0 & i) | i1) == 0) return x; /* x is integral */
i >>= 1;
if(((i0 & i) | i1) != 0) {
if(j0 == 19) i1 = 0x40000000;
else
i0 = (i0 & (~i)) | ((0x20000) >> j0);
}
}
} else if(j0 > 51) {
if(j0 == 0x400) return x + x; /* inf or NaN */
else
return x; /* x is integral */
} else {
i = ((unsigned)(0xffffffff)) >> (j0 - 20);
if((i1 & i) == 0) return x; /* x is integral */
i >>= 1;
if((i1 & i) != 0) i1 = (i1 & (~i)) | ((0x40000000) >> (j0 - 20));
}
__HI(x) = i0;
__LO(x) = i1;
w = TWO52[sx] + x;
return w - TWO52[sx];
}

View File

@@ -1,20 +1,16 @@
/* @(#)s_scalbn.c 5.1 93/09/24 */
/* @(#)s_scalbn.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* $Id$ */
#include <Mw/BaseTypes.h>
#include "math_internal.h"
/*
* scalbn (double x, int n)
* scalbn(x,n) returns x* 2**n computed by exponent
@@ -22,44 +18,40 @@
* exponentiation or a multiplication.
*/
#include "math.h"
static const double
two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
hugev = 1.0e+300,
tinyv = 1.0e-300;
double
nbsd_scalbn(double x, int n) {
return nbsd_scalbln(x, n);
}
double
nbsd_scalbln(double x, long n) {
MwI32 k, hx, lx;
EXTRACT_WORDS(hx, lx, x);
k = ((MwU32)hx & 0x7ff00000) >> 20; /* extract exponent */
double scalbn(double x, int n) {
int k, hx, lx;
hx = __HI(x);
lx = __LO(x);
k = (hx & 0x7ff00000) >> 20; /* extract exponent */
if(k == 0) { /* 0 or subnormal x */
if((lx | (hx & 0x7fffffff)) == 0) return x; /* +-0 */
x *= two54;
GET_HIGH_WORD(hx, x);
k = (((MwU32)hx & 0x7ff00000) >> 20) - 54;
hx = __HI(x);
k = ((hx & 0x7ff00000) >> 20) - 54;
if(n < -50000) return tinyv * x; /*underflow*/
}
if(k == 0x7ff) return x + x; /* NaN or Inf */
k = k + n;
if(k > 0x7fe) return hugev * nbsd_copysign(hugev, x); /* overflow */
if(k > 0x7fe) return hugev * copysign(hugev, x); /* overflow */
if(k > 0) /* normal result */
{
SET_HIGH_WORD(x, (hx & 0x800fffff) | (k << 20));
__HI(x) = (hx & 0x800fffff) | (k << 20);
return x;
}
if(k <= -54) {
if(k <= -54)
if(n > 50000) /* in case integer overflow in n+k */
return hugev * nbsd_copysign(hugev, x); /*overflow*/
return hugev * copysign(hugev, x); /*overflow*/
else
return tinyv * nbsd_copysign(tinyv, x); /*underflow*/
}
return tinyv * copysign(tinyv, x); /*underflow*/
k += 54; /* subnormal result */
SET_HIGH_WORD(x, (hx & 0x800fffff) | (k << 20));
__HI(x) = (hx & 0x800fffff) | (k << 20);
return x * twom54;
}

2
external/fdlibm/s_signgam.c vendored Normal file
View File

@@ -0,0 +1,2 @@
#include "math.h"
int signgam = 0;

24
external/fdlibm/s_significand.c vendored Normal file
View File

@@ -0,0 +1,24 @@
/* @(#)s_significand.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* significand(x) computes just
* scalb(x, (double) -ilogb(x)),
* for exercising the fraction-part(F) IEEE 754-1985 test vector.
*/
#include "math.h"
double significand(double x) {
return __fdlibm_scalb(x, (double)-ilogb(x));
}

76
external/fdlibm/s_sin.c vendored Normal file
View File

@@ -0,0 +1,76 @@
/* @(#)s_sin.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* sin(x)
* Return sine function of x.
*
* kernel function:
* __fdlibm_kernel_sin ... sine function on [-pi/4,pi/4]
* __fdlibm_kernel_cos ... cose function on [-pi/4,pi/4]
* __fdlibm_kernel_rem_pio2 ... argument reduction routine
*
* Method.
* Let S,C and T denote the sin, cos and tan respectively on
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
* in [-pi/4 , +pi/4], and let n = k mod 4.
* We have
*
* n sin(x) cos(x) tan(x)
* ----------------------------------------------------------
* 0 S C T
* 1 C -S -1/T
* 2 -S -C T
* 3 -C S -1/T
* ----------------------------------------------------------
*
* Special cases:
* Let trig be any of sin, cos, or tan.
* trig(+-INF) is NaN, with signals;
* trig(NaN) is that NaN;
*
* Accuracy:
* TRIG(x) returns trig(x) nearly rounded
*/
#include "math.h"
double sin(double x) {
double y[2], z = 0.0;
int n, ix;
/* High word of x. */
ix = __HI(x);
/* |x| ~< pi/4 */
ix &= 0x7fffffff;
if(ix <= 0x3fe921fb) return __fdlibm_kernel_sin(x, z, 0);
/* sin(Inf or NaN) is NaN */
else if(ix >= 0x7ff00000)
return x - x;
/* argument reduction needed */
else {
n = __fdlibm_rem_pio2(x, y);
switch(n & 3) {
case 0:
return __fdlibm_kernel_sin(y[0], y[1], 1);
case 1:
return __fdlibm_kernel_cos(y[0], y[1]);
case 2:
return -__fdlibm_kernel_sin(y[0], y[1], 1);
default:
return -__fdlibm_kernel_cos(y[0], y[1]);
}
}
}

67
external/fdlibm/s_tan.c vendored Normal file
View File

@@ -0,0 +1,67 @@
/* @(#)s_tan.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* tan(x)
* Return tangent function of x.
*
* kernel function:
* __fdlibm_kernel_tan ... tangent function on [-pi/4,pi/4]
* __fdlibm_kernel_rem_pio2 ... argument reduction routine
*
* Method.
* Let S,C and T denote the sin, cos and tan respectively on
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
* in [-pi/4 , +pi/4], and let n = k mod 4.
* We have
*
* n sin(x) cos(x) tan(x)
* ----------------------------------------------------------
* 0 S C T
* 1 C -S -1/T
* 2 -S -C T
* 3 -C S -1/T
* ----------------------------------------------------------
*
* Special cases:
* Let trig be any of sin, cos, or tan.
* trig(+-INF) is NaN, with signals;
* trig(NaN) is that NaN;
*
* Accuracy:
* TRIG(x) returns trig(x) nearly rounded
*/
#include "math.h"
double tan(double x) {
double y[2], z = 0.0;
int n, ix;
/* High word of x. */
ix = __HI(x);
/* |x| ~< pi/4 */
ix &= 0x7fffffff;
if(ix <= 0x3fe921fb) return __fdlibm_kernel_tan(x, z, 1);
/* tan(Inf or NaN) is NaN */
else if(ix >= 0x7ff00000)
return x - x; /* NaN */
/* argument reduction needed */
else {
n = __fdlibm_rem_pio2(x, y);
return __fdlibm_kernel_tan(y[0], y[1], 1 - ((n & 1) << 1)); /* 1 -- n even
-1 -- n odd */
}
}

73
external/fdlibm/s_tanh.c vendored Normal file
View File

@@ -0,0 +1,73 @@
/* @(#)s_tanh.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/* Tanh(x)
* Return the Hyperbolic Tangent of x
*
* Method :
* x -x
* e - e
* 0. tanh(x) is defined to be -----------
* x -x
* e + e
* 1. reduce x to non-negative by tanh(-x) = -tanh(x).
* 2. 0 <= x <= 2**-55 : tanh(x) := x*(one+x)
* -t
* 2**-55 < x <= 1 : tanh(x) := -----; t = expm1(-2x)
* t + 2
* 2
* 1 <= x <= 22.0 : tanh(x) := 1- ----- ; t=expm1(2x)
* t + 2
* 22.0 < x <= INF : tanh(x) := 1.
*
* Special cases:
* tanh(NaN) is NaN;
* only tanh(0)=0 is exact for finite argument.
*/
#include "math.h"
static const double one = 1.0, two = 2.0, tinyv = 1.0e-300;
double tanh(double x) {
double t, z;
int jx, ix;
/* High word of |x|. */
jx = __HI(x);
ix = jx & 0x7fffffff;
/* x is INF or NaN */
if(ix >= 0x7ff00000) {
if(jx >= 0) return one / x + one; /* tanh(+-inf)=+-1 */
else
return one / x - one; /* tanh(NaN) = NaN */
}
/* |x| < 22 */
if(ix < 0x40360000) { /* |x|<22 */
if(ix < 0x3c800000) /* |x|<2**-55 */
return x * (one + x); /* tanh(small) = small */
if(ix >= 0x3ff00000) { /* |x|>=1 */
t = expm1(two * fabs(x));
z = one - two / (t + two);
} else {
t = expm1(-two * fabs(x));
z = -t / (t + two);
}
/* |x| > 22, return +-1 */
} else {
z = one - tinyv; /* raised inexact flag */
}
return (jx >= 0) ? z : -z;
}

23
external/fdlibm/w_acos.c vendored Normal file
View File

@@ -0,0 +1,23 @@
/* @(#)w_acos.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrap_acos(x)
*/
#include "math.h"
double acos(double x) /* wrapper acos */
{
return __fdlibm_acos(x);
}

24
external/fdlibm/w_acosh.c vendored Normal file
View File

@@ -0,0 +1,24 @@
/* @(#)w_acosh.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/*
* wrapper acosh(x)
*/
#include "math.h"
double acosh(double x) /* wrapper acosh */
{
return __fdlibm_acosh(x);
}

24
external/fdlibm/w_asin.c vendored Normal file
View File

@@ -0,0 +1,24 @@
/* @(#)w_asin.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/*
* wrapper asin(x)
*/
#include "math.h"
double asin(double x) /* wrapper asin */
{
return __fdlibm_asin(x);
}

24
external/fdlibm/w_atan2.c vendored Normal file
View File

@@ -0,0 +1,24 @@
/* @(#)w_atan2.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/*
* wrapper atan2(y,x)
*/
#include "math.h"
double atan2(double y, double x) /* wrapper atan2 */
{
return __fdlibm_atan2(y, x);
}

22
external/fdlibm/w_atanh.c vendored Normal file
View File

@@ -0,0 +1,22 @@
/* @(#)w_atanh.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper atanh(x)
*/
#include "math.h"
double atanh(double x) /* wrapper atanh */
{
return __fdlibm_atanh(x);
}

23
external/fdlibm/w_cosh.c vendored Normal file
View File

@@ -0,0 +1,23 @@
/* @(#)w_cosh.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper cosh(x)
*/
#include "math.h"
double cosh(double x) /* wrapper cosh */
{
return __fdlibm_cosh(x);
}

26
external/fdlibm/w_exp.c vendored Normal file
View File

@@ -0,0 +1,26 @@
/* @(#)w_exp.c 1.4 04/04/22 */
/*
* ====================================================
* Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
*
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper exp(x)
*/
#include "math.h"
static const double
o_threshold = 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */
u_threshold = -7.45133219101941108420e+02; /* 0xc0874910, 0xD52D3051 */
double exp(double x) /* wrapper exp */
{
return __fdlibm_exp(x);
}

23
external/fdlibm/w_fmod.c vendored Normal file
View File

@@ -0,0 +1,23 @@
/* @(#)w_fmod.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper fmod(x,y)
*/
#include "math.h"
double fmod(double x, double y) /* wrapper fmod */
{
return __fdlibm_fmod(x, y);
}

27
external/fdlibm/w_gamma.c vendored Normal file
View File

@@ -0,0 +1,27 @@
/* @(#)w_gamma.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* double gamma(double x)
* Return the logarithm of the Gamma function of x.
*
* Method: call gamma_r
*/
#include "math.h"
extern int signgam;
double gamma(double x) {
return __fdlibm_gamma_r(x, &signgam);
}

23
external/fdlibm/w_gamma_r.c vendored Normal file
View File

@@ -0,0 +1,23 @@
/* @(#)w_gamma_r.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper double gamma_r(double x, int *signgamp)
*/
#include "math.h"
double gamma_r(double x, int* signgamp) /* wrapper lgamma_r */
{
return __fdlibm_gamma_r(x, signgamp);
}

23
external/fdlibm/w_hypot.c vendored Normal file
View File

@@ -0,0 +1,23 @@
/* @(#)w_hypot.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper hypot(x,y)
*/
#include "math.h"
double hypot(double x, double y) /* wrapper hypot */
{
return __fdlibm_hypot(x, y);
}

28
external/fdlibm/w_j0.c vendored Normal file
View File

@@ -0,0 +1,28 @@
/* @(#)w_j0.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper j0(double x), y0(double x)
*/
#include "math.h"
double j0(double x) /* wrapper j0 */
{
return __fdlibm_j0(x);
}
double y0(double x) /* wrapper y0 */
{
return __fdlibm_y0(x);
}

28
external/fdlibm/w_j1.c vendored Normal file
View File

@@ -0,0 +1,28 @@
/* @(#)w_j1.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper of j1,y1
*/
#include "math.h"
double j1(double x) /* wrapper j1 */
{
return __fdlibm_j1(x);
}
double y1(double x) /* wrapper y1 */
{
return __fdlibm_y1(x);
}

50
external/fdlibm/w_jn.c vendored Normal file
View File

@@ -0,0 +1,50 @@
/* @(#)w_jn.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper jn(int n, double x), yn(int n, double x)
* floating point Bessel's function of the 1st and 2nd kind
* of order n
*
* Special cases:
* y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
* y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
* Note 2. About jn(n,x), yn(n,x)
* For n=0, j0(x) is called,
* for n=1, j1(x) is called,
* for n<x, forward recursion us used starting
* from values of j0(x) and j1(x).
* for n>x, a continued fraction approximation to
* j(n,x)/j(n-1,x) is evaluated and then backward
* recursion is used starting from a supposed value
* for j(n,x). The resulting value of j(0,x) is
* compared with the actual value to correct the
* supposed value of j(n,x).
*
* yn(n,x) is similar in all respects, except
* that forward recursion is used for all
* values of n>1.
*
*/
#include "math.h"
double jn(int n, double x) /* wrapper jn */
{
return __fdlibm_jn(n, x);
}
double yn(int n, double x) /* wrapper yn */
{
return __fdlibm_yn(n, x);
}

27
external/fdlibm/w_lgamma.c vendored Normal file
View File

@@ -0,0 +1,27 @@
/* @(#)w_lgamma.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
/* double lgamma(double x)
* Return the logarithm of the Gamma function of x.
*
* Method: call __fdlibm_lgamma_r
*/
#include "math.h"
extern int signgam;
double lgamma(double x) {
return __fdlibm_lgamma_r(x, &signgam);
}

23
external/fdlibm/w_lgamma_r.c vendored Normal file
View File

@@ -0,0 +1,23 @@
/* @(#)w_lgamma_r.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper double lgamma_r(double x, int *signgamp)
*/
#include "math.h"
double lgamma_r(double x, int* signgamp) /* wrapper lgamma_r */
{
return __fdlibm_lgamma_r(x, signgamp);
}

23
external/fdlibm/w_log.c vendored Normal file
View File

@@ -0,0 +1,23 @@
/* @(#)w_log.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper log(x)
*/
#include "math.h"
double log(double x) /* wrapper log */
{
return __fdlibm_log(x);
}

23
external/fdlibm/w_log10.c vendored Normal file
View File

@@ -0,0 +1,23 @@
/* @(#)w_log10.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper log10(X)
*/
#include "math.h"
double log10(double x) /* wrapper log10 */
{
return __fdlibm_log10(x);
}

24
external/fdlibm/w_pow.c vendored Normal file
View File

@@ -0,0 +1,24 @@
/* @(#)w_pow.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper pow(x,y) return x**y
*/
#include "math.h"
double pow(double x, double y) /* wrapper pow */
{
return __fdlibm_pow(x, y);
}

23
external/fdlibm/w_remainder.c vendored Normal file
View File

@@ -0,0 +1,23 @@
/* @(#)w_remainder.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper remainder(x,p)
*/
#include "math.h"
double remainder(double x, double y) /* wrapper remainder */
{
return __fdlibm_remainder(x, y);
}

27
external/fdlibm/w_scalb.c vendored Normal file
View File

@@ -0,0 +1,27 @@
/* @(#)w_scalb.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper scalb(double x, double fn) is provide for
* passing various standard test suite. One
* should use scalbn() instead.
*/
#include "math.h"
#include <errno.h>
double scalb(double x, double fn) /* wrapper scalb */
{
return __fdlibm_scalb(x, fn);
}

23
external/fdlibm/w_sinh.c vendored Normal file
View File

@@ -0,0 +1,23 @@
/* @(#)w_sinh.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper sinh(x)
*/
#include "math.h"
double sinh(double x) /* wrapper sinh */
{
return __fdlibm_sinh(x);
}

23
external/fdlibm/w_sqrt.c vendored Normal file
View File

@@ -0,0 +1,23 @@
/* @(#)w_sqrt.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper sqrt(x)
*/
#include "math.h"
double sqrt(double x) /* wrapper sqrt */
{
return __fdlibm_sqrt(x);
}

2
mk/fdlibm.mk Normal file
View File

@@ -0,0 +1,2 @@
# $Id$
L_OBJS += external/fdlibm/e_acos.o external/fdlibm/e_acosh.o external/fdlibm/e_asin.o external/fdlibm/e_atan2.o external/fdlibm/e_atanh.o external/fdlibm/e_cosh.o external/fdlibm/e_exp.o external/fdlibm/e_fmod.o external/fdlibm/e_gamma.o external/fdlibm/e_gamma_r.o external/fdlibm/e_hypot.o external/fdlibm/e_j0.o external/fdlibm/e_j1.o external/fdlibm/e_jn.o external/fdlibm/e_lgamma.o external/fdlibm/e_lgamma_r.o external/fdlibm/e_log.o external/fdlibm/e_log10.o external/fdlibm/e_pow.o external/fdlibm/e_rem_pio2.o external/fdlibm/e_remainder.o external/fdlibm/e_scalb.o external/fdlibm/e_sinh.o external/fdlibm/e_sqrt.o external/fdlibm/k_cos.o external/fdlibm/k_rem_pio2.o external/fdlibm/k_sin.o external/fdlibm/k_tan.o external/fdlibm/s_asinh.o external/fdlibm/s_atan.o external/fdlibm/s_cbrt.o external/fdlibm/s_ceil.o external/fdlibm/s_copysign.o external/fdlibm/s_cos.o external/fdlibm/s_erf.o external/fdlibm/s_expm1.o external/fdlibm/s_fabs.o external/fdlibm/s_finite.o external/fdlibm/s_floor.o external/fdlibm/s_frexp.o external/fdlibm/s_ilogb.o external/fdlibm/s_isnan.o external/fdlibm/s_ldexp.o external/fdlibm/s_log1p.o external/fdlibm/s_logb.o external/fdlibm/s_modf.o external/fdlibm/s_nextafter.o external/fdlibm/s_rint.o external/fdlibm/s_scalbn.o external/fdlibm/s_signgam.o external/fdlibm/s_significand.o external/fdlibm/s_sin.o external/fdlibm/s_tan.o external/fdlibm/s_tanh.o external/fdlibm/w_acos.o external/fdlibm/w_acosh.o external/fdlibm/w_asin.o external/fdlibm/w_atan2.o external/fdlibm/w_atanh.o external/fdlibm/w_cosh.o external/fdlibm/w_exp.o external/fdlibm/w_fmod.o external/fdlibm/w_gamma.o external/fdlibm/w_gamma_r.o external/fdlibm/w_hypot.o external/fdlibm/w_j0.o external/fdlibm/w_j1.o external/fdlibm/w_jn.o external/fdlibm/w_lgamma.o external/fdlibm/w_lgamma_r.o external/fdlibm/w_log.o external/fdlibm/w_log10.o external/fdlibm/w_pow.o external/fdlibm/w_remainder.o external/fdlibm/w_scalb.o external/fdlibm/w_sinh.o external/fdlibm/w_sqrt.o

View File

@@ -6,7 +6,7 @@ SHARED = -shared
ifeq ($(UNIX),1)
L_CFLAGS += -DUSE_X11 -DUNIX
L_OBJS += src/backend/x11.o
L_LIBS += -lm -lX11 -lXrender -lXcursor
L_LIBS += -lX11 -lXrender -lXcursor
GL = -lGL -lGLU

View File

@@ -1,3 +1,2 @@
# $Id$
L_OBJS += src/math/default.o src/math/math.o src/math/mmx.o
L_OBJS += src/math/nbsd_endian.o src/math/nbsd_pow.o src/math/nbsd_scalbn.o src/math/nbsd_copysign.o

View File

@@ -34,14 +34,14 @@ static void default_multiply_u8(MwLLVec* a, MwLLVec* b, MwLLVec* out) {
out->un.u8.h = a->un.u8.h * b->un.u8.h;
};
static void default_reciprocal_u8(MwLLVec* a, MwLLVec* out) {
out->un.u8.a = nbsd_pow(a->un.u8.a, -1);
out->un.u8.b = nbsd_pow(a->un.u8.b, -1);
out->un.u8.c = nbsd_pow(a->un.u8.c, -1);
out->un.u8.d = nbsd_pow(a->un.u8.d, -1);
out->un.u8.e = nbsd_pow(a->un.u8.e, -1);
out->un.u8.f = nbsd_pow(a->un.u8.f, -1);
out->un.u8.g = nbsd_pow(a->un.u8.g, -1);
out->un.u8.h = nbsd_pow(a->un.u8.h, -1);
out->un.u8.a = pow(a->un.u8.a, -1);
out->un.u8.b = pow(a->un.u8.b, -1);
out->un.u8.c = pow(a->un.u8.c, -1);
out->un.u8.d = pow(a->un.u8.d, -1);
out->un.u8.e = pow(a->un.u8.e, -1);
out->un.u8.f = pow(a->un.u8.f, -1);
out->un.u8.g = pow(a->un.u8.g, -1);
out->un.u8.h = pow(a->un.u8.h, -1);
};
static void default_squareRoot_u8(MwLLVec* a, MwLLVec* out) {
out->un.u8.a = sqrt(a->un.u8.a);
@@ -125,10 +125,10 @@ static void default_multiply_u16(MwLLVec* a, MwLLVec* b, MwLLVec* out) {
out->un.u16.d = a->un.u16.d * b->un.u16.d;
}
static void default_reciprocal_u16(MwLLVec* a, MwLLVec* out) {
out->un.u16.a = nbsd_pow(a->un.u16.a, -1);
out->un.u16.b = nbsd_pow(a->un.u16.b, -1);
out->un.u16.c = nbsd_pow(a->un.u16.c, -1);
out->un.u16.d = nbsd_pow(a->un.u16.d, -1);
out->un.u16.a = pow(a->un.u16.a, -1);
out->un.u16.b = pow(a->un.u16.b, -1);
out->un.u16.c = pow(a->un.u16.c, -1);
out->un.u16.d = pow(a->un.u16.d, -1);
};
static void default_squareRoot_u16(MwLLVec* a, MwLLVec* out) {
out->un.u16.a = sqrt(a->un.u16.a);
@@ -188,8 +188,8 @@ static void default_multiply_u32(MwLLVec* a, MwLLVec* b, MwLLVec* out) {
out->un.u32.b = a->un.u32.b * b->un.u32.b;
}
static void default_reciprocal_u32(MwLLVec* a, MwLLVec* out) {
out->un.u32.a = nbsd_pow(a->un.u32.a, -1);
out->un.u32.b = nbsd_pow(a->un.u32.b, -1);
out->un.u32.a = pow(a->un.u32.a, -1);
out->un.u32.b = pow(a->un.u32.b, -1);
};
static void default_squareRoot_u32(MwLLVec* a, MwLLVec* out) {
out->un.u32.a = sqrt(a->un.u32.a);
@@ -257,14 +257,14 @@ static void default_multiply_i8(MwLLVec* a, MwLLVec* b, MwLLVec* out) {
out->un.i8.h = a->un.i8.h * b->un.i8.h;
};
static void default_reciprocal_i8(MwLLVec* a, MwLLVec* out) {
out->un.i8.a = nbsd_pow(a->un.i8.a, -1);
out->un.i8.b = nbsd_pow(a->un.i8.b, -1);
out->un.i8.c = nbsd_pow(a->un.i8.c, -1);
out->un.i8.d = nbsd_pow(a->un.i8.d, -1);
out->un.i8.e = nbsd_pow(a->un.i8.e, -1);
out->un.i8.f = nbsd_pow(a->un.i8.f, -1);
out->un.i8.g = nbsd_pow(a->un.i8.g, -1);
out->un.i8.h = nbsd_pow(a->un.i8.h, -1);
out->un.i8.a = pow(a->un.i8.a, -1);
out->un.i8.b = pow(a->un.i8.b, -1);
out->un.i8.c = pow(a->un.i8.c, -1);
out->un.i8.d = pow(a->un.i8.d, -1);
out->un.i8.e = pow(a->un.i8.e, -1);
out->un.i8.f = pow(a->un.i8.f, -1);
out->un.i8.g = pow(a->un.i8.g, -1);
out->un.i8.h = pow(a->un.i8.h, -1);
};
static void default_squareRoot_i8(MwLLVec* a, MwLLVec* out) {
out->un.i8.a = sqrt(a->un.i8.a);
@@ -329,10 +329,10 @@ static void default_multiply_i16(MwLLVec* a, MwLLVec* b, MwLLVec* out) {
out->un.i16.d = a->un.i16.d * b->un.i16.d;
}
static void default_reciprocal_i16(MwLLVec* a, MwLLVec* out) {
out->un.i16.a = nbsd_pow(a->un.i16.a, -1);
out->un.i16.b = nbsd_pow(a->un.i16.b, -1);
out->un.i16.c = nbsd_pow(a->un.i16.c, -1);
out->un.i16.d = nbsd_pow(a->un.i16.d, -1);
out->un.i16.a = pow(a->un.i16.a, -1);
out->un.i16.b = pow(a->un.i16.b, -1);
out->un.i16.c = pow(a->un.i16.c, -1);
out->un.i16.d = pow(a->un.i16.d, -1);
};
static void default_squareRoot_i16(MwLLVec* a, MwLLVec* out) {
out->un.i16.a = sqrt(a->un.i16.a);
@@ -380,8 +380,8 @@ static void default_multiply_i32(MwLLVec* a, MwLLVec* b, MwLLVec* out) {
out->un.i32.b = a->un.i32.b * b->un.i32.b;
}
static void default_reciprocal_i32(MwLLVec* a, MwLLVec* out) {
out->un.i32.a = nbsd_pow(a->un.i32.a, -1);
out->un.i32.b = nbsd_pow(a->un.i32.b, -1);
out->un.i32.a = pow(a->un.i32.a, -1);
out->un.i32.b = pow(a->un.i32.b, -1);
};
static void default_squareRoot_i32(MwLLVec* a, MwLLVec* out) {
out->un.i32.a = sqrt(a->un.i32.a);

View File

@@ -12,7 +12,6 @@
#define FEATX86_SSE (1 << 25)
#define FEATX86_SSE2 (1 << 26)
#endif
#include "nbsd_math.h"
struct _MwLLMathVTable {
void (*Add)(MwLLVec* a, MwLLVec* b, MwLLVec* out);

View File

@@ -1,17 +0,0 @@
/* $Id$ */
#include <Mw/BaseTypes.h>
#include "math_internal.h"
static char endian = 0;
char nbsd_endian(void) {
unsigned short n = 1;
if(endian != 0) return endian;
if(1 == *(unsigned char*)&n) {
endian = 'L';
} else {
endian = 'B';
}
return endian;
}

View File

@@ -1,103 +0,0 @@
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* from: @(#)fdlibm.h 5.1 93/09/24
* $NetBSD: math_private.h,v 1.34 2024/07/17 12:00:13 riastradh Exp $
*/
/* $Id$ */
#ifndef __NBSD_MATH__
#define __NBSD_MATH__
#include <Mw/BaseTypes.h>
typedef union _ieee_double_shape_type {
double value;
struct
{
MwU32 lsw;
MwU32 msw;
} parts;
struct
{
MwU64 w;
} xparts;
} ieee_double_shape_type;
/* Get two 32-bit integers from a double. */
#define EXTRACT_WORDS(ix0, ix1, d) \
do { \
ieee_double_shape_type ew_u; \
ew_u.value = (d); \
if(nbsd_endian() == 'L') { \
(ix0) = ew_u.parts.msw; \
(ix1) = ew_u.parts.lsw; \
} else { \
(ix0) = ew_u.parts.lsw; \
(ix1) = ew_u.parts.msw; \
} \
} while(0)
/* Get the more significant 32-bit integer from a double. */
#define GET_HIGH_WORD(i, d) \
do { \
ieee_double_shape_type gh_u; \
gh_u.value = (d); \
(i) = nbsd_endian() == 'L' ? gh_u.parts.msw : gh_u.parts.lsw; \
} while(0)
/* Get the less significant 32-bit integer from a double. */
#define GET_LOW_WORD(i, d) \
do { \
ieee_double_shape_type gl_u; \
gl_u.value = (d); \
(i) = nbsd_endian() == 'L' ? gl_u.parts.lsw : gl_u.parts.msw; \
} while(0)
/* Set the more significant 32 bits of a double from an integer. */
#define SET_HIGH_WORD(d, v) \
do { \
ieee_double_shape_type sh_u; \
sh_u.value = (d); \
if(nbsd_endian() == 'L') { \
sh_u.parts.msw = (v); \
} else { \
sh_u.parts.lsw = (v); \
} \
(d) = sh_u.value; \
} while(0)
/* Set the less significant 32 bits of a double from an integer. */
#define SET_LOW_WORD(d, v) \
do { \
ieee_double_shape_type sl_u; \
sl_u.value = (d); \
if(nbsd_endian() == 'L') { \
sl_u.parts.lsw = (v); \
} else { \
sl_u.parts.msw = (v); \
} \
(d) = sl_u.value; \
} while(0)
double nbsd_pow(double a, double b);
double nbsd_scalbn(double x, int n);
double nbsd_scalbln(double x, long n);
double nbsd_copysign(double x, double y);
char nbsd_endian(void);
#endif

View File

@@ -96,7 +96,7 @@ sub generate {
print(OUT "LD = $link\n");
print(OUT "\n");
print(OUT
"CFLAGS = ${inc}include ${def}_MILSKO ${def}USE_GDI ${def}USE_STB_TRUETYPE ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD\n"
"CFLAGS = ${inc}include ${inc}external${dir}fdlibm ${def}_MILSKO ${def}USE_GDI ${def}USE_STB_TRUETYPE ${def}USE_STB_IMAGE ${def}STBI_NO_SIMD\n"
);
print(OUT "LDFLAGS = $dll");
print(OUT "\n");
@@ -152,6 +152,7 @@ scan("src/text");
scan("src/font");
scan("src/math");
scan("src/color_picker");
scan("external/fdlibm");
push(@cfiles, "src/backend/gdi.c");
generate("BorMakefile", "Borland");