From 09d9acff625508a75508958fe591229f14d780c1 Mon Sep 17 00:00:00 2001 From: Florian Prill <florian.prill@dwd.de> Date: Thu, 25 Apr 2019 11:06:02 +0200 Subject: [PATCH] [divide_timespans] implemented large integer division algorithm for (days + msecs). - not yet enabled in mtime library. --- examples/Makefile.in | 446 +++++++++++++++++++------------------ examples/int_div_example.c | 99 ++++++++ include/int_div.h | 46 ++++ src/Makefile.in | 287 +++++++++--------------- src/int_div.c | 253 +++++++++++++++++++++ 5 files changed, 733 insertions(+), 398 deletions(-) create mode 100644 examples/int_div_example.c create mode 100644 include/int_div.h create mode 100644 src/int_div.c diff --git a/examples/Makefile.in b/examples/Makefile.in index c60195b0..8938a376 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -88,26 +88,20 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -@ENABLE_EXAMPLES_TRUE@noinst_PROGRAMS = callback_test$(EXEEXT) \ -@ENABLE_EXAMPLES_TRUE@ comp_weights$(EXEEXT) duration$(EXEEXT) \ -@ENABLE_EXAMPLES_TRUE@ example$(EXEEXT) example_hl$(EXEEXT) \ -@ENABLE_EXAMPLES_TRUE@ iconatm$(EXEEXT) iconoce$(EXEEXT) \ -@ENABLE_EXAMPLES_TRUE@ iconoce_hl$(EXEEXT) \ -@ENABLE_EXAMPLES_TRUE@ model_integration$(EXEEXT) \ -@ENABLE_EXAMPLES_TRUE@ modulo$(EXEEXT) output_control$(EXEEXT) \ -@ENABLE_EXAMPLES_TRUE@ recurrence$(EXEEXT) repetitor$(EXEEXT) \ -@ENABLE_EXAMPLES_TRUE@ simulate_iau$(EXEEXT) tas$(EXEEXT) \ -@ENABLE_EXAMPLES_TRUE@ time_calculus$(EXEEXT) uniq$(EXEEXT) \ -@ENABLE_EXAMPLES_TRUE@ test_dace$(EXEEXT) +noinst_PROGRAMS = time_calculus$(EXEEXT) model_integration$(EXEEXT) \ + example$(EXEEXT) example_hl$(EXEEXT) duration$(EXEEXT) \ + output_control$(EXEEXT) recurrence$(EXEEXT) repetitor$(EXEEXT) \ + tas$(EXEEXT) uniq$(EXEEXT) modulo$(EXEEXT) \ + comp_weights$(EXEEXT) callback_test$(EXEEXT) iconatm$(EXEEXT) \ + iconoce$(EXEEXT) iconoce_hl$(EXEEXT) simulate_iau$(EXEEXT) \ + int_div_example$(EXEEXT) subdir = examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/acx_fc_module.m4 \ - $(top_srcdir)/m4/acx_lang_lib.m4 \ - $(top_srcdir)/m4/acx_lang_package.m4 \ - $(top_srcdir)/m4/ax_prog_doxygen.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \ + $(top_srcdir)/m4/ax_prog_ragel.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) @@ -116,82 +110,122 @@ CONFIG_HEADER = $(top_builddir)/config/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) -callback_test_SOURCES = callback_test.f90 -callback_test_OBJECTS = callback_test.$(OBJEXT) -callback_test_LDADD = $(LDADD) -callback_test_DEPENDENCIES = $(top_builddir)/src/libmtime.la +am_callback_test_OBJECTS = callback_test.$(OBJEXT) +callback_test_OBJECTS = $(am_callback_test_OBJECTS) +callback_test_DEPENDENCIES = ../src/libmtime.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = -comp_weights_SOURCES = comp_weights.f90 -comp_weights_OBJECTS = comp_weights.$(OBJEXT) -comp_weights_LDADD = $(LDADD) -comp_weights_DEPENDENCIES = $(top_builddir)/src/libmtime.la -am_duration_OBJECTS = duration.$(OBJEXT) mo_kind.$(OBJEXT) +callback_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(callback_test_LDFLAGS) $(LDFLAGS) -o $@ +am_comp_weights_OBJECTS = comp_weights.$(OBJEXT) +comp_weights_OBJECTS = $(am_comp_weights_OBJECTS) +comp_weights_DEPENDENCIES = ../src/libmtime.la +comp_weights_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(comp_weights_LDFLAGS) $(LDFLAGS) -o $@ +am_duration_OBJECTS = duration.$(OBJEXT) duration_OBJECTS = $(am_duration_OBJECTS) -duration_LDADD = $(LDADD) -duration_DEPENDENCIES = $(top_builddir)/src/libmtime.la -example_SOURCES = example.f90 -example_OBJECTS = example.$(OBJEXT) -example_LDADD = $(LDADD) -example_DEPENDENCIES = $(top_builddir)/src/libmtime.la -example_hl_SOURCES = example_hl.f90 -example_hl_OBJECTS = example_hl.$(OBJEXT) -example_hl_LDADD = $(LDADD) -example_hl_DEPENDENCIES = $(top_builddir)/src/libmtime.la -am_iconatm_OBJECTS = iconatm.$(OBJEXT) mo_event_manager.$(OBJEXT) +duration_DEPENDENCIES = ../src/libmtime.la +duration_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(duration_LDFLAGS) $(LDFLAGS) -o $@ +am_example_OBJECTS = example.$(OBJEXT) +example_OBJECTS = $(am_example_OBJECTS) +example_DEPENDENCIES = ../src/libmtime.la +example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(example_LDFLAGS) $(LDFLAGS) -o $@ +am_example_hl_OBJECTS = example_hl.$(OBJEXT) +example_hl_OBJECTS = $(am_example_hl_OBJECTS) +example_hl_DEPENDENCIES = ../src/libmtime.la +example_hl_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(example_hl_LDFLAGS) $(LDFLAGS) -o $@ +am_iconatm_OBJECTS = iconatm.$(OBJEXT) iconatm_OBJECTS = $(am_iconatm_OBJECTS) -iconatm_LDADD = $(LDADD) -iconatm_DEPENDENCIES = $(top_builddir)/src/libmtime.la -am_iconoce_OBJECTS = iconoce.$(OBJEXT) mo_event_manager.$(OBJEXT) +iconatm_DEPENDENCIES = ../src/libmtime.la +iconatm_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(iconatm_LDFLAGS) $(LDFLAGS) -o $@ +am_iconoce_OBJECTS = iconoce.$(OBJEXT) mo_output_event_types.$(OBJEXT) \ + mo_kind.$(OBJEXT) iconoce_OBJECTS = $(am_iconoce_OBJECTS) -iconoce_LDADD = $(LDADD) -iconoce_DEPENDENCIES = $(top_builddir)/src/libmtime.la -iconoce_hl_SOURCES = iconoce_hl.f90 -iconoce_hl_OBJECTS = iconoce_hl.$(OBJEXT) -iconoce_hl_LDADD = $(LDADD) -iconoce_hl_DEPENDENCIES = $(top_builddir)/src/libmtime.la +iconoce_DEPENDENCIES = ../src/libmtime.la +iconoce_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(iconoce_LDFLAGS) $(LDFLAGS) -o $@ +am_iconoce_hl_OBJECTS = iconoce_hl.$(OBJEXT) \ + mo_output_event_types.$(OBJEXT) mo_kind.$(OBJEXT) +iconoce_hl_OBJECTS = $(am_iconoce_hl_OBJECTS) +iconoce_hl_DEPENDENCIES = ../src/libmtime.la +iconoce_hl_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(iconoce_hl_LDFLAGS) $(LDFLAGS) -o $@ am_model_integration_OBJECTS = model_integration.$(OBJEXT) model_integration_OBJECTS = $(am_model_integration_OBJECTS) -model_integration_LDADD = $(LDADD) -model_integration_DEPENDENCIES = $(top_builddir)/src/libmtime.la +model_integration_DEPENDENCIES = ../src/libmtime.la +model_integration_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(model_integration_LDFLAGS) $(LDFLAGS) \ + -o $@ am_modulo_OBJECTS = modulo.$(OBJEXT) modulo_OBJECTS = $(am_modulo_OBJECTS) -modulo_LDADD = $(LDADD) -modulo_DEPENDENCIES = $(top_builddir)/src/libmtime.la -output_control_SOURCES = output_control.f90 -output_control_OBJECTS = output_control.$(OBJEXT) -output_control_LDADD = $(LDADD) -output_control_DEPENDENCIES = $(top_builddir)/src/libmtime.la +modulo_DEPENDENCIES = ../src/libmtime.la +modulo_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(modulo_LDFLAGS) $(LDFLAGS) -o $@ +am_output_control_OBJECTS = output_control.$(OBJEXT) +output_control_OBJECTS = $(am_output_control_OBJECTS) +output_control_DEPENDENCIES = ../src/libmtime.la +output_control_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(FCLD) \ + $(AM_FCFLAGS) $(FCFLAGS) $(output_control_LDFLAGS) $(LDFLAGS) \ + -o $@ am_recurrence_OBJECTS = recurrence.$(OBJEXT) recurrence_OBJECTS = $(am_recurrence_OBJECTS) -recurrence_LDADD = $(LDADD) -recurrence_DEPENDENCIES = $(top_builddir)/src/libmtime.la -repetitor_SOURCES = repetitor.f90 -repetitor_OBJECTS = repetitor.$(OBJEXT) -repetitor_LDADD = $(LDADD) -repetitor_DEPENDENCIES = $(top_builddir)/src/libmtime.la -simulate_iau_SOURCES = simulate_iau.f90 -simulate_iau_OBJECTS = simulate_iau.$(OBJEXT) -simulate_iau_LDADD = $(LDADD) -simulate_iau_DEPENDENCIES = $(top_builddir)/src/libmtime.la -tas_SOURCES = tas.f90 -tas_OBJECTS = tas.$(OBJEXT) -tas_LDADD = $(LDADD) -tas_DEPENDENCIES = $(top_builddir)/src/libmtime.la -am_test_dace_OBJECTS = test_dace.$(OBJEXT) mo_event_manager.$(OBJEXT) -test_dace_OBJECTS = $(am_test_dace_OBJECTS) -test_dace_LDADD = $(LDADD) -test_dace_DEPENDENCIES = $(top_builddir)/src/libmtime.la +recurrence_DEPENDENCIES = ../src/libmtime.la +recurrence_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(recurrence_LDFLAGS) $(LDFLAGS) -o $@ +am_repetitor_OBJECTS = repetitor.$(OBJEXT) +repetitor_OBJECTS = $(am_repetitor_OBJECTS) +repetitor_DEPENDENCIES = ../src/libmtime.la +repetitor_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(repetitor_LDFLAGS) $(LDFLAGS) -o $@ +am_simulate_iau_OBJECTS = simulate_iau.$(OBJEXT) +simulate_iau_OBJECTS = $(am_simulate_iau_OBJECTS) +simulate_iau_DEPENDENCIES = ../src/libmtime.la +simulate_iau_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(simulate_iau_LDFLAGS) $(LDFLAGS) -o $@ +am_tas_OBJECTS = tas.$(OBJEXT) +tas_OBJECTS = $(am_tas_OBJECTS) +tas_DEPENDENCIES = ../src/libmtime.la +tas_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(tas_LDFLAGS) $(LDFLAGS) -o $@ am_time_calculus_OBJECTS = time_calculus.$(OBJEXT) time_calculus_OBJECTS = $(am_time_calculus_OBJECTS) -time_calculus_LDADD = $(LDADD) -time_calculus_DEPENDENCIES = $(top_builddir)/src/libmtime.la -uniq_SOURCES = uniq.f90 -uniq_OBJECTS = uniq.$(OBJEXT) -uniq_LDADD = $(LDADD) -uniq_DEPENDENCIES = $(top_builddir)/src/libmtime.la +time_calculus_DEPENDENCIES = ../src/libmtime.la +time_calculus_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(time_calculus_LDFLAGS) $(LDFLAGS) -o $@ +am_uniq_OBJECTS = uniq.$(OBJEXT) +uniq_OBJECTS = $(am_uniq_OBJECTS) +uniq_DEPENDENCIES = ../src/libmtime.la +uniq_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(uniq_LDFLAGS) $(LDFLAGS) -o $@ +am_int_div_example_OBJECTS = int_div_example.$(OBJEXT) +int_div_example_OBJECTS = $(am_int_div_example_OBJECTS) +int_div_example_DEPENDENCIES = ../src/libmtime.la +int_div_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ + $(int_div_example_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false @@ -244,25 +278,27 @@ AM_V_FCLD = $(am__v_FCLD_@AM_V@) am__v_FCLD_ = $(am__v_FCLD_@AM_DEFAULT_V@) am__v_FCLD_0 = @echo " FCLD " $@; am__v_FCLD_1 = -SOURCES = callback_test.f90 comp_weights.f90 $(duration_SOURCES) \ - example.f90 example_hl.f90 $(iconatm_SOURCES) \ - $(iconoce_SOURCES) iconoce_hl.f90 $(model_integration_SOURCES) \ - $(modulo_SOURCES) output_control.f90 $(recurrence_SOURCES) \ - repetitor.f90 simulate_iau.f90 tas.f90 $(test_dace_SOURCES) \ - $(time_calculus_SOURCES) uniq.f90 -DIST_SOURCES = callback_test.f90 comp_weights.f90 $(duration_SOURCES) \ - example.f90 example_hl.f90 $(iconatm_SOURCES) \ - $(iconoce_SOURCES) iconoce_hl.f90 $(model_integration_SOURCES) \ - $(modulo_SOURCES) output_control.f90 $(recurrence_SOURCES) \ - repetitor.f90 simulate_iau.f90 tas.f90 $(test_dace_SOURCES) \ - $(time_calculus_SOURCES) uniq.f90 +SOURCES = $(callback_test_SOURCES) $(comp_weights_SOURCES) \ + $(duration_SOURCES) $(example_SOURCES) $(example_hl_SOURCES) \ + $(iconatm_SOURCES) $(iconoce_SOURCES) $(iconoce_hl_SOURCES) \ + $(model_integration_SOURCES) $(modulo_SOURCES) \ + $(output_control_SOURCES) $(recurrence_SOURCES) \ + $(repetitor_SOURCES) $(simulate_iau_SOURCES) $(tas_SOURCES) \ + $(time_calculus_SOURCES) $(uniq_SOURCES) \ + $(int_div_example_SOURCES) +DIST_SOURCES = $(callback_test_SOURCES) $(comp_weights_SOURCES) \ + $(duration_SOURCES) $(example_SOURCES) $(example_hl_SOURCES) \ + $(iconatm_SOURCES) $(iconoce_SOURCES) $(iconoce_hl_SOURCES) \ + $(model_integration_SOURCES) $(modulo_SOURCES) \ + $(output_control_SOURCES) $(recurrence_SOURCES) \ + $(repetitor_SOURCES) $(simulate_iau_SOURCES) $(tas_SOURCES) \ + $(time_calculus_SOURCES) $(uniq_SOURCES) \ + $(int_div_example_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac -am__extra_recursive_targets = doc-recursive install-doc-recursive \ - man-recursive install-man-recursive am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is @@ -295,8 +331,6 @@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ -CHECK_CFLAGS = @CHECK_CFLAGS@ -CHECK_CLIBS = @CHECK_CLIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ @@ -337,8 +371,8 @@ EXEEXT = @EXEEXT@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ -FCMODEXT = @FCMODEXT@ -FCMODINC = @FCMODINC@ +FC_MODEXT = @FC_MODEXT@ +FC_MODINC = @FC_MODINC@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ @@ -374,11 +408,13 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RAGEL = @RAGEL@ +RAGELFLAGS = @RAGELFLAGS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ +TAR = @TAR@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -388,6 +424,7 @@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_FC = @ac_ct_FC@ +ac_empty = @ac_empty@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -435,30 +472,61 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/include -AM_FCFLAGS = $(FCMODINC)$(top_builddir)/src -LDADD = $(top_builddir)/src/libmtime.la -AM_DEFAULT_SOURCE_EXT = .f90 -duration_SOURCES = duration.f90 mo_kind.f90 -iconatm_SOURCES = iconatm.f90 mo_event_manager.f90 -iconoce_SOURCES = iconoce.f90 mo_event_manager.f90 +AM_FCFLAGS = $(FC_MODINC)../src $(FCFLAGS_f90) +time_calculus_SOURCES = time_calculus.c +time_calculus_LDADD = ../src/libmtime.la +time_calculus_LDFLAGS = model_integration_SOURCES = model_integration.c -modulo_SOURCES = modulo.c +model_integration_LDADD = ../src/libmtime.la +model_integration_LDFLAGS = +example_SOURCES = example.f90 +example_LDADD = ../src/libmtime.la +example_LDFLAGS = +example_hl_SOURCES = example_hl.f90 +example_hl_LDADD = ../src/libmtime.la +example_hl_LDFLAGS = +duration_SOURCES = duration.f90 +duration_LDADD = ../src/libmtime.la +duration_LDFLAGS = +output_control_SOURCES = output_control.f90 +output_control_LDADD = ../src/libmtime.la +output_control_LDFLAGS = recurrence_SOURCES = recurrence.c -time_calculus_SOURCES = time_calculus.c -test_dace_SOURCES = test_dace.f90 mo_event_manager.f90 -@FCMODUC_FALSE@mo_event_manager_mod = mo_event_manager.$(FCMODEXT) -@FCMODUC_TRUE@mo_event_manager_mod = MO_EVENT_MANAGER.$(FCMODEXT) -@FCMODUC_FALSE@mo_exception_mod = mo_exception.$(FCMODEXT) -@FCMODUC_TRUE@mo_exception_mod = MO_EXCEPTION.$(FCMODEXT) -@FCMODUC_FALSE@mo_kind_mod = mo_kind.$(FCMODEXT) -@FCMODUC_TRUE@mo_kind_mod = MO_KIND.$(FCMODEXT) -@FCMODUC_FALSE@mtime_error_handling_mod = mtime_error_handling.$(FCMODEXT) -@FCMODUC_TRUE@mtime_error_handling_mod = MTIME_ERROR_HANDLING.$(FCMODEXT) -@FCMODUC_FALSE@mtime_hl_mod = mtime_hl.$(FCMODEXT) -@FCMODUC_TRUE@mtime_hl_mod = MTIME_HL.$(FCMODEXT) -@FCMODUC_FALSE@mtime_mod = mtime.$(FCMODEXT) -@FCMODUC_TRUE@mtime_mod = MTIME.$(FCMODEXT) -MOSTLYCLEANFILES = $(mo_event_manager_mod) $(mo_exception_mod) $(mo_kind_mod) +recurrence_LDADD = ../src/libmtime.la +recurrence_LDFLAGS = +repetitor_SOURCES = repetitor.f90 +repetitor_LDADD = ../src/libmtime.la +repetitor_LDFLAGS = +comp_weights_SOURCES = comp_weights.f90 +comp_weights_LDADD = ../src/libmtime.la +comp_weights_LDFLAGS = +tas_SOURCES = tas.f90 +tas_LDADD = ../src/libmtime.la +tas_LDFLAGS = +uniq_SOURCES = uniq.f90 +uniq_LDADD = ../src/libmtime.la +uniq_LDFLAGS = +modulo_SOURCES = modulo.c +modulo_LDADD = ../src/libmtime.la +modulo_LDFLAGS = +callback_test_SOURCES = callback_test.f90 +callback_test_LDADD = ../src/libmtime.la +callback_test_LDFLAGS = +iconatm_SOURCES = iconatm.f90 +iconatm_LDADD = ../src/libmtime.la +iconatm_LDFLAGS = +iconoce_SOURCES = iconoce.f90 mo_output_event_types.f90 mo_kind.f90 +iconoce_LDADD = ../src/libmtime.la +iconoce_LDFLAGS = +iconoce_hl_SOURCES = iconoce_hl.f90 mo_output_event_types.f90 mo_kind.f90 +iconoce_hl_LDADD = ../src/libmtime.la +iconoce_hl_LDFLAGS = +simulate_iau_SOURCES = simulate_iau.f90 +simulate_iau_LDADD = ../src/libmtime.la +simulate_iau_LDFLAGS = +int_div_example_SOURCES = int_div_example.f90 +int_div_example_LDADD = ../src/libmtime.la +int_div_example_LDFLAGS = all: all-am .SUFFIXES: @@ -472,9 +540,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign examples/Makefile + $(AUTOMAKE) --gnu examples/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -504,75 +572,75 @@ clean-noinstPROGRAMS: callback_test$(EXEEXT): $(callback_test_OBJECTS) $(callback_test_DEPENDENCIES) $(EXTRA_callback_test_DEPENDENCIES) @rm -f callback_test$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(callback_test_OBJECTS) $(callback_test_LDADD) $(LIBS) + $(AM_V_FCLD)$(callback_test_LINK) $(callback_test_OBJECTS) $(callback_test_LDADD) $(LIBS) comp_weights$(EXEEXT): $(comp_weights_OBJECTS) $(comp_weights_DEPENDENCIES) $(EXTRA_comp_weights_DEPENDENCIES) @rm -f comp_weights$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(comp_weights_OBJECTS) $(comp_weights_LDADD) $(LIBS) + $(AM_V_FCLD)$(comp_weights_LINK) $(comp_weights_OBJECTS) $(comp_weights_LDADD) $(LIBS) duration$(EXEEXT): $(duration_OBJECTS) $(duration_DEPENDENCIES) $(EXTRA_duration_DEPENDENCIES) @rm -f duration$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(duration_OBJECTS) $(duration_LDADD) $(LIBS) + $(AM_V_FCLD)$(duration_LINK) $(duration_OBJECTS) $(duration_LDADD) $(LIBS) example$(EXEEXT): $(example_OBJECTS) $(example_DEPENDENCIES) $(EXTRA_example_DEPENDENCIES) @rm -f example$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(example_OBJECTS) $(example_LDADD) $(LIBS) + $(AM_V_FCLD)$(example_LINK) $(example_OBJECTS) $(example_LDADD) $(LIBS) example_hl$(EXEEXT): $(example_hl_OBJECTS) $(example_hl_DEPENDENCIES) $(EXTRA_example_hl_DEPENDENCIES) @rm -f example_hl$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(example_hl_OBJECTS) $(example_hl_LDADD) $(LIBS) + $(AM_V_FCLD)$(example_hl_LINK) $(example_hl_OBJECTS) $(example_hl_LDADD) $(LIBS) iconatm$(EXEEXT): $(iconatm_OBJECTS) $(iconatm_DEPENDENCIES) $(EXTRA_iconatm_DEPENDENCIES) @rm -f iconatm$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(iconatm_OBJECTS) $(iconatm_LDADD) $(LIBS) + $(AM_V_FCLD)$(iconatm_LINK) $(iconatm_OBJECTS) $(iconatm_LDADD) $(LIBS) iconoce$(EXEEXT): $(iconoce_OBJECTS) $(iconoce_DEPENDENCIES) $(EXTRA_iconoce_DEPENDENCIES) @rm -f iconoce$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(iconoce_OBJECTS) $(iconoce_LDADD) $(LIBS) + $(AM_V_FCLD)$(iconoce_LINK) $(iconoce_OBJECTS) $(iconoce_LDADD) $(LIBS) iconoce_hl$(EXEEXT): $(iconoce_hl_OBJECTS) $(iconoce_hl_DEPENDENCIES) $(EXTRA_iconoce_hl_DEPENDENCIES) @rm -f iconoce_hl$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(iconoce_hl_OBJECTS) $(iconoce_hl_LDADD) $(LIBS) + $(AM_V_FCLD)$(iconoce_hl_LINK) $(iconoce_hl_OBJECTS) $(iconoce_hl_LDADD) $(LIBS) model_integration$(EXEEXT): $(model_integration_OBJECTS) $(model_integration_DEPENDENCIES) $(EXTRA_model_integration_DEPENDENCIES) @rm -f model_integration$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(model_integration_OBJECTS) $(model_integration_LDADD) $(LIBS) + $(AM_V_CCLD)$(model_integration_LINK) $(model_integration_OBJECTS) $(model_integration_LDADD) $(LIBS) modulo$(EXEEXT): $(modulo_OBJECTS) $(modulo_DEPENDENCIES) $(EXTRA_modulo_DEPENDENCIES) @rm -f modulo$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(modulo_OBJECTS) $(modulo_LDADD) $(LIBS) + $(AM_V_CCLD)$(modulo_LINK) $(modulo_OBJECTS) $(modulo_LDADD) $(LIBS) output_control$(EXEEXT): $(output_control_OBJECTS) $(output_control_DEPENDENCIES) $(EXTRA_output_control_DEPENDENCIES) @rm -f output_control$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(output_control_OBJECTS) $(output_control_LDADD) $(LIBS) + $(AM_V_FCLD)$(output_control_LINK) $(output_control_OBJECTS) $(output_control_LDADD) $(LIBS) recurrence$(EXEEXT): $(recurrence_OBJECTS) $(recurrence_DEPENDENCIES) $(EXTRA_recurrence_DEPENDENCIES) @rm -f recurrence$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(recurrence_OBJECTS) $(recurrence_LDADD) $(LIBS) + $(AM_V_CCLD)$(recurrence_LINK) $(recurrence_OBJECTS) $(recurrence_LDADD) $(LIBS) repetitor$(EXEEXT): $(repetitor_OBJECTS) $(repetitor_DEPENDENCIES) $(EXTRA_repetitor_DEPENDENCIES) @rm -f repetitor$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(repetitor_OBJECTS) $(repetitor_LDADD) $(LIBS) + $(AM_V_FCLD)$(repetitor_LINK) $(repetitor_OBJECTS) $(repetitor_LDADD) $(LIBS) simulate_iau$(EXEEXT): $(simulate_iau_OBJECTS) $(simulate_iau_DEPENDENCIES) $(EXTRA_simulate_iau_DEPENDENCIES) @rm -f simulate_iau$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(simulate_iau_OBJECTS) $(simulate_iau_LDADD) $(LIBS) + $(AM_V_FCLD)$(simulate_iau_LINK) $(simulate_iau_OBJECTS) $(simulate_iau_LDADD) $(LIBS) tas$(EXEEXT): $(tas_OBJECTS) $(tas_DEPENDENCIES) $(EXTRA_tas_DEPENDENCIES) @rm -f tas$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(tas_OBJECTS) $(tas_LDADD) $(LIBS) - -test_dace$(EXEEXT): $(test_dace_OBJECTS) $(test_dace_DEPENDENCIES) $(EXTRA_test_dace_DEPENDENCIES) - @rm -f test_dace$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(test_dace_OBJECTS) $(test_dace_LDADD) $(LIBS) + $(AM_V_FCLD)$(tas_LINK) $(tas_OBJECTS) $(tas_LDADD) $(LIBS) time_calculus$(EXEEXT): $(time_calculus_OBJECTS) $(time_calculus_DEPENDENCIES) $(EXTRA_time_calculus_DEPENDENCIES) @rm -f time_calculus$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(time_calculus_OBJECTS) $(time_calculus_LDADD) $(LIBS) + $(AM_V_CCLD)$(time_calculus_LINK) $(time_calculus_OBJECTS) $(time_calculus_LDADD) $(LIBS) uniq$(EXEEXT): $(uniq_OBJECTS) $(uniq_DEPENDENCIES) $(EXTRA_uniq_DEPENDENCIES) @rm -f uniq$(EXEEXT) - $(AM_V_FCLD)$(FCLINK) $(uniq_OBJECTS) $(uniq_LDADD) $(LIBS) + $(AM_V_FCLD)$(uniq_LINK) $(uniq_OBJECTS) $(uniq_LDADD) $(LIBS) + +int_div_example$(EXEEXT): $(int_div_example_OBJECTS) $(int_div_example_DEPENDENCIES) $(EXTRA_int_div_example_DEPENDENCIES) + @rm -f int_div_example$(EXEEXT) + $(AM_V_FCLD)$(int_div_example_LINK) $(int_div_example_OBJECTS) $(int_div_example_LDADD) $(LIBS) -lgmp mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -613,23 +681,19 @@ am--depfiles: $(am__depfiles_remade) @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .f90.o: - $(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $< + $(AM_V_FC)$(FCCOMPILE) -c -o $@ $< .f90.obj: - $(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'` + $(AM_V_FC)$(FCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .f90.lo: - $(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $< + $(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -doc-local: -install-doc-local: -man-local: -install-man-local: ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique @@ -740,7 +804,6 @@ install-strip: "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: - -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) clean-generic: @@ -765,10 +828,6 @@ distclean: distclean-am distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags -doc: doc-am - -doc-am: doc-local - dvi: dvi-am dvi-am: @@ -783,10 +842,6 @@ info-am: install-data-am: -install-doc: install-doc-am - -install-doc-am: install-doc-local - install-dvi: install-dvi-am install-dvi-am: @@ -801,9 +856,7 @@ install-info: install-info-am install-info-am: -install-man: install-man-am - -install-man-am: install-man-local +install-man: install-pdf: install-pdf-am @@ -823,14 +876,10 @@ maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic -man: man-am - -man-am: man-local - mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool mostlyclean-local + mostlyclean-libtool pdf: pdf-am @@ -847,61 +896,26 @@ uninstall-am: .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir doc-am doc-local dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-doc-am install-doc-local \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-html install-html-am install-info install-info-am \ - install-man install-man-am install-man-local install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic man-am man-local mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - mostlyclean-local pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am .PRECIOUS: Makefile -$(mo_event_manager_mod): mo_event_manager.$(OBJEXT) -$(mo_kind_mod): mo_kind.$(OBJEXT) - -$(mo_event_manager_mod) $(mo_kind_mod): - @if test -z $<; then \ - echo "Cannot find Fortran source file providing module '$(basename $(@F))'." >&2; \ - elif test ! -f $@; then \ - rm -f $<; $(MAKE) $(AM_MAKEFLAGS) $<; \ - fi +mo_kind.$(OBJEXT): mo_kind.f90 +mo_output_event_types.$(OBJEXT): mo_output_event_types.f90 mo_kind.$(OBJEXT) -callback_test.$(OBJEXT) \ -comp_weights.$(OBJEXT) \ -duration.$(OBJEXT) \ -example.$(OBJEXT) \ -iconatm.$(OBJEXT) \ -iconoce.$(OBJEXT) \ -iconoce_hl.$(OBJEXT) \ -mo_event_manager.$(OBJEXT) \ -output_control.$(OBJEXT) \ -repetitor.$(OBJEXT) \ -simulate_iau.$(OBJEXT) \ -tas.$(OBJEXT) \ -uniq.$(OBJEXT) \ -test_dace.$(OBJEXT): $(top_builddir)/src/$(mtime_mod) - -example_hl.$(OBJEXT) \ -iconoce_hl.$(OBJEXT) \ -simulate_iau.$(OBJEXT): $(top_builddir)/src/$(mtime_hl_mod) - -duration.$(OBJEXT): \ - $(mo_kind_mod) \ - $(top_builddir)/src/$(mtime_error_handling_mod) - -iconatm.$(OBJEXT) \ -iconoce.$(OBJEXT) \ -test_dace.$(OBJEXT): $(mo_event_manager_mod) - -mostlyclean-local: - rm -f *.i +duration.$(OBJEXT): duration.f90 mo_kind.$(OBJEXT) +iconoce.$(OBJEXT): iconoce.f90 mo_output_event_types.$(OBJEXT) +iconoce_hl.$(OBJEXT): iconoce_hl.f90 mo_output_event_types.$(OBJEXT) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/examples/int_div_example.c b/examples/int_div_example.c new file mode 100644 index 00000000..9bbc075d --- /dev/null +++ b/examples/int_div_example.c @@ -0,0 +1,99 @@ +/* -------------------------------------------------------------------------------- + * EXAMPLE.C + * + * 04/2019 : F. Prill, DWD + * + * limitations: + * + * - the remainder in the mtime struct "_divisionquotienttimespan" is + * limited to int64_t msecs. + * + * -------------------------------------------------------------------------------- */ + +#include <stdio.h> +#include <stdlib.h> +#include <inttypes.h> +#include "int_div.h" +#include <gmp.h> + +int divide_timespan_mpz(const t_int days1, const t_int day_fraction1, + const t_int days2, const t_int day_fraction2, + t_int *q_decimal, t_int *remainder_days, t_int *remainder_ms); + +int main(void) { + const int NREPEAT = 3000000; + + int ret, i, cnt = 0; + t_int days1, day_fraction1, days2, day_fraction2; + t_int q_decimal0 = 0, remainder_days0 = 0, remainder_ms0 = 0; + t_int q_decimal = 0, remainder_days = 0, remainder_ms = 0; + + double f1 = 1728000000.0 / (double) RAND_MAX; + double f2 = 86400000.0 / (double) RAND_MAX; + + printf("test program\n"); + printf(" checking %d random divisions against GNU Multiple Precision Arithmetic Library\n",NREPEAT); + srand ( 123 ); + + for (i=0; i<NREPEAT; i++) { + /* test randomly generated input against GNU Multiple Precision + Arithmetic Library: */ + days1 = (t_int) ( f1 * (double) rand() ); + day_fraction1 = (t_int) ( f2 * (double) rand() ); + days2 = (t_int) ( f1 * (double) rand() ); + day_fraction2 = (t_int) ( f2 * (double) rand() ); + + ret = divide_timespan_mpz(days1, day_fraction1, days2, day_fraction2, + &q_decimal0, &remainder_days0, &remainder_ms0); + ret = divide_timespan(days1, day_fraction1, days2, day_fraction2, + &q_decimal, &remainder_days, &remainder_ms); + + if ((ret != 0) || + (q_decimal != q_decimal0) || + (remainder_days != remainder_days0) || + (remainder_ms != remainder_ms0)) + { + printf("dividend: %" PRId64 " : %" PRId64 " \n", days1, day_fraction1); + printf("divisor : %" PRId64 " : %" PRId64 " \n", days2, day_fraction2); + printf("comparison: quotient_out = %" PRId64 ", remainder = %" PRId64 " : %" PRId64 "\n", + q_decimal0, remainder_days0, remainder_ms0); + printf("quotient_out = %" PRId64 ", remainder = %" PRId64 " : %" PRId64 "\n", + q_decimal, remainder_days, remainder_ms); + printf("return code = %d\n",ret); + cnt++; + } + } + + printf(" %d discrepancies reported.\n", cnt); + printf("test program done after %d tests.\n", NREPEAT); + exit(0); +} + + +int divide_timespan_mpz(const t_int days1, const t_int day_fraction1, + const t_int days2, const t_int day_fraction2, + t_int *q_decimal, t_int *remainder_days, t_int *remainder_ms) +{ + mpz_t a0, a1, a2, b1, b2, q, r; + + mpz_inits(a0,a1,a2,b1,b2,q,r,NULL); + + mpz_set_ui(a0, 86400000); + mpz_set_ui(a1,days1); + mpz_set_ui(a2,day_fraction1); + mpz_set_ui(b1,days2); + mpz_set_ui(b2,day_fraction2); + + mpz_addmul(a2,a1,a0); + mpz_addmul(b2,b1,a0); + mpz_fdiv_qr(q,r,a2,b2); + + *q_decimal = mpz_get_ui(q); + + mpz_fdiv_qr(a2,b2,r,a0); + *remainder_days = mpz_get_ui(a2); + *remainder_ms = mpz_get_ui(b2); + + mpz_clears(a0,a1,a2,b1,b2,q,r,NULL); + return 0; +} diff --git a/include/int_div.h b/include/int_div.h new file mode 100644 index 00000000..480bc4f9 --- /dev/null +++ b/include/int_div.h @@ -0,0 +1,46 @@ +/* + Large integer division algorithm for (days + msecs). + + 04/2019 : F. Prill, DWD. + + The method uses a basis b=1200 representation for time spans and the + division algorithm explained in + + P. B. Hansen: Multiple-Length Division Revisited: A Tour of the Minefield (192) + Electrical Engineering and Computer Science Technical Reports. 166. +*/ + +#ifndef INT_DIV_H_ +#define INT_DIV_H_ + +#include <stdint.h> + +/* array representation has (w+1) digits: */ +#define W_DIGITS 6 + +typedef int64_t t_int; + +/* data type for a natural number represented by an array of + (W_DIGITS+1) digits in radix b. */ +typedef t_int t_number[W_DIGITS + 1]; + + +void number_init(t_number *x, const t_int val, const unsigned int m); +void print_number(const t_number x); +unsigned int length(const t_number x); +void product(t_number *x, const t_number y, const t_int k, const t_int b, int* ret); +void quotient(t_number *x, const t_number y, t_int k, const t_int b); +void iremainder(t_number *x, const t_number y, t_int k, const t_int b); +t_int trial(const t_number r, const t_number d, const int k, const int m, const t_int b, int* ret); +int smaller(const t_number r, const t_number dq, const int k, const int m); +void difference(t_number *r, const t_number dq, const int k, const int m, const t_int b, int *ret); +int division(const t_number x, const t_number y, t_number *q, t_number *r, const t_int b); + +void convert_basis(const t_int v_in, t_number *v_out, const int digits, const int istart); +t_int convert_to_decimal(const t_number v_in, const int istart, const int iend); + +int divide_timespan(const t_int days1, const t_int day_fraction1, + const t_int days2, const t_int day_fraction2, + t_int *q_decimal, t_int *remainder_days, t_int *remainder_ms); + +#endif /* INT_DIV_H_ */ diff --git a/src/Makefile.in b/src/Makefile.in index 7fc54e1b..a8bad531 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -91,16 +91,15 @@ build_triplet = @build@ host_triplet = @host@ subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/acx_fc_module.m4 \ - $(top_srcdir)/m4/acx_lang_lib.m4 \ - $(top_srcdir)/m4/acx_lang_package.m4 \ - $(top_srcdir)/m4/ax_prog_doxygen.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prog_doxygen.m4 \ + $(top_srcdir)/m4/ax_prog_ragel.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) -DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config/config.h CONFIG_CLEAN_FILES = @@ -135,14 +134,16 @@ am__uninstall_files_from_dir = { \ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libmtime_la_LIBADD = -am_libmtime_la_OBJECTS = kepler.lo libmtime.lo libmtime_hl.lo \ - mtime_c_bindings.lo mtime_calendar.lo mtime_calendar360day.lo \ +am__objects_1 = mtime_calendar.lo mtime_calendar360day.lo \ mtime_calendar365day.lo mtime_calendarGregorian.lo \ - mtime_constants.lo mtime_date.lo mtime_datetime.lo \ - mtime_error_handling.lo mtime_eventHandling.lo \ - mtime_eventList.lo mtime_iso8601.lo mtime_julianDay.lo \ - mtime_time.lo mtime_timedelta.lo mtime_utilities.lo orbit.lo \ - vsop87.lo + mtime_iso8601.lo mtime_date.lo mtime_datetime.lo \ + mtime_julianDay.lo mtime_time.lo mtime_timedelta.lo \ + mtime_eventList.lo mtime_eventHandling.lo mtime_utilities.lo \ + vsop87.lo kepler.lo orbit.lo int_div.lo +am__objects_2 = error_handling.lo mtime_constants.lo \ + mtime_error_handling.lo mtime_c_bindings.lo libmtime.lo \ + libmtime_hl.lo +am_libmtime_la_OBJECTS = $(am__objects_1) $(am__objects_2) libmtime_la_OBJECTS = $(am_libmtime_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -174,7 +175,8 @@ am__depfiles_remade = ./$(DEPDIR)/kepler.Plo \ ./$(DEPDIR)/mtime_julianDay.Plo ./$(DEPDIR)/mtime_time.Plo \ ./$(DEPDIR)/mtime_timedelta.Plo \ ./$(DEPDIR)/mtime_utilities.Plo ./$(DEPDIR)/orbit.Plo \ - ./$(DEPDIR)/vsop87.Plo + ./$(DEPDIR)/vsop87.Plo \ + ./$(DEPDIR)/int_div.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -216,9 +218,7 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac -HEADERS = $(nodist_include_HEADERS) -am__extra_recursive_targets = doc-recursive install-doc-recursive \ - man-recursive install-man-recursive +HEADERS = $(include_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is @@ -251,8 +251,6 @@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ -CHECK_CFLAGS = @CHECK_CFLAGS@ -CHECK_CLIBS = @CHECK_CLIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ @@ -293,8 +291,8 @@ EXEEXT = @EXEEXT@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ -FCMODEXT = @FCMODEXT@ -FCMODINC = @FCMODINC@ +FC_MODEXT = @FC_MODEXT@ +FC_MODINC = @FC_MODINC@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ @@ -330,11 +328,13 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RAGEL = @RAGEL@ +RAGELFLAGS = @RAGELFLAGS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ +TAR = @TAR@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -344,6 +344,7 @@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_FC = @ac_ct_FC@ +ac_empty = @ac_empty@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -390,84 +391,56 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -lib_LTLIBRARIES = libmtime.la AM_CPPFLAGS = -I$(top_srcdir)/include -libmtime_la_SOURCES = \ - kepler.c \ - libmtime.f90 \ - libmtime_hl.f90 \ - mtime_c_bindings.f90 \ - mtime_calendar.c \ - mtime_calendar360day.c \ - mtime_calendar365day.c \ - mtime_calendarGregorian.c \ - mtime_constants.f90 \ - mtime_date.c \ - mtime_datetime.c \ - mtime_error_handling.f90 \ - mtime_eventHandling.c \ - mtime_eventList.c \ - mtime_iso8601.c \ - mtime_julianDay.c \ - mtime_t_datetime.inc \ - mtime_t_event.inc \ - mtime_t_juliandelta.inc \ - mtime_t_timedelta.inc \ - mtime_time.c \ - mtime_timedelta.c \ - mtime_utilities.c \ - orbit.c \ - vsop87.c - -@FCMODUC_FALSE@mtime_c_bindings_mod = mtime_c_bindings.$(FCMODEXT) -@FCMODUC_TRUE@mtime_c_bindings_mod = MTIME_C_BINDINGS.$(FCMODEXT) -@FCMODUC_FALSE@mtime_constants_mod = mtime_constants.$(FCMODEXT) -@FCMODUC_TRUE@mtime_constants_mod = MTIME_CONSTANTS.$(FCMODEXT) -@FCMODUC_FALSE@mtime_error_handling_mod = mtime_error_handling.$(FCMODEXT) -@FCMODUC_TRUE@mtime_error_handling_mod = MTIME_ERROR_HANDLING.$(FCMODEXT) -@FCMODUC_FALSE@mtime_hl_mod = mtime_hl.$(FCMODEXT) -@FCMODUC_TRUE@mtime_hl_mod = MTIME_HL.$(FCMODEXT) -@FCMODUC_FALSE@mtime_mod = mtime.$(FCMODEXT) -@FCMODUC_TRUE@mtime_mod = MTIME.$(FCMODEXT) -@FCMODUC_FALSE@mtime_other_mods = \ -@FCMODUC_FALSE@ mtime_calendar.$(FCMODEXT) \ -@FCMODUC_FALSE@ mtime_date.$(FCMODEXT) \ -@FCMODUC_FALSE@ mtime_datetime.$(FCMODEXT) \ -@FCMODUC_FALSE@ mtime_eventgroups.$(FCMODEXT) \ -@FCMODUC_FALSE@ mtime_events.$(FCMODEXT) \ -@FCMODUC_FALSE@ mtime_julianday.$(FCMODEXT) \ -@FCMODUC_FALSE@ mtime_juliandelta.$(FCMODEXT) \ -@FCMODUC_FALSE@ mtime_time.$(FCMODEXT) \ -@FCMODUC_FALSE@ mtime_timedelta.$(FCMODEXT) \ -@FCMODUC_FALSE@ mtime_utilities.$(FCMODEXT) - -@FCMODUC_TRUE@mtime_other_mods = \ -@FCMODUC_TRUE@ MTIME_CALENDAR.$(FCMODEXT) \ -@FCMODUC_TRUE@ MTIME_DATE.$(FCMODEXT) \ -@FCMODUC_TRUE@ MTIME_DATETIME.$(FCMODEXT) \ -@FCMODUC_TRUE@ MTIME_EVENTGROUPS.$(FCMODEXT) \ -@FCMODUC_TRUE@ MTIME_EVENTS.$(FCMODEXT) \ -@FCMODUC_TRUE@ MTIME_JULIANDAY.$(FCMODEXT) \ -@FCMODUC_TRUE@ MTIME_JULIANDELTA.$(FCMODEXT) \ -@FCMODUC_TRUE@ MTIME_TIME.$(FCMODEXT) \ -@FCMODUC_TRUE@ MTIME_TIMEDELTA.$(FCMODEXT) \ -@FCMODUC_TRUE@ MTIME_UTILITIES.$(FCMODEXT) - -@FCMODUC_FALSE@mtime_print_by_callback_mod = mtime_print_by_callback.$(FCMODEXT) -@FCMODUC_TRUE@mtime_print_by_callback_mod = MTIME_PRINT_BY_CALLBACK.$(FCMODEXT) -all_mods = \ - $(mtime_c_bindings_mod) \ - $(mtime_constants_mod) \ - $(mtime_error_handling_mod) \ - $(mtime_hl_mod) \ - $(mtime_mod) \ - $(mtime_other_mods) \ - $(mtime_print_by_callback_mod) - -nodist_include_HEADERS = $(all_mods) -MOSTLYCLEANFILES = $(all_mods) -CLEANFILES = libmtime.pyc -EXTRA_DIST = mtime_iso8601.rl libmtime.py +AM_FCFLAGS = $(FCFLAGS_f90) +lib_LTLIBRARIES = libmtime.la +c_SOURCES = mtime_calendar.c \ + mtime_calendar360day.c \ + mtime_calendar365day.c \ + mtime_calendarGregorian.c \ + mtime_iso8601.c \ + mtime_date.c \ + mtime_datetime.c \ + mtime_julianDay.c \ + mtime_time.c \ + mtime_timedelta.c \ + mtime_eventList.c \ + mtime_eventHandling.c \ + mtime_utilities.c \ + vsop87.c \ + kepler.c \ + orbit.c \ + int_div.c + + +# Fortran sources: this list is ordered with respect to the module +# dependencies! +ftn_SOURCES = error_handling.f90 \ + mtime_constants.f90 \ + mtime_error_handling.f90 \ + mtime_c_bindings.f90 \ + libmtime.f90 \ + libmtime_hl.f90 + +include_HEADERS = mtime_hl.$(FC_MODEXT) \ + mtime.$(FC_MODEXT) \ + mtime_calendar.$(FC_MODEXT) \ + mtime_date.$(FC_MODEXT) \ + mtime_datetime.$(FC_MODEXT) \ + mtime_eventgroups.$(FC_MODEXT) \ + mtime_events.$(FC_MODEXT) \ + mtime_julianday.$(FC_MODEXT) \ + mtime_time.$(FC_MODEXT) \ + mtime_timedelta.$(FC_MODEXT) \ + mtime_error_handling.$(FC_MODEXT) \ + mtime_constants.$(FC_MODEXT) \ + mtime_c_bindings.$(FC_MODEXT) + +libmtime_la_SOURCES = $(c_SOURCES) $(ftn_SOURCES) +DISTCLEANFILES = $(include_HEADERS) \ + libmtime.pyc + +EXTRA_DIST = $(srcdir)/mtime_iso8601.rl $(srcdir)/libmtime.py all: all-am .SUFFIXES: @@ -481,9 +454,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign src/Makefile + $(AUTOMAKE) --gnu src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ @@ -562,6 +535,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mtime_utilities.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orbit.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vsop87.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/int_div.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @@ -591,22 +565,22 @@ am--depfiles: $(am__depfiles_remade) @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .f90.o: - $(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $< + $(AM_V_FC)$(FCCOMPILE) -c -o $@ $< .f90.obj: - $(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'` + $(AM_V_FC)$(FCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .f90.lo: - $(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $< + $(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -install-nodist_includeHEADERS: $(nodist_include_HEADERS) +install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) - @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ @@ -620,15 +594,11 @@ install-nodist_includeHEADERS: $(nodist_include_HEADERS) $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done -uninstall-nodist_includeHEADERS: +uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) - @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) -doc-local: -install-doc-local: -man-local: -install-man-local: ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique @@ -742,14 +712,13 @@ install-strip: "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: - -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -776,14 +745,11 @@ distclean: distclean-am -rm -f ./$(DEPDIR)/mtime_utilities.Plo -rm -f ./$(DEPDIR)/orbit.Plo -rm -f ./$(DEPDIR)/vsop87.Plo + -rm -f ./$(DEPDIR)/int_div.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags -doc: doc-am - -doc-am: doc-local - dvi: dvi-am dvi-am: @@ -796,11 +762,7 @@ info: info-am info-am: -install-data-am: install-nodist_includeHEADERS - -install-doc: install-doc-am - -install-doc-am: install-doc-local +install-data-am: install-includeHEADERS install-dvi: install-dvi-am @@ -816,9 +778,7 @@ install-info: install-info-am install-info-am: -install-man: install-man-am - -install-man-am: install-man-local +install-man: install-pdf: install-pdf-am @@ -847,17 +807,14 @@ maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/mtime_utilities.Plo -rm -f ./$(DEPDIR)/orbit.Plo -rm -f ./$(DEPDIR)/vsop87.Plo + -rm -f ./$(DEPDIR)/int_div.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic -man: man-am - -man-am: man-local - mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool mostlyclean-local + mostlyclean-libtool pdf: pdf-am @@ -867,67 +824,33 @@ ps: ps-am ps-am: -uninstall-am: uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS +uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir doc-am doc-local dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-doc-am install-doc-local \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-html install-html-am install-info install-info-am \ - install-libLTLIBRARIES install-man install-man-am \ - install-man-local install-nodist_includeHEADERS install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic man-am man-local mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - mostlyclean-local pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-libLTLIBRARIES \ - uninstall-nodist_includeHEADERS + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-libLTLIBRARIES install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-includeHEADERS \ + uninstall-libLTLIBRARIES .PRECIOUS: Makefile -$(mtime_c_bindings_mod): mtime_c_bindings.lo -$(mtime_constants_mod): mtime_constants.lo -$(mtime_error_handling_mod) $(mtime_print_by_callback_mod): mtime_error_handling.lo -$(mtime_hl_mod): libmtime_hl.lo -$(mtime_mod) $(mtime_other_mods): libmtime.lo - -$(all_mods): - @if test -z $<; then \ - echo "Cannot find Fortran source file providing module '$(basename $(@F))'." >&2; \ - elif test ! -f $@; then \ - rm -f $<; $(MAKE) $(AM_MAKEFLAGS) $<; \ - fi - -libmtime.lo: \ - $(mtime_c_bindings_mod) \ - $(mtime_constants_mod) \ - $(mtime_error_handling_mod) \ - $(mtime_print_by_callback_mod) - -libmtime_hl.lo: \ - $(mtime_c_bindings_mod) \ - $(mtime_constants_mod) \ - $(mtime_error_handling_mod) \ - $(mtime_mod) - -mtime_c_bindings.lo: \ - $(mtime_constants_mod) \ - $(mtime_error_handling_mod) - -mtime_error_handling.lo: $(mtime_constants_mod) - -@ENABLE_RAGEL_RULES_TRUE@mtime_iso8601.c: mtime_iso8601.rl -@ENABLE_RAGEL_RULES_TRUE@ $(AM_V_GEN)$(RAGEL) -o $@ $< +libmtime_hl.o: libmtime_hl.f90 libmtime.o libmtime_c_bindings.o -mostlyclean-local: - rm -f *.i +@HAVE_RAGEL_TRUE@mtime_iso8601.c: mtime_iso8601.rl +@HAVE_RAGEL_TRUE@ $(RAGEL) -o mtime_iso8601.c mtime_iso8601.rl # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/src/int_div.c b/src/int_div.c new file mode 100644 index 00000000..b947fabc --- /dev/null +++ b/src/int_div.c @@ -0,0 +1,253 @@ +/* + Large integer division algorithm for (days + msecs). + + 04/2019 : F. Prill, DWD. + + The method uses a basis b=1200 representation for time spans and the + division algorithm explained in + + P. B. Hansen: Multiple-Length Division Revisited: A Tour of the Minefield (192). + Electrical Engineering and Computer Science Technical Reports. 166. +*/ +#include "int_div.h" + +const int Fail = -1; +const t_int iZero = (t_int) 0; +const t_int msecs_day = 86400000; +t_int const bb[4] = { 1, 1200, 1440000, 1728000000 }; /* powers of b = 1200 */ + + +/* initialize digits m,m+1,...,W_DIGITS by a constant val. */ +void number_init(t_number *x, const t_int val, const unsigned int m) { + int i; + for (i=m; i<=W_DIGITS; ++i) (*x)[i]=val; +} + + +/* linear search to determine the length of a natural number. */ +unsigned int length(const t_number x) { + int i = W_DIGITS; + while ((x[i] == iZero) && (i >= 0)) i--; + return (i+1); +} + + +/* partial arithmetic wrt. radix b: product x=y*k, return ret!=0 if overflow. */ +void product(t_number *x, const t_number y, const t_int k, const t_int b, int* ret) { + int i, m=length(y); + t_int temp, carry = 0; + + if (*ret != 0) return; + for (i=0; i<m; ++i) { + temp = y[i]*k + carry; + (*x)[i] = temp % b; + carry = temp/b; + } + if (m<=W_DIGITS) + (*x)[m] = carry; + else + *ret = (carry != iZero); + for (i=m+1; i<=W_DIGITS; ++i) (*x)[i] = iZero; +} + + +/* partial arithmetic wrt. radix b: quotient x=y/k. */ +void quotient(t_number *x, const t_number y, t_int k, const t_int b) { + int i, m = length(y); + t_int temp, carry = iZero; + number_init(x, iZero, m); + + for (i=m-1; i>=0; i--) { + temp = carry*b + y[i]; + (*x)[i] = temp / k; + carry = temp % k; + } +} + + +/* partial arithmetic wrt. radix b: remainder x of y/k. */ +void iremainder(t_number *x, const t_number y, t_int k, const t_int b) { + int m = length(y), i; + t_int carry = iZero; + + number_init(x, iZero, 1); + for (i=m-1; i>=0; i--) + carry = (carry*b + y[i]) % k; + (*x)[0] = carry; +} + + +/* prefix arithmetic wrt. radix b: estimate of a quotient digit, return <0 if error. */ +t_int trial(const t_number r, const t_number d, + const int k, const int m, const t_int b, int* ret) { + t_int d2,r3,t = iZero; + int km = k+m; +#if DEBUG + if ((m < 2) || (km < m) || (km>W_DIGITS)) *ret = Fail; +#endif + if (*ret != 0) return iZero; + r3 = (r[km]*b + r[km-1])*b + r[km-2]; + d2 = d[m-1]*b + d[m-2]; + + t = r3/d2; + return (t > b-1) ? (b-1) : t; +} + + +/* prefix arithmetic: prefix comparison r{m+1} < dq, return <0 if error. */ +int smaller(const t_number r, const t_number dq, const int k, const int m) { + int i=m; + +#if DEBUG + if ((k < 0) || (k+m < k) || (k+m>W_DIGITS)) return Fail; +#endif + while ((r[i+k] == dq[i]) && (i>=0)) i--; + return r[i+k] < dq[i]; +} + + +/* prefix arithmetic wrt. radix b: prefix subtraction r{m+1} := r{m+1} - dq, return ret!=0 if error. */ +void difference(t_number *r, const t_number dq, const int k, const int m, const t_int b, int *ret) { + int i; + t_int borrow, diff; + +#ifdef DEBUG + if ((k < 0) || (k+m < k) || (k+m>W_DIGITS)) *ret = Fail; +#endif + if (*ret != 0) return; + borrow = iZero; + for (i=0; i<=m; i++) { + diff = (*r)[i+k] - dq[i] - borrow + b; + (*r)[i+k] = diff % b; + borrow = (t_int) 1 - diff / b; + } + *ret = (borrow != iZero); +} + + +/* complete algorithm for multiple length division x/y wrt. radix b, return <0 if error. */ +int division(const t_number x, const t_number y, + t_number *q, t_number *r, const t_int b) { + int i, k, m, n, ret = 0; + t_int y1, f, qt; + t_number d, dq, rm; + + m = length(y); + if (m == 1) { + y1 = y[m-1]; + if (y1 <= 0) return Fail; + quotient(q,x,y1,b); + iremainder(r,x,y1,b); + } + else { + n = length(x); + number_init(q, iZero, 0); + number_init(r, iZero, 0); + if (m > n) + for (i=0; i<n; i++) (*r)[i] = x[i]; + else { + /* long division algorithm */ + if ((m < 2) || (n < m) || (n>W_DIGITS)) return Fail; + f = b / (y[m-1] + (t_int) 1); + product(&rm,x,f,b, &ret); + product(&d, y,f,b, &ret); + for (k=n-m; (k>=0) && (ret == 0); k--) { + qt = trial(rm, d, k, m, b, &ret); + product(&dq,d,qt,b, &ret); + + if ((ret == 0) && (smaller(rm,dq,k,m))) + product(&dq,d,--qt,b, &ret); + + (*q)[k] = qt; + difference(&rm,dq,k,m,b, &ret); + } + quotient(r,rm,f,b); + } + } + return ret; +} + + +/* convert to basis "b" by a succession of Euclidean divisions, stores to v_out[istart...]. */ +void convert_basis(const t_int v_in, t_number *v_out, + const int digits, const int istart) { + int i; + t_int v = v_in; + for (i=digits; i>=0; i--) { + (*v_out)[istart+i] = v / bb[i]; + v %= bb[i]; + } +} + + +/* convert to decimal basis. */ +t_int convert_to_decimal(const t_number v_in, + const int istart, const int iend) { + int i, l = length(v_in); + t_int v_out = iZero; + + if (iend < l) l=iend; + if ((l-istart) > 3) return (t_int) Fail; + for (i=0; i<(l-istart+1); i++) + v_out += v_in[i+istart] * bb[i]; + return v_out; +} + + +/* + convert days and day fraction to b=1200 basis by a succession of + Euclidean divisions. + By pre-multiplying with a factor of 20, the day fraction can be + expressed by three digits wrt. the basis b=1200. + + restrictions: + + - the no. of digits in the algorithm restricts numbers to 1200^3 + days, ie. approx. 4.7 mio years. + - the quotient is limited to 1200^3 in order to fit into int64_t + after conversion to decimal base. + - all numbers and time spans must be positive. +*/ +int divide_timespan(const t_int days1, const t_int day_fraction1, + const t_int days2, const t_int day_fraction2, + t_int *q_decimal, t_int *remainder_days, t_int *remainder_ms) +{ + int ret = 0; + t_number p1, p2, q, r; /* dividend, divisor, quotient, remainder */ + t_int qd = 0, rd = 0; + + if ((day_fraction1 > msecs_day) || (day_fraction2 > msecs_day)) return Fail; + + convert_basis(day_fraction1 * (t_int) 20, &p1, 2, 0); + convert_basis(days1, &p1, W_DIGITS-3, 3); + convert_basis(day_fraction2 * (t_int) 20, &p2, 2, 0); + convert_basis(days2, &p2, W_DIGITS-3, 3); + + ret = division(p1, p2, &q, &r, (t_int) 1200); /* perform division. */ + + if (ret == 0) { + /* convert result back to b=10 basis. */ + *q_decimal = qd = convert_to_decimal(q,0,W_DIGITS); + *remainder_days = convert_to_decimal(r,3,W_DIGITS); + *remainder_ms = rd = convert_to_decimal(r,0,2); + ret = (qd < iZero) || (rd < iZero); + + *remainder_ms /= ((t_int) 20); + } + return ret; +} + + +#ifdef DEBUG + +#include <stdio.h> +#include <inttypes.h> + +/* print number to screen. */ +void print_number(const t_number x) { + int i, m = length(x) - 1; + for (i=m; i>=0; i--) + printf("%" PRId64 " ", x[i]); + printf("\n"); +} +#endif -- GitLab