diff options
| author | Michael Klishin <michael@clojurewerkz.org> | 2016-09-02 19:27:22 +0300 |
|---|---|---|
| committer | Michael Klishin <michael@clojurewerkz.org> | 2016-09-02 19:27:22 +0300 |
| commit | 1c959076f376da63152dd757ecce9476023aca04 (patch) | |
| tree | 25493542515f5332a8ef89e38d5c6770f03f054e | |
| parent | 864b9d9bf8d37f09798372f788637de95bf71d15 (diff) | |
| parent | 1e3c0b48edee2fdd4ed713faabf4ee5521ea7e59 (diff) | |
| download | rabbitmq-server-git-1c959076f376da63152dd757ecce9476023aca04.tar.gz | |
Merge branch 'stable' into rabbitmq-server-803-stable
Conflicts:
Makefile
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | packaging/Makefile | 9 | ||||
| -rw-r--r-- | packaging/RPMS/Fedora/Makefile | 16 | ||||
| -rw-r--r-- | packaging/RPMS/Fedora/rabbitmq-server.service | 16 | ||||
| -rw-r--r-- | packaging/RPMS/Fedora/rabbitmq-server.spec | 81 | ||||
| -rw-r--r-- | packaging/RPMS/Fedora/rabbitmq-server.tmpfiles | 1 | ||||
| -rw-r--r-- | rabbitmq-components.mk | 14 | ||||
| -rw-r--r-- | src/mochinum.erl | 358 |
8 files changed, 118 insertions, 381 deletions
@@ -5,6 +5,7 @@ VERSION ?= $(call get_app_version,src/$(PROJECT).app.src) PACKAGES_DIR ?= $(abspath PACKAGES) DEPS = ranch $(PLUGINS) +TEST_DEPS = amqp_client meck define usage_xml_to_erl $(subst __,_,$(patsubst $(DOCS_DIR)/rabbitmq%.1.xml, src/rabbit_%_usage.erl, $(subst -,_,$(1)))) @@ -68,9 +69,6 @@ DEPS += $(DISTRIBUTED_DEPS) endif endif -# FIXME: Remove rabbitmq_test as TEST_DEPS from here for now. -TEST_DEPS := amqp_client meck proper $(filter-out rabbitmq_test,$(TEST_DEPS)) - include erlang.mk # -------------------------------------------------------------------- diff --git a/packaging/Makefile b/packaging/Makefile index 02820bdb23..64a1243b51 100644 --- a/packaging/Makefile +++ b/packaging/Makefile @@ -35,6 +35,7 @@ all: packages .PHONY: packages package-deb \ package-rpm package-rpm-fedora package-rpm-suse \ + package-rpm-rhel6 package-rpm-rhel7 \ package-windows package-standalone-macosx \ package-generic-unix @@ -70,12 +71,18 @@ packages: package-deb package-rpm package-windows package-generic-unix package-deb: $(SOURCE_DIST_FILE) $(gen_verbose) $(MAKE) -C debs/Debian $(VARS) all $(DO_CLEAN) -package-rpm: package-rpm-fedora package-rpm-suse +package-rpm: package-rpm-rhel6 package-rpm-rhel7 package-rpm-suse @: package-rpm-fedora: $(SOURCE_DIST_FILE) $(gen_verbose) $(MAKE) -C RPMS/Fedora $(VARS) all $(DO_CLEAN) +package-rpm-rhel6: $(SOURCE_DIST_FILE) + $(gen_verbose) $(MAKE) -C RPMS/Fedora $(VARS) RPM_OS=rhel6 all $(DO_CLEAN) + +package-rpm-rhel7: $(SOURCE_DIST_FILE) + $(gen_verbose) $(MAKE) -C RPMS/Fedora $(VARS) RPM_OS=rhel7 all $(DO_CLEAN) + package-rpm-suse: $(SOURCE_DIST_FILE) $(gen_verbose) $(MAKE) -C RPMS/Fedora $(VARS) RPM_OS=suse all $(DO_CLEAN) diff --git a/packaging/RPMS/Fedora/Makefile b/packaging/RPMS/Fedora/Makefile index 5763cadf04..11ecaff652 100644 --- a/packaging/RPMS/Fedora/Makefile +++ b/packaging/RPMS/Fedora/Makefile @@ -5,7 +5,7 @@ ifeq ($(SOURCE_DIST_FILE),) $(error Cannot find source archive; please specify SOURCE_DIST_FILE) endif ifneq ($(words $(SOURCE_DIST_FILE)),1) -$(error Multile source archives found; please specify SOURCE_DIST_FILE) +$(error Multiple source archives found; please specify SOURCE_DIST_FILE) endif VERSION ?= $(patsubst rabbitmq-server-%.tar.xz,%,$(notdir $(SOURCE_DIST_FILE))) @@ -34,7 +34,13 @@ else FUNCTION_LIBRARY=\# Source function library.\n. /etc/init.d/functions REQUIRES=chkconfig initscripts OS_DEFINES=--define '_initrddir /etc/rc.d/init.d' +ifeq "$(RPM_OS)" "rhel6" +SPEC_DEFINES=--define 'group_tag Development/Libraries' --define 'dist .el6' --define 'rhel 6' +else ifeq "$(RPM_OS)" "rhel7" +SPEC_DEFINES=--define 'group_tag Development/Libraries' --define '_unitdir /usr/lib/systemd/system' --define 'dist .el7' --define 'rhel 7' +else SPEC_DEFINES=--define 'group_tag Development/Libraries' +endif START_PROG=daemon endif @@ -53,17 +59,13 @@ prepare: sed -i 's|%%VERSION%%|$(VERSION)|;s|%%REQUIRES%%|$(REQUIRES)|' \ SPECS/rabbitmq-server.spec + cp rabbitmq-server.service SOURCES/rabbitmq-server.service + cp rabbitmq-server.tmpfiles SOURCES/rabbitmq-server.tmpfiles cp rabbitmq-server.init SOURCES/rabbitmq-server.init sed -i \ -e 's|^START_PROG=.*$$|START_PROG="$(START_PROG)"|' \ -e 's|^@FUNCTION_LIBRARY@|$(FUNCTION_LIBRARY)|' \ SOURCES/rabbitmq-server.init -ifeq "$(RPM_OS)" "fedora" -# Fedora says that only vital services should have Default-Start - sed -i -e '/^# Default-Start:/d;/^# Default-Stop:/d' \ - SOURCES/rabbitmq-server.init -endif - cp rabbitmq-server.logrotate SOURCES/rabbitmq-server.logrotate server: prepare diff --git a/packaging/RPMS/Fedora/rabbitmq-server.service b/packaging/RPMS/Fedora/rabbitmq-server.service new file mode 100644 index 0000000000..7fe15fe36c --- /dev/null +++ b/packaging/RPMS/Fedora/rabbitmq-server.service @@ -0,0 +1,16 @@ +[Unit] +Description=RabbitMQ broker +After=syslog.target network.target + +[Service] +Type=notify +User=rabbitmq +Group=rabbitmq +WorkingDirectory=/var/lib/rabbitmq +ExecStart=/usr/sbin/rabbitmq-server +ExecStop=/usr/sbin/rabbitmqctl stop +NotifyAccess=all +TimeoutStartSec=3600 + +[Install] +WantedBy=multi-user.target diff --git a/packaging/RPMS/Fedora/rabbitmq-server.spec b/packaging/RPMS/Fedora/rabbitmq-server.spec index 83b9678ec8..9ad05e59fb 100644 --- a/packaging/RPMS/Fedora/rabbitmq-server.spec +++ b/packaging/RPMS/Fedora/rabbitmq-server.spec @@ -1,4 +1,5 @@ %define debug_package %{nil} +%define erlang_minver R16B-03 Name: rabbitmq-server Version: %%VERSION%% @@ -8,14 +9,28 @@ Group: %{group_tag} Source: http://www.rabbitmq.com/releases/rabbitmq-server/v%{version}/%{name}-%{version}.tar.xz Source1: rabbitmq-server.init Source2: rabbitmq-server.logrotate +Source3: rabbitmq-server.service +Source4: rabbitmq-server.tmpfiles URL: http://www.rabbitmq.com/ BuildArch: noarch -BuildRequires: erlang >= R16B-03, python-simplejson, xmlto, libxslt, gzip, sed, zip, rsync -Requires: erlang >= R16B-03, logrotate, socat +BuildRequires: erlang >= %{erlang_minver}, python-simplejson, xmlto, libxslt, gzip, sed, zip, rsync + +%if 0%{?fedora} || 0%{?rhel} >= 7 +BuildRequires: systemd +%endif + +Requires: erlang >= %{erlang_minver}, logrotate, socat BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-%{_arch}-root Summary: The RabbitMQ server + +%if 0%{?fedora} || 0%{?rhel} >= 7 +Requires(pre): systemd +Requires(post): systemd +Requires(preun): systemd +%else Requires(post): %%REQUIRES%% Requires(pre): %%REQUIRES%% +%endif %description RabbitMQ is an open source multi-protocol messaging broker. @@ -47,7 +62,13 @@ mkdir -p %{buildroot}%{_localstatedir}/lib/rabbitmq/mnesia mkdir -p %{buildroot}%{_localstatedir}/log/rabbitmq #Copy all necessary lib files etc. + +%if 0%{?fedora} || 0%{?rhel} >= 7 +install -p -D -m 0644 %{S:3} %{buildroot}%{_unitdir}/%{name}.service +%else install -p -D -m 0755 %{S:1} %{buildroot}%{_initrddir}/rabbitmq-server +%endif + install -p -D -m 0755 %{_rabbit_server_ocf} %{buildroot}%{_exec_prefix}/lib/ocf/resource.d/rabbitmq/rabbitmq-server install -p -D -m 0755 %{_rabbit_server_ha_ocf} %{buildroot}%{_exec_prefix}/lib/ocf/resource.d/rabbitmq/rabbitmq-server-ha install -p -D -m 0644 %{S:2} %{buildroot}%{_sysconfdir}/logrotate.d/rabbitmq-server @@ -65,6 +86,10 @@ for script in rabbitmq-server rabbitmq-plugins; do \ %{buildroot}%{_sbindir}/$script; \ done +%if 0%{?fedora} > 14 || 0%{?rhel} >= 7 +install -D -p -m 0644 %{SOURCE4} %{buildroot}%{_prefix}/lib/tmpfiles.d/%{name}.conf +%endif + rm %{_maindir}/LICENSE* %{_maindir}/INSTALL #Build the list of files @@ -74,7 +99,8 @@ find %{buildroot} -path %{buildroot}%{_sysconfdir} -prune -o '!' -type d -printf %pre if [ $1 -gt 1 ]; then - # Upgrade - stop previous instance of rabbitmq-server init.d script + # Upgrade - stop previous instance of rabbitmq-server init.d (this + # will also activate systemd if it was used) script. /sbin/service rabbitmq-server stop fi @@ -90,7 +116,19 @@ if ! getent passwd rabbitmq >/dev/null; then fi %post + +%if 0%{?fedora} || 0%{?rhel} >= 7 +# %%systemd_post %%{name}.service +# manual expansion of systemd_post as this doesn't appear to +# expand correctly on debian machines +if [ $1 -eq 1 ] ; then + # Initial installation + systemctl preset %{name}.service >/dev/null 2>&1 || : +fi +/bin/systemctl daemon-reload +%else /sbin/chkconfig --add %{name} +%endif if [ -f %{_sysconfdir}/rabbitmq/rabbitmq.conf ] && [ ! -f %{_sysconfdir}/rabbitmq/rabbitmq-env.conf ]; then mv %{_sysconfdir}/rabbitmq/rabbitmq.conf %{_sysconfdir}/rabbitmq/rabbitmq-env.conf fi @@ -99,8 +137,12 @@ chmod -R o-rwx,g-w %{_localstatedir}/lib/rabbitmq/mnesia %preun if [ $1 = 0 ]; then #Complete uninstall +%if 0%{?fedora} || 0%{?rhel} >= 7 + systemctl stop rabbitmq-server +%else /sbin/service rabbitmq-server stop /sbin/chkconfig --del rabbitmq-server +%endif # We do not remove /var/log and /var/lib directories # Leave rabbitmq user and group @@ -112,13 +154,46 @@ for ext in rel script boot ; do rm -f %{_rabbit_erllibdir}/ebin/rabbit.$ext done +%postun +%if 0%{?fedora} || 0%{?rhel} >= 7 +# %%systemd_postun_with_restart %%{name}.service +# manual expansion of systemd_postun_with_restart as this doesn't appear to +# expand correctly on debian machines +if [ $1 -ge 1 ] ; then + # Package upgrade, not uninstall + systemctl try-restart %{name}.service >/dev/null 2>&1 || : +fi +%else +if [ $1 -gt 1 ]; then + /sbin/service %{name} try-restart +fi +%endif + +%if 0%{?fedora} > 17 || 0%{?rhel} >= 7 +# For prior versions older than this, do a conversion +# from sysv to systemd +%triggerun -- %{name} < 3.6.5 +# Save the current service runlevel info +# User must manually run systemd-sysv-convert --apply opensips +# to migrate them to systemd targets +/usr/bin/systemd-sysv-convert --save %{name} >/dev/null 2>&1 ||: + +# Run these because the SysV package being removed won't do them +/sbin/chkconfig --del %{name} >/dev/null 2>&1 || : +/bin/systemctl try-restart %{name}.service >/dev/null 2>&1 || : +%endif + %files -f ../%{name}.files %defattr(-,root,root,-) %attr(0755, rabbitmq, rabbitmq) %dir %{_localstatedir}/lib/rabbitmq %attr(0750, rabbitmq, rabbitmq) %dir %{_localstatedir}/lib/rabbitmq/mnesia %attr(0755, rabbitmq, rabbitmq) %dir %{_localstatedir}/log/rabbitmq %dir %{_sysconfdir}/rabbitmq + +%if 0%{?rhel} < 7 %{_initrddir}/rabbitmq-server +%endif + %config(noreplace) %{_sysconfdir}/logrotate.d/rabbitmq-server %doc LICENSE* %doc README diff --git a/packaging/RPMS/Fedora/rabbitmq-server.tmpfiles b/packaging/RPMS/Fedora/rabbitmq-server.tmpfiles new file mode 100644 index 0000000000..c2681827e0 --- /dev/null +++ b/packaging/RPMS/Fedora/rabbitmq-server.tmpfiles @@ -0,0 +1 @@ +D /var/run/rabbitmq 0755 rabbitmq rabbitmq - diff --git a/rabbitmq-components.mk b/rabbitmq-components.mk index eb9e9e3e03..e3417856f8 100644 --- a/rabbitmq-components.mk +++ b/rabbitmq-components.mk @@ -123,7 +123,6 @@ RABBITMQ_COMPONENTS = amqp_client \ rabbitmq_shovel \ rabbitmq_shovel_management \ rabbitmq_stomp \ - rabbitmq_test \ rabbitmq_toke \ rabbitmq_top \ rabbitmq_tracing \ @@ -262,10 +261,13 @@ prepare-dist:: ifneq ($(PROJECT),rabbit) ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS)),) RUN_RMQ_TARGETS = run-broker \ + run-tls-broker \ run-background-broker \ run-node \ run-background-node \ - start-background-node + start-background-node \ + start-background-broker \ + start-rabbit-on-node ifneq ($(filter $(RUN_RMQ_TARGETS),$(MAKECMDGOALS)),) BUILD_DEPS += rabbit @@ -273,18 +275,12 @@ endif endif ifeq ($(filter rabbit,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),) -ifneq ($(filter check tests tests-with-broker test,$(MAKECMDGOALS)),) +ifneq ($(filter check tests,$(MAKECMDGOALS)),) TEST_DEPS += rabbit endif endif endif -ifeq ($(filter rabbit_public_umbrella amqp_client rabbit_common rabbitmq_test,$(PROJECT)),) -ifeq ($(filter rabbitmq_test,$(DEPS) $(BUILD_DEPS) $(TEST_DEPS)),) -TEST_DEPS += rabbitmq_test -endif -endif - # -------------------------------------------------------------------- # rabbitmq-components.mk checks. # -------------------------------------------------------------------- diff --git a/src/mochinum.erl b/src/mochinum.erl deleted file mode 100644 index 4ea7a22acf..0000000000 --- a/src/mochinum.erl +++ /dev/null @@ -1,358 +0,0 @@ -%% This file is a copy of `mochijson2.erl' from mochiweb, revision -%% d541e9a0f36c00dcadc2e589f20e47fbf46fc76f. For the license, see -%% `LICENSE-MIT-Mochi'. - -%% @copyright 2007 Mochi Media, Inc. -%% @author Bob Ippolito <bob@mochimedia.com> - -%% @doc Useful numeric algorithms for floats that cover some deficiencies -%% in the math module. More interesting is digits/1, which implements -%% the algorithm from: -%% http://www.cs.indiana.edu/~burger/fp/index.html -%% See also "Printing Floating-Point Numbers Quickly and Accurately" -%% in Proceedings of the SIGPLAN '96 Conference on Programming Language -%% Design and Implementation. - --module(mochinum). --author("Bob Ippolito <bob@mochimedia.com>"). --export([digits/1, frexp/1, int_pow/2, int_ceil/1]). - -%% IEEE 754 Float exponent bias --define(FLOAT_BIAS, 1022). --define(MIN_EXP, -1074). --define(BIG_POW, 4503599627370496). - -%% External API - -%% @spec digits(number()) -> string() -%% @doc Returns a string that accurately represents the given integer or float -%% using a conservative amount of digits. Great for generating -%% human-readable output, or compact ASCII serializations for floats. -digits(N) when is_integer(N) -> - integer_to_list(N); -digits(0.0) -> - "0.0"; -digits(Float) -> - {Frac1, Exp1} = frexp_int(Float), - [Place0 | Digits0] = digits1(Float, Exp1, Frac1), - {Place, Digits} = transform_digits(Place0, Digits0), - R = insert_decimal(Place, Digits), - case Float < 0 of - true -> - [$- | R]; - _ -> - R - end. - -%% @spec frexp(F::float()) -> {Frac::float(), Exp::float()} -%% @doc Return the fractional and exponent part of an IEEE 754 double, -%% equivalent to the libc function of the same name. -%% F = Frac * pow(2, Exp). -frexp(F) -> - frexp1(unpack(F)). - -%% @spec int_pow(X::integer(), N::integer()) -> Y::integer() -%% @doc Moderately efficient way to exponentiate integers. -%% int_pow(10, 2) = 100. -int_pow(_X, 0) -> - 1; -int_pow(X, N) when N > 0 -> - int_pow(X, N, 1). - -%% @spec int_ceil(F::float()) -> integer() -%% @doc Return the ceiling of F as an integer. The ceiling is defined as -%% F when F == trunc(F); -%% trunc(F) when F < 0; -%% trunc(F) + 1 when F > 0. -int_ceil(X) -> - T = trunc(X), - case (X - T) of - Pos when Pos > 0 -> T + 1; - _ -> T - end. - - -%% Internal API - -int_pow(X, N, R) when N < 2 -> - R * X; -int_pow(X, N, R) -> - int_pow(X * X, N bsr 1, case N band 1 of 1 -> R * X; 0 -> R end). - -insert_decimal(0, S) -> - "0." ++ S; -insert_decimal(Place, S) when Place > 0 -> - L = length(S), - case Place - L of - 0 -> - S ++ ".0"; - N when N < 0 -> - {S0, S1} = lists:split(L + N, S), - S0 ++ "." ++ S1; - N when N < 6 -> - %% More places than digits - S ++ lists:duplicate(N, $0) ++ ".0"; - _ -> - insert_decimal_exp(Place, S) - end; -insert_decimal(Place, S) when Place > -6 -> - "0." ++ lists:duplicate(abs(Place), $0) ++ S; -insert_decimal(Place, S) -> - insert_decimal_exp(Place, S). - -insert_decimal_exp(Place, S) -> - [C | S0] = S, - S1 = case S0 of - [] -> - "0"; - _ -> - S0 - end, - Exp = case Place < 0 of - true -> - "e-"; - false -> - "e+" - end, - [C] ++ "." ++ S1 ++ Exp ++ integer_to_list(abs(Place - 1)). - - -digits1(Float, Exp, Frac) -> - Round = ((Frac band 1) =:= 0), - case Exp >= 0 of - true -> - BExp = 1 bsl Exp, - case (Frac =/= ?BIG_POW) of - true -> - scale((Frac * BExp * 2), 2, BExp, BExp, - Round, Round, Float); - false -> - scale((Frac * BExp * 4), 4, (BExp * 2), BExp, - Round, Round, Float) - end; - false -> - case (Exp =:= ?MIN_EXP) orelse (Frac =/= ?BIG_POW) of - true -> - scale((Frac * 2), 1 bsl (1 - Exp), 1, 1, - Round, Round, Float); - false -> - scale((Frac * 4), 1 bsl (2 - Exp), 2, 1, - Round, Round, Float) - end - end. - -scale(R, S, MPlus, MMinus, LowOk, HighOk, Float) -> - Est = int_ceil(math:log10(abs(Float)) - 1.0e-10), - %% Note that the scheme implementation uses a 326 element look-up table - %% for int_pow(10, N) where we do not. - case Est >= 0 of - true -> - fixup(R, S * int_pow(10, Est), MPlus, MMinus, Est, - LowOk, HighOk); - false -> - Scale = int_pow(10, -Est), - fixup(R * Scale, S, MPlus * Scale, MMinus * Scale, Est, - LowOk, HighOk) - end. - -fixup(R, S, MPlus, MMinus, K, LowOk, HighOk) -> - TooLow = case HighOk of - true -> - (R + MPlus) >= S; - false -> - (R + MPlus) > S - end, - case TooLow of - true -> - [(K + 1) | generate(R, S, MPlus, MMinus, LowOk, HighOk)]; - false -> - [K | generate(R * 10, S, MPlus * 10, MMinus * 10, LowOk, HighOk)] - end. - -generate(R0, S, MPlus, MMinus, LowOk, HighOk) -> - D = R0 div S, - R = R0 rem S, - TC1 = case LowOk of - true -> - R =< MMinus; - false -> - R < MMinus - end, - TC2 = case HighOk of - true -> - (R + MPlus) >= S; - false -> - (R + MPlus) > S - end, - case TC1 of - false -> - case TC2 of - false -> - [D | generate(R * 10, S, MPlus * 10, MMinus * 10, - LowOk, HighOk)]; - true -> - [D + 1] - end; - true -> - case TC2 of - false -> - [D]; - true -> - case R * 2 < S of - true -> - [D]; - false -> - [D + 1] - end - end - end. - -unpack(Float) -> - <<Sign:1, Exp:11, Frac:52>> = <<Float:64/float>>, - {Sign, Exp, Frac}. - -frexp1({_Sign, 0, 0}) -> - {0.0, 0}; -frexp1({Sign, 0, Frac}) -> - Exp = log2floor(Frac), - <<Frac1:64/float>> = <<Sign:1, ?FLOAT_BIAS:11, (Frac-1):52>>, - {Frac1, -(?FLOAT_BIAS) - 52 + Exp}; -frexp1({Sign, Exp, Frac}) -> - <<Frac1:64/float>> = <<Sign:1, ?FLOAT_BIAS:11, Frac:52>>, - {Frac1, Exp - ?FLOAT_BIAS}. - -log2floor(Int) -> - log2floor(Int, 0). - -log2floor(0, N) -> - N; -log2floor(Int, N) -> - log2floor(Int bsr 1, 1 + N). - - -transform_digits(Place, [0 | Rest]) -> - transform_digits(Place, Rest); -transform_digits(Place, Digits) -> - {Place, [$0 + D || D <- Digits]}. - - -frexp_int(F) -> - case unpack(F) of - {_Sign, 0, Frac} -> - {Frac, ?MIN_EXP}; - {_Sign, Exp, Frac} -> - {Frac + (1 bsl 52), Exp - 53 - ?FLOAT_BIAS} - end. - -%% -%% Tests -%% --ifdef(TEST). --include_lib("eunit/include/eunit.hrl"). - -int_ceil_test() -> - ?assertEqual(1, int_ceil(0.0001)), - ?assertEqual(0, int_ceil(0.0)), - ?assertEqual(1, int_ceil(0.99)), - ?assertEqual(1, int_ceil(1.0)), - ?assertEqual(-1, int_ceil(-1.5)), - ?assertEqual(-2, int_ceil(-2.0)), - ok. - -int_pow_test() -> - ?assertEqual(1, int_pow(1, 1)), - ?assertEqual(1, int_pow(1, 0)), - ?assertEqual(1, int_pow(10, 0)), - ?assertEqual(10, int_pow(10, 1)), - ?assertEqual(100, int_pow(10, 2)), - ?assertEqual(1000, int_pow(10, 3)), - ok. - -digits_test() -> - ?assertEqual("0", - digits(0)), - ?assertEqual("0.0", - digits(0.0)), - ?assertEqual("1.0", - digits(1.0)), - ?assertEqual("-1.0", - digits(-1.0)), - ?assertEqual("0.1", - digits(0.1)), - ?assertEqual("0.01", - digits(0.01)), - ?assertEqual("0.001", - digits(0.001)), - ?assertEqual("1.0e+6", - digits(1000000.0)), - ?assertEqual("0.5", - digits(0.5)), - ?assertEqual("4503599627370496.0", - digits(4503599627370496.0)), - %% small denormalized number - %% 4.94065645841246544177e-324 =:= 5.0e-324 - <<SmallDenorm/float>> = <<0,0,0,0,0,0,0,1>>, - ?assertEqual("5.0e-324", - digits(SmallDenorm)), - ?assertEqual(SmallDenorm, - list_to_float(digits(SmallDenorm))), - %% large denormalized number - %% 2.22507385850720088902e-308 - <<BigDenorm/float>> = <<0,15,255,255,255,255,255,255>>, - ?assertEqual("2.225073858507201e-308", - digits(BigDenorm)), - ?assertEqual(BigDenorm, - list_to_float(digits(BigDenorm))), - %% small normalized number - %% 2.22507385850720138309e-308 - <<SmallNorm/float>> = <<0,16,0,0,0,0,0,0>>, - ?assertEqual("2.2250738585072014e-308", - digits(SmallNorm)), - ?assertEqual(SmallNorm, - list_to_float(digits(SmallNorm))), - %% large normalized number - %% 1.79769313486231570815e+308 - <<LargeNorm/float>> = <<127,239,255,255,255,255,255,255>>, - ?assertEqual("1.7976931348623157e+308", - digits(LargeNorm)), - ?assertEqual(LargeNorm, - list_to_float(digits(LargeNorm))), - %% issue #10 - mochinum:frexp(math:pow(2, -1074)). - ?assertEqual("5.0e-324", - digits(math:pow(2, -1074))), - ok. - -frexp_test() -> - %% zero - ?assertEqual({0.0, 0}, frexp(0.0)), - %% one - ?assertEqual({0.5, 1}, frexp(1.0)), - %% negative one - ?assertEqual({-0.5, 1}, frexp(-1.0)), - %% small denormalized number - %% 4.94065645841246544177e-324 - <<SmallDenorm/float>> = <<0,0,0,0,0,0,0,1>>, - ?assertEqual({0.5, -1073}, frexp(SmallDenorm)), - %% large denormalized number - %% 2.22507385850720088902e-308 - <<BigDenorm/float>> = <<0,15,255,255,255,255,255,255>>, - ?assertEqual( - {0.99999999999999978, -1022}, - frexp(BigDenorm)), - %% small normalized number - %% 2.22507385850720138309e-308 - <<SmallNorm/float>> = <<0,16,0,0,0,0,0,0>>, - ?assertEqual({0.5, -1021}, frexp(SmallNorm)), - %% large normalized number - %% 1.79769313486231570815e+308 - <<LargeNorm/float>> = <<127,239,255,255,255,255,255,255>>, - ?assertEqual( - {0.99999999999999989, 1024}, - frexp(LargeNorm)), - %% issue #10 - mochinum:frexp(math:pow(2, -1074)). - ?assertEqual( - {0.5, -1073}, - frexp(math:pow(2, -1074))), - ok. - --endif. |
