%%
%% This is file `l3fp.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% l3fp.dtx  (with options: `package')
%% 
%% 
%% EXPERIMENTAL CODE
%% 
%% Do not distribute this file without also distributing the
%% source files specified above.
%% 
%% Do not distribute a modified version of this file.
%% 
%% 
%% File: l3fp.dtx Copyright (C) 2010 LaTeX3 project
%%
%% It may be distributed and/or modified under the conditions of the
%% LaTeX Project Public License (LPPL), either version 1.3c of this
%% license or (at your option) any later version.  The latest version
%% of this license is in the file
%%
%%    http://www.latex-project.org/lppl.txt
%%
%% This file is part of the ``expl3 bundle'' (The Work in LPPL)
%% and all files in that bundle must be distributed together.
%%
%% The released version of this bundle is available from CTAN.
%%
%% -----------------------------------------------------------------------
%%
%% The development version of the bundle can be found at
%%
%%    http://www.latex-project.org/svnroot/experimental/trunk/
%%
%% for those people who are interested.
%%
%%%%%%%%%%%
%% NOTE: %%
%%%%%%%%%%%
%%
%%   Snapshots taken from the repository represent work in progress and may
%%   not work or may contain conflicting material!  We therefore ask
%%   people _not_ to put them into distributions, archives, etc. without
%%   prior consultation with the LaTeX Project Team.
%%
%% -----------------------------------------------------------------------
\RequirePackage{l3names}
\GetIdInfo$Id: l3fp.dtx 2021 2010-09-14 15:59:54Z joseph $
  {L3 Experimental floating-point operations}
\ProvidesExplPackage
  {\filename}{\filedate}{\fileversion}{\filedescription}
\package_check_loaded_expl:
\int_new:N  \c_forty_four
\int_set:Nn \c_forty_four { 44 }
\int_new:N  \c_one_hundred
\int_set:Nn \c_one_hundred { 100 }
\int_new:N  \c_one_thousand
\int_set:Nn \c_one_thousand { 1000 }
\int_new:N  \c_one_million
\int_set:Nn \c_one_million { 1 000 000 }
\int_new:N  \c_one_hundred_million
\int_set:Nn \c_one_hundred_million { 100 000 000 }
\int_new:N  \c_five_hundred_million
\int_set:Nn \c_five_hundred_million { 500 000 000 }
\int_new:N  \c_one_thousand_million
\int_set:Nn \c_one_thousand_million { 1 000 000 000 }
\int_new:N  \c_fp_pi_by_four_decimal_int
\int_set:Nn \c_fp_pi_by_four_decimal_int { 785 398 158 }
\int_new:N  \c_fp_pi_by_four_extended_int
\int_set:Nn \c_fp_pi_by_four_extended_int { 897 448 310 }
\int_new:N  \c_fp_pi_decimal_int
\int_set:Nn \c_fp_pi_decimal_int { 141 592 653 }
\int_new:N  \c_fp_pi_extended_int
\int_set:Nn \c_fp_pi_extended_int { 589 793 238 }
\int_new:N  \c_fp_two_pi_decimal_int
\int_set:Nn \c_fp_two_pi_decimal_int { 283 185 307 }
\int_new:N  \c_fp_two_pi_extended_int
\int_set:Nn \c_fp_two_pi_extended_int { 179 586 477 }
\tl_new:N  \c_infinity_fp
\tl_set:Nn \c_infinity_fp { + 2147483647 . 2147483647 e 2147483647 }
\tl_new:N  \c_pi_fp
\tl_set:Nn \c_pi_fp { + 3.141592654 e 0 }
\tl_new:N  \c_undefined_fp
\tl_set:Nn \c_undefined_fp { X 0.000000000 e 0 }
\tl_new:N  \c_zero_fp
\tl_set:Nn \c_zero_fp { + 0.000000000 e 0 }
\int_new:N \l_fp_count_int
\int_new:N \l_fp_div_offset_int
\int_new:N \l_fp_input_a_sign_int
\int_new:N \l_fp_input_a_integer_int
\int_new:N \l_fp_input_a_decimal_int
\int_new:N \l_fp_input_a_exponent_int
\int_new:N \l_fp_input_b_sign_int
\int_new:N \l_fp_input_b_integer_int
\int_new:N \l_fp_input_b_decimal_int
\int_new:N \l_fp_input_b_exponent_int
\int_new:N \l_fp_input_a_extended_int
\int_new:N \l_fp_input_b_extended_int
\int_new:N \l_fp_mul_a_i_int
\int_new:N \l_fp_mul_a_ii_int
\int_new:N \l_fp_mul_a_iii_int
\int_new:N \l_fp_mul_a_iv_int
\int_new:N \l_fp_mul_a_v_int
\int_new:N \l_fp_mul_a_vi_int
\int_new:N \l_fp_mul_b_i_int
\int_new:N \l_fp_mul_b_ii_int
\int_new:N \l_fp_mul_b_iii_int
\int_new:N \l_fp_mul_b_iv_int
\int_new:N \l_fp_mul_b_v_int
\int_new:N \l_fp_mul_b_vi_int
\int_new:N \l_fp_mul_output_int
\tl_new:N  \l_fp_mul_output_tl
\int_new:N \l_fp_output_sign_int
\int_new:N \l_fp_output_integer_int
\int_new:N \l_fp_output_decimal_int
\int_new:N \l_fp_output_exponent_int
\int_new:N \l_fp_output_extended_int
\bool_new:N \l_fp_round_carry_bool
\tl_new:N \l_fp_round_decimal_tl
\int_new:N \l_fp_round_position_int
\int_new:N \l_fp_round_target_int
\int_new:N \l_fp_split_sign_int
\int_new:N \l_fp_tmp_int
\tl_new:N \l_fp_tmp_tl
\tl_new:N \l_fp_trig_arg_tl
\int_new:N \l_fp_trig_octant_int
\int_new:N \l_fp_trig_sign_int
\int_new:N \l_fp_trig_decimal_int
\int_new:N \l_fp_trig_extended_int
\cs_new_protected_nopar:Npn \fp_read:N #1 {
  \exp_after:wN \fp_read_aux:w #1 \q_stop
}
\cs_new_protected_nopar:Npn \fp_read_aux:w #1#2 . #3 e #4 \q_stop {
  \tex_if:D #1 -
    \l_fp_input_a_sign_int \c_minus_one
  \tex_else:D
    \l_fp_input_a_sign_int \c_one
  \tex_fi:D
  \l_fp_input_a_integer_int  #2 \scan_stop:
  \l_fp_input_a_decimal_int  #3 \scan_stop:
  \l_fp_input_a_exponent_int #4 \scan_stop:
}
\cs_new_protected_nopar:Npn \fp_split:Nn #1#2 {
  \tl_set:Nx \l_fp_tmp_tl {#2}
  \l_fp_split_sign_int \c_one
  \fp_split_sign:
  \use:c { l_fp_input_ #1 _sign_int } \l_fp_split_sign_int
  \exp_after:wN \fp_split_exponent:w \l_fp_tmp_tl e e \q_stop #1
}
\cs_new_protected_nopar:Npn \fp_split_sign: {
  \tex_ifnum:D \pdf_strcmp:D
    { \exp_after:wN \tl_head:w \l_fp_tmp_tl ? \q_nil } { - }
      = \c_zero
    \tl_set:Nx \l_fp_tmp_tl
      {
        \exp_after:wN
          \tl_tail:w \l_fp_tmp_tl \prg_do_nothing: \q_nil
      }
    \l_fp_split_sign_int -\l_fp_split_sign_int
    \exp_after:wN \fp_split_sign:
  \tex_else:D
    \tex_ifnum:D \pdf_strcmp:D
      { \exp_after:wN \tl_head:w \l_fp_tmp_tl ? \q_nil } { + }
        = \c_zero
      \tl_set:Nx \l_fp_tmp_tl
        {
          \exp_after:wN
            \tl_tail:w \l_fp_tmp_tl \prg_do_nothing: \q_nil
        }
      \exp_after:wN \exp_after:wN \exp_after:wN
        \fp_split_sign:
     \tex_fi:D
  \tex_fi:D
}
\cs_new_protected_nopar:Npn
  \fp_split_exponent:w #1 e #2 e #3 \q_stop #4 {
  \use:c { l_fp_input_ #4 _exponent_int }
    \etex_numexpr:D 0 #2 \scan_stop:
  \tex_afterassignment:D \fp_split_aux_i:w
  \use:c { l_fp_input_ #4 _integer_int }
    \etex_numexpr:D 0 #1 . . \q_stop #4
}
\cs_new_protected_nopar:Npn \fp_split_aux_i:w #1 . #2 . #3 \q_stop {
  \fp_split_aux_ii:w #2 000000000 \q_stop
}
\cs_new_protected_nopar:Npn \fp_split_aux_ii:w #1#2#3#4#5#6#7#8#9 {
  \fp_split_aux_iii:w {#1#2#3#4#5#6#7#8#9}
}
\cs_new_protected_nopar:Npn \fp_split_aux_iii:w #1#2 \q_stop {
  \l_fp_tmp_int 1 #1 \scan_stop:
  \exp_after:wN \fp_split_decimal:w
    \int_use:N \l_fp_tmp_int 000000000 \q_stop
}
\cs_new_protected_nopar:Npn \fp_split_decimal:w #1#2#3#4#5#6#7#8#9 {
  \fp_split_decimal_aux:w {#2#3#4#5#6#7#8#9}
}
\cs_new_protected_nopar:Npn \fp_split_decimal_aux:w #1#2#3 \q_stop #4 {
  \use:c { l_fp_input_ #4 _decimal_int } #1#2 \scan_stop:
  \tex_ifnum:D
    \etex_numexpr:D
      \use:c { l_fp_input_ #4 _integer_int } +
      \use:c { l_fp_input_ #4 _decimal_int }
    \scan_stop:
      = \c_zero
    \use:c { l_fp_input_ #4 _sign_int } \c_one
  \tex_fi:D
  \tex_ifnum:D
    \use:c { l_fp_input_ #4 _integer_int } < \c_one_thousand_million
  \tex_else:D
    \exp_after:wN \fp_overflow_msg:
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_standardise:NNNN #1#2#3#4 {
  \tex_ifnum:D
    \etex_numexpr:D #2 + #3 = \c_zero
    #1 \c_one
    #4 \c_zero
    \exp_after:wN \use_none:nnnn
  \tex_else:D
    \exp_after:wN \fp_standardise_aux:NNNN
  \tex_fi:D
  #1#2#3#4
}
\cs_new_protected_nopar:Npn \fp_standardise_aux:NNNN #1#2#3#4 {
  \cs_set_protected_nopar:Npn \fp_standardise_aux:
    {
      \tex_ifnum:D #2 = \c_zero
        \tex_advance:D #3 \c_one_thousand_million
        \exp_after:wN \fp_standardise_aux:w
          \int_use:N #3 \q_stop
         \exp_after:wN \fp_standardise_aux:
       \tex_fi:D
    }
  \cs_set_protected_nopar:Npn
    \fp_standardise_aux:w ##1##2##3##4##5##6##7##8##9 \q_stop
    {
      #2 ##2 \scan_stop:
      #3 ##3##4##5##6##7##8##9 0 \scan_stop:
      \tex_advance:D #4 \c_minus_one
    }
  \fp_standardise_aux:
  \cs_set_protected_nopar:Npn \fp_standardise_aux:
    {
      \tex_ifnum:D #2 > \c_nine
        \tex_advance:D #2 \c_one_thousand_million
        \exp_after:wN \use_i:nn \exp_after:wN
          \fp_standardise_aux:w \int_use:N #2
         \exp_after:wN \fp_standardise_aux:
       \tex_fi:D
    }
  \cs_set_protected_nopar:Npn
    \fp_standardise_aux:w ##1##2##3##4##5##6##7##8##9
    {
      #2 ##1##2##3##4##5##6##7##8 \scan_stop:
      \tex_advance:D #3 \c_one_thousand_million
      \tex_divide:D #3 \c_ten
      \tl_set:Nx \l_fp_tmp_tl
        {
          ##9
          \exp_after:wN \use_none:n \int_use:N #3
        }
      #3 \l_fp_tmp_tl \scan_stop:
      \tex_advance:D #4 \c_one
    }
  \fp_standardise_aux:
  \tex_ifnum:D #4 < \c_one_hundred
    \tex_ifnum:D #4 > -\c_one_hundred
    \tex_else:D
      #1 \c_one
      #2 \c_zero
      #3 \c_zero
      #4 \c_zero
    \tex_fi:D
  \tex_else:D
    \exp_after:wN \fp_overflow_msg:
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_standardise_aux: { }
\cs_new_protected_nopar:Npn \fp_standardise_aux:w { }
\cs_new_protected_nopar:Npn \fp_level_input_exponents: {
  \tex_ifnum:D \l_fp_input_a_exponent_int > \l_fp_input_b_exponent_int
    \exp_after:wN \fp_level_input_exponents_a:
  \tex_else:D
    \exp_after:wN \fp_level_input_exponents_b:
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_level_input_exponents_a: {
  \tex_ifnum:D \l_fp_input_a_exponent_int > \l_fp_input_b_exponent_int
    \tex_advance:D \l_fp_input_b_integer_int \c_one_thousand_million
    \exp_after:wN \use_i:nn \exp_after:wN
      \fp_level_input_exponents_a:NNNNNNNNN
        \int_use:N \l_fp_input_b_integer_int
    \exp_after:wN \fp_level_input_exponents_a:
  \tex_fi:D
}
\cs_new_protected_nopar:Npn
  \fp_level_input_exponents_a:NNNNNNNNN #1#2#3#4#5#6#7#8#9 {
  \l_fp_input_b_integer_int #1#2#3#4#5#6#7#8 \scan_stop:
  \tex_advance:D \l_fp_input_b_decimal_int \c_one_thousand_million
  \tex_divide:D \l_fp_input_b_decimal_int \c_ten
  \tl_set:Nx \l_fp_tmp_tl
    {
      #9
      \exp_after:wN \use_none:n
        \int_use:N \l_fp_input_b_decimal_int
    }
  \l_fp_input_b_decimal_int \l_fp_tmp_tl \scan_stop:
  \tex_advance:D \l_fp_input_b_exponent_int \c_one
}
\cs_new_protected_nopar:Npn \fp_level_input_exponents_b: {
  \tex_ifnum:D \l_fp_input_b_exponent_int > \l_fp_input_a_exponent_int
    \tex_advance:D \l_fp_input_a_integer_int \c_one_thousand_million
    \exp_after:wN \use_i:nn \exp_after:wN
      \fp_level_input_exponents_b:NNNNNNNNN
        \int_use:N \l_fp_input_a_integer_int
    \exp_after:wN \fp_level_input_exponents_b:
  \tex_fi:D
}
\cs_new_protected_nopar:Npn
  \fp_level_input_exponents_b:NNNNNNNNN #1#2#3#4#5#6#7#8#9 {
  \l_fp_input_a_integer_int #1#2#3#4#5#6#7#8 \scan_stop:
  \tex_advance:D \l_fp_input_a_decimal_int \c_one_thousand_million
  \tex_divide:D \l_fp_input_a_decimal_int \c_ten
  \tl_set:Nx \l_fp_tmp_tl
    {
      #9
      \exp_after:wN \use_none:n
        \int_use:N \l_fp_input_a_decimal_int
    }
  \l_fp_input_a_decimal_int \l_fp_tmp_tl \scan_stop:
  \tex_advance:D \l_fp_input_a_exponent_int \c_one
}
\cs_new_protected_nopar:Npn \fp_tmp:w #1#2 { }
\cs_new_protected_nopar:Npn \fp_new:N #1 {
  \tl_new:N #1
  \tl_gset_eq:NN #1 \c_zero_fp
}
\cs_generate_variant:Nn \fp_new:N { c }
\cs_new_protected_nopar:Npn \fp_zero:N #1 {
  \tl_set_eq:NN #1 \c_zero_fp
}
\cs_new_protected_nopar:Npn \fp_gzero:N #1 {
  \tl_gset_eq:NN #1 \c_zero_fp
}
\cs_generate_variant:Nn \fp_zero:N { c }
\cs_generate_variant:Nn \fp_gzero:N { c }
\cs_new_protected_nopar:Npn \fp_set:Nn {
  \fp_set_aux:NNn \tl_set:Nn
}
\cs_new_protected_nopar:Npn \fp_gset:Nn {
  \fp_set_aux:NNn \tl_gset:Nn
}
\cs_new_protected_nopar:Npn \fp_set_aux:NNn #1#2#3 {
  \group_begin:
    \fp_split:Nn a {#3}
    \fp_standardise:NNNN
      \l_fp_input_a_sign_int
      \l_fp_input_a_integer_int
      \l_fp_input_a_decimal_int
      \l_fp_input_a_exponent_int
    \tex_advance:D \l_fp_input_a_decimal_int \c_one_thousand_million
    \cs_set_protected_nopar:Npx \fp_tmp:w
      {
        \group_end:
        #1 \exp_not:N #2
          {
            \tex_ifnum:D \l_fp_input_a_sign_int < \c_zero
              -
            \tex_else:D
              +
            \tex_fi:D
            \int_use:N \l_fp_input_a_integer_int
            .
            \exp_after:wN \use_none:n
              \int_use:N \l_fp_input_a_decimal_int
            e
            \int_use:N \l_fp_input_a_exponent_int
          }
      }
  \fp_tmp:w
}
\cs_generate_variant:Nn \fp_set:Nn  { c }
\cs_generate_variant:Nn \fp_gset:Nn { c }
\cs_new_protected_nopar:Npn \fp_set_from_dim:Nn {
  \fp_set_from_dim_aux:NNn \tl_set:Nx
}
\cs_new_protected_nopar:Npn \fp_gset_from_dim:Nn {
  \fp_set_from_dim_aux:NNn \tl_gset:Nx
}
\cs_new_protected_nopar:Npn \fp_set_from_dim_aux:NNn #1#2#3 {
  \group_begin:
    \l_fp_tmp_skip \etex_glueexpr:D #3 \scan_stop:
    \l_fp_tmp_dim \l_fp_tmp_skip
    \fp_split:Nn a
      {
        \exp_after:wN \fp_set_from_dim_aux:w
          \dim_use:N \l_fp_tmp_dim
      }
    \fp_standardise:NNNN
      \l_fp_input_a_sign_int
      \l_fp_input_a_integer_int
      \l_fp_input_a_decimal_int
      \l_fp_input_a_exponent_int
    \tex_advance:D \l_fp_input_a_decimal_int \c_one_thousand_million
    \cs_set_protected_nopar:Npx \fp_tmp:w
      {
        \group_end:
        #1 \exp_not:N #2
          {
            \tex_ifnum:D \l_fp_input_a_sign_int < \c_zero
              -
            \tex_else:D
              +
            \tex_fi:D
            \int_use:N \l_fp_input_a_integer_int
            .
            \exp_after:wN \use_none:n
              \int_use:N \l_fp_input_a_decimal_int
            e
            \int_use:N \l_fp_input_a_exponent_int
          }
      }
  \fp_tmp:w
}
\cs_set_protected_nopar:Npx \fp_set_from_dim_aux:w {
  \cs_set_nopar:Npn \exp_not:N \fp_set_from_dim_aux:w
    ##1 \tl_to_str:n { pt } {##1}
}
\fp_set_from_dim_aux:w
\cs_generate_variant:Nn \fp_set_from_dim:Nn  { c }
\cs_generate_variant:Nn \fp_gset_from_dim:Nn { c }
\dim_new:N \l_fp_tmp_dim
\skip_new:N \l_fp_tmp_skip
\cs_new_eq:NN \fp_set_eq:NN  \tl_set_eq:NN
\cs_new_eq:NN \fp_set_eq:cN  \tl_set_eq:cN
\cs_new_eq:NN \fp_set_eq:Nc  \tl_set_eq:Nc
\cs_new_eq:NN \fp_set_eq:cc  \tl_set_eq:cc
\cs_new_eq:NN \fp_gset_eq:NN \tl_gset_eq:NN
\cs_new_eq:NN \fp_gset_eq:cN \tl_gset_eq:cN
\cs_new_eq:NN \fp_gset_eq:Nc \tl_gset_eq:Nc
\cs_new_eq:NN \fp_gset_eq:cc \tl_gset_eq:cc
\cs_new_eq:NN \fp_show:N \tl_show:N
\cs_new_eq:NN \fp_show:c \tl_show:c
\cs_new_nopar:Npn \fp_use:N #1 {
  \exp_after:wN \fp_use_aux:w #1 \q_stop
}
\cs_generate_variant:Nn \fp_use:N { c }
\cs_new_nopar:Npn \fp_use_aux:w #1#2 e #3 \q_stop {
  \tex_if:D #1 -
    -
  \tex_fi:D
  \tex_ifnum:D #3 > \c_zero
    \exp_after:wN \fp_use_large:w
  \tex_else:D
    \tex_ifnum:D #3 < \c_zero
      \exp_after:wN \exp_after:wN \exp_after:wN
        \fp_use_small:w
    \tex_else:D
      \exp_after:wN \exp_after:wN \exp_after:wN
        \fp_use_none:w
    \tex_fi:D
  \tex_fi:D
  #2 e #3 \q_stop
}
\cs_new_nopar:Npn \fp_use_none:w #1 e #2 \q_stop {#1}
\cs_new_nopar:Npn \fp_use_small:w #1 . #2 e #3 \q_stop {
  0 .
  \prg_replicate:nn { -#3 - 1 } { 0 }
  #1#2
}
\cs_new_nopar:Npn \fp_use_large:w #1 . #2 e #3 \q_stop {
  \tex_ifnum:D #3 < \c_ten
    \exp_after:wN \fp_use_large_aux_i:w
  \tex_else:D
    \exp_after:wN \fp_use_large_aux_ii:w
  \tex_fi:D
  #1#2 e #3 \q_stop
}
\cs_new_nopar:Npn \fp_use_large_aux_i:w #1#2 e #3 \q_stop {
  #1
  \use:c { fp_use_large_aux_ #3 :w } #2 \q_stop
}
\cs_new_nopar:cpn { fp_use_large_aux_1:w } #1#2 \q_stop { #1 . #2 }
\cs_new_nopar:cpn { fp_use_large_aux_2:w } #1#2#3 \q_stop {
  #1#2 . #3
}
\cs_new_nopar:cpn { fp_use_large_aux_3:w } #1#2#3#4 \q_stop {
  #1#2#3 . #4
}
\cs_new_nopar:cpn { fp_use_large_aux_4:w } #1#2#3#4#5 \q_stop {
  #1#2#3#4 . #5
}
\cs_new_nopar:cpn { fp_use_large_aux_5:w } #1#2#3#4#5#6 \q_stop {
  #1#2#3#4#5 . #6
}
\cs_new_nopar:cpn { fp_use_large_aux_6:w } #1#2#3#4#5#6#7 \q_stop {
  #1#2#3#4#5#6 . #7
}
\cs_new_nopar:cpn { fp_use_large_aux_7:w } #1#2#3#4#5#6#7#8 \q_stop {
  #1#2#3#4#6#7 . #8
}
\cs_new_nopar:cpn { fp_use_large_aux_8:w } #1#2#3#4#5#6#7#8#9 \q_stop {
  #1#2#3#4#5#6#7#8 . #9
}
\cs_new_nopar:cpn { fp_use_large_aux_9:w } #1 \q_stop { #1 . }
\cs_new_nopar:Npn \fp_use_large_aux_ii:w #1 e #2 \q_stop {
  #1
  \prg_replicate:nn { #2 - 9 } { 0 }
  .
}
\cs_new_nopar:Npn \fp_to_int:N #1 {
  \exp_after:wN \fp_to_int_aux:w #1 \q_stop
}
\cs_generate_variant:Nn \fp_to_int:N { c }
\cs_new_nopar:Npn \fp_to_int_aux:w #1#2 e #3 \q_stop {
  \tex_if:D #1 -
    -
  \tex_fi:D
  \tex_ifnum:D #3 < \c_zero
    \exp_after:wN \fp_to_int_small:w
  \tex_else:D
    \exp_after:wN \fp_to_int_large:w
  \tex_fi:D
  #2 e #3 \q_stop
}
\cs_new_nopar:Npn \fp_to_int_small:w #1 . #2 e #3 \q_stop {
  \tex_ifnum:D #3 > \c_one
  \tex_else:D
    \tex_ifnum:D #1 < \c_five
      0
    \tex_else:D
      1
    \tex_fi:D
  \tex_fi:D
}
\cs_new_nopar:Npn \fp_to_int_large:w #1 . #2 e #3 \q_stop {
  \tex_ifnum:D #3 < \c_ten
    \exp_after:wN \fp_to_int_large_aux_i:w
  \tex_else:D
    \exp_after:wN \fp_to_int_large_aux_ii:w
  \tex_fi:D
  #1#2 e #3 \q_stop
}
\cs_new_nopar:Npn \fp_to_int_large_aux_i:w #1#2 e #3 \q_stop {
  \use:c { fp_to_int_large_aux_ #3 :w } #2 \q_stop {#1}
}
\cs_new_nopar:cpn { fp_to_int_large_aux_1:w } #1#2 \q_stop {
  \fp_to_int_large_aux:nnn { #2 0 } {#1}
}
\cs_new_nopar:cpn { fp_to_int_large_aux_2:w } #1#2#3 \q_stop {
  \fp_to_int_large_aux:nnn { #3 00 } {#1#2}
}
\cs_new_nopar:cpn { fp_to_int_large_aux_3:w } #1#2#3#4 \q_stop {
  \fp_to_int_large_aux:nnn { #4 000 } {#1#2#3}
}
\cs_new_nopar:cpn { fp_to_int_large_aux_4:w } #1#2#3#4#5 \q_stop {
  \fp_to_int_large_aux:nnn { #5 0000 } {#1#2#3#4}
}
\cs_new_nopar:cpn { fp_to_int_large_aux_5:w } #1#2#3#4#5#6 \q_stop {
  \fp_to_int_large_aux:nnn { #6 00000 } {#1#2#3#4#5}
}
\cs_new_nopar:cpn { fp_to_int_large_aux_6:w } #1#2#3#4#5#6#7 \q_stop {
  \fp_to_int_large_aux:nnn { #7 000000 } {#1#2#3#4#5#6}
}
\cs_new_nopar:cpn
  { fp_to_int_large_aux_7:w } #1#2#3#4#5#6#7#8 \q_stop {
  \fp_to_int_large_aux:nnn { #8 0000000 } {#1#2#3#4#5#6#7}
}
\cs_new_nopar:cpn
  { fp_to_int_large_aux_8:w } #1#2#3#4#5#6#7#8#9 \q_stop {
  \fp_to_int_large_aux:nnn { #9 00000000 } {#1#2#3#4#5#6#7#8}
}
\cs_new_nopar:cpn { fp_to_int_large_aux_9:w } #1 \q_stop {#1}
\cs_new_nopar:Npn \fp_to_int_large_aux:nnn #1#2#3 {
  \tex_ifnum:D #1 < \c_five_hundred_million
    #3#2
  \tex_else:D
    \tex_number:D \etex_numexpr:D #3#2 + 1 \scan_stop:
  \tex_fi:D
}
\cs_new_nopar:Npn \fp_to_int_large_aux_ii:w #1 e #2 \q_stop {
  #1
  \prg_replicate:nn { #2 - 9 } { 0 }
}
\cs_new_nopar:Npn \fp_to_tl:N #1 {
  \exp_after:wN \fp_to_tl_aux:w #1 \q_stop
}
\cs_generate_variant:Nn \fp_to_tl:N { c }
\cs_new_nopar:Npn \fp_to_tl_aux:w #1#2 e #3 \q_stop {
  \tex_if:D #1 -
    -
  \tex_fi:D
  \tex_ifnum:D #3 < \c_zero
    \exp_after:wN \fp_to_tl_small:w
  \tex_else:D
    \exp_after:wN \fp_to_tl_large:w
  \tex_fi:D
  #2 e #3 \q_stop
}
\cs_new_nopar:Npn \fp_to_tl_large:w #1 e #2 \q_stop {
  \tex_ifnum:D #2 < \c_ten
    \exp_after:wN \fp_to_tl_large_aux_i:w
  \tex_else:D
    \exp_after:wN \fp_to_tl_large_aux_ii:w
  \tex_fi:D
  #1 e #2 \q_stop
}
\cs_new_nopar:Npn \fp_to_tl_large_aux_i:w #1 e #2 \q_stop {
  \use:c { fp_to_tl_large_ #2 :w } #1 \q_stop
}
\cs_new_nopar:Npn \fp_to_tl_large_aux_ii:w #1 . #2 e #3 \q_stop {
  #1
  \fp_to_tl_large_zeros:NNNNNNNNN #2
  e #3
}
\cs_new_nopar:cpn { fp_to_tl_large_0:w } #1 . #2 \q_stop {
  #1
  \fp_to_tl_large_zeros:NNNNNNNNN #2
}
\cs_new_nopar:cpn { fp_to_tl_large_1:w } #1 . #2#3 \q_stop {
  #1#2
  \fp_to_tl_large_zeros:NNNNNNNNN #3 0
}
\cs_new_nopar:cpn { fp_to_tl_large_2:w } #1 . #2#3#4 \q_stop {
  #1#2#3
  \fp_to_tl_large_zeros:NNNNNNNNN #4 00
}
\cs_new_nopar:cpn { fp_to_tl_large_3:w } #1 . #2#3#4#5 \q_stop {
  #1#2#3#4
  \fp_to_tl_large_zeros:NNNNNNNNN #5 000
}
\cs_new_nopar:cpn { fp_to_tl_large_4:w } #1 . #2#3#4#5#6 \q_stop {
  #1#2#3#4#5
  \fp_to_tl_large_zeros:NNNNNNNNN #6 0000
}
\cs_new_nopar:cpn { fp_to_tl_large_5:w } #1 . #2#3#4#5#6#7 \q_stop {
  #1#2#3#4#5#6
  \fp_to_tl_large_zeros:NNNNNNNNN #7 00000
}
\cs_new_nopar:cpn { fp_to_tl_large_6:w } #1 . #2#3#4#5#6#7#8 \q_stop {
  #1#2#3#4#5#6#7
  \fp_to_tl_large_zeros:NNNNNNNNN #8 000000
}
\cs_new_nopar:cpn { fp_to_tl_large_7:w } #1 . #2#3#4#5#6#7#8#9 \q_stop {
  #1#2#3#4#5#6#7#8
  \fp_to_tl_large_zeros:NNNNNNNNN #9 0000000
}
\cs_new_nopar:cpn { fp_to_tl_large_8:w } #1 . {
  #1
  \use:c { fp_to_tl_large_8_aux:w }
}
\cs_new_nopar:cpn
  { fp_to_tl_large_8_aux:w } #1#2#3#4#5#6#7#8#9 \q_stop {
  #1#2#3#4#5#6#7#8
  \fp_to_tl_large_zeros:NNNNNNNNN #9 00000000
}
\cs_new_nopar:cpn { fp_to_tl_large_9:w } #1 . #2 \q_stop {#1#2}
\cs_new_nopar:Npn \fp_to_tl_small:w #1 e #2 \q_stop {
  \tex_ifnum:D #2 = \c_minus_one
    \exp_after:wN \fp_to_tl_small_one:w
  \tex_else:D
    \tex_ifnum:D #2 = -\c_two
      \exp_after:wN \exp_after:wN \exp_after:wN
        \fp_to_tl_small_two:w
    \tex_else:D
      \exp_after:wN \exp_after:wN \exp_after:wN
        \fp_to_tl_small_aux:w
    \tex_fi:D
  \tex_fi:D
  #1 e #2 \q_stop
}
\cs_new_nopar:Npn \fp_to_tl_small_one:w #1 . #2 e #3 \q_stop {
  \tex_ifnum:D \fp_use_ix:NNNNNNNNN #2 > \c_four
    \tex_ifnum:D
      \etex_numexpr:D #1 \fp_use_i_to_iix:NNNNNNNNN #2 + 1
        < \c_one_thousand_million
      0.
      \exp_after:wN \fp_to_tl_small_zeros:NNNNNNNNN
        \tex_number:D
          \etex_numexpr:D
            #1 \fp_use_i_to_iix:NNNNNNNNN #2 + 1
          \scan_stop:
    \tex_else:D
      1
    \tex_fi:D
  \tex_else:D
    0. #1
    \fp_to_tl_small_zeros:NNNNNNNNN #2
  \tex_fi:D
}
\cs_new_nopar:Npn \fp_to_tl_small_two:w #1 . #2 e #3 \q_stop {
  \tex_ifnum:D \fp_use_iix_ix:NNNNNNNNN #2 > \c_forty_four
    \tex_ifnum:D
      \etex_numexpr:D #1 \fp_use_i_to_vii:NNNNNNNNN #2 0 + \c_ten
        < \c_one_thousand_million
      0.0
      \exp_after:wN \fp_to_tl_small_zeros:NNNNNNNNN
        \tex_number:D
          \etex_numexpr:D
            #1 \fp_use_i_to_vii:NNNNNNNNN #2 0 + \c_ten
          \scan_stop:
    \tex_else:D
      0.1
    \tex_fi:D
  \tex_else:D
    0.0
    #1
    \fp_to_tl_small_zeros:NNNNNNNNN #2
  \tex_fi:D
}
\cs_new_nopar:Npn \fp_to_tl_small_aux:w #1 . #2 e #3 \q_stop {
  #1
  \fp_to_tl_large_zeros:NNNNNNNNN #2
  e #3
}
\cs_new_nopar:Npn \fp_to_tl_large_zeros:NNNNNNNNN #1#2#3#4#5#6#7#8#9 {
  \tex_ifnum:D #9 = \c_zero
    \tex_ifnum:D #8 = \c_zero
      \tex_ifnum:D #7 = \c_zero
        \tex_ifnum:D #6 = \c_zero
          \tex_ifnum:D #5 = \c_zero
            \tex_ifnum:D #4 = \c_zero
              \tex_ifnum:D #3 = \c_zero
                \tex_ifnum:D #2 = \c_zero
                  \tex_ifnum:D #1 = \c_zero
                  \tex_else:D
                    . #1
                  \tex_fi:D
                \tex_else:D
                  . #1#2
                \tex_fi:D
              \tex_else:D
                . #1#2#3
              \tex_fi:D
            \tex_else:D
              . #1#2#3#4
            \tex_fi:D
          \tex_else:D
            . #1#2#3#4#5
          \tex_fi:D
        \tex_else:D
          . #1#2#3#4#5#6
        \tex_fi:D
      \tex_else:D
        . #1#2#3#4#5#6#7
      \tex_fi:D
    \tex_else:D
       . #1#2#3#4#5#6#7#8
    \tex_fi:D
  \tex_else:D
    . #1#2#3#4#5#6#7#8#9
  \tex_fi:D
}
\cs_new_nopar:Npn \fp_to_tl_small_zeros:NNNNNNNNN #1#2#3#4#5#6#7#8#9 {
  \tex_ifnum:D #9 = \c_zero
    \tex_ifnum:D #8 = \c_zero
      \tex_ifnum:D #7 = \c_zero
        \tex_ifnum:D #6 = \c_zero
          \tex_ifnum:D #5 = \c_zero
            \tex_ifnum:D #4 = \c_zero
              \tex_ifnum:D #3 = \c_zero
                \tex_ifnum:D #2 = \c_zero
                  \tex_ifnum:D #1 = \c_zero
                  \tex_else:D
                    #1
                  \tex_fi:D
                \tex_else:D
                  #1#2
                \tex_fi:D
              \tex_else:D
                #1#2#3
              \tex_fi:D
            \tex_else:D
              #1#2#3#4
            \tex_fi:D
          \tex_else:D
            #1#2#3#4#5
          \tex_fi:D
        \tex_else:D
          #1#2#3#4#5#6
        \tex_fi:D
      \tex_else:D
        #1#2#3#4#5#6#7
      \tex_fi:D
    \tex_else:D
       #1#2#3#4#5#6#7#8
    \tex_fi:D
  \tex_else:D
    #1#2#3#4#5#6#7#8#9
  \tex_fi:D
}
\cs_new_nopar:Npn \fp_use_iix_ix:NNNNNNNNN #1#2#3#4#5#6#7#8#9 {#8#9}
\cs_new_nopar:Npn \fp_use_ix:NNNNNNNNN #1#2#3#4#5#6#7#8#9 {#9}
\cs_new_nopar:Npn \fp_use_i_to_vii:NNNNNNNNN #1#2#3#4#5#6#7#8#9 {
  #1#2#3#4#5#6#7
}
\cs_new_nopar:Npn \fp_use_i_to_iix:NNNNNNNNN #1#2#3#4#5#6#7#8#9 {
  #1#2#3#4#5#6#7#8
}
\cs_new_protected_nopar:Npn \fp_round_figures:Nn {
  \fp_round_figures_aux:NNn \tl_set:Nn
}
\cs_generate_variant:Nn \fp_round_figures:Nn { c }
\cs_new_protected_nopar:Npn \fp_ground_figures:Nn {
  \fp_round_figures_aux:NNn \tl_gset:Nn
}
\cs_generate_variant:Nn \fp_ground_figures:Nn { c }
\cs_new_protected_nopar:Npn \fp_round_figures_aux:NNn #1#2#3 {
  \group_begin:
    \fp_read:N #2
    \int_set:Nn \l_fp_round_target_int { #3 - 1 }
    \tex_ifnum:D \l_fp_round_target_int < \c_ten
      \exp_after:wN \fp_round:
    \tex_fi:D
    \tex_advance:D \l_fp_input_a_decimal_int \c_one_thousand_million
    \cs_set_protected_nopar:Npx \fp_tmp:w
      {
        \group_end:
        #1 \exp_not:N #2
          {
            \tex_ifnum:D \l_fp_input_a_sign_int < \c_zero
              -
            \tex_else:D
              +
            \tex_fi:D
            \int_use:N \l_fp_input_a_integer_int
            .
            \exp_after:wN \use_none:n
              \int_use:N \l_fp_input_a_decimal_int
            e
            \int_use:N \l_fp_input_a_exponent_int
          }
      }
  \fp_tmp:w
}
\cs_new_protected_nopar:Npn \fp_round_places:Nn {
  \fp_round_places_aux:NNn \tl_set:Nn
}
\cs_generate_variant:Nn \fp_round_places:Nn { c }
\cs_new_protected_nopar:Npn \fp_ground_places:Nn {
  \fp_round_places_aux:NNn \tl_gset:Nn
}
\cs_generate_variant:Nn \fp_ground_places:Nn { c }
\cs_new_protected_nopar:Npn \fp_round_places_aux:NNn #1#2#3 {
  \group_begin:
    \fp_read:N #2
    \int_set:Nn \l_fp_round_target_int
      { #3 + \l_fp_input_a_exponent_int }
    \tex_ifnum:D \l_fp_round_target_int < \c_ten
      \exp_after:wN \fp_round:
    \tex_fi:D
    \tex_advance:D \l_fp_input_a_decimal_int \c_one_thousand_million
    \cs_set_protected_nopar:Npx \fp_tmp:w
      {
        \group_end:
        #1 \exp_not:N #2
          {
            \tex_ifnum:D \l_fp_input_a_sign_int < \c_zero
              -
            \tex_else:D
              +
            \tex_fi:D
            \int_use:N \l_fp_input_a_integer_int
            .
            \exp_after:wN \use_none:n
              \int_use:N \l_fp_input_a_decimal_int
            e
            \int_use:N \l_fp_input_a_exponent_int
          }
      }
  \fp_tmp:w
}
\cs_new_protected_nopar:Npn \fp_round: {
  \bool_set_false:N \l_fp_round_carry_bool
  \l_fp_round_position_int \c_eight
  \tl_clear:N \l_fp_round_decimal_tl
  \tex_advance:D \l_fp_input_a_decimal_int \c_one_thousand_million
  \exp_after:wN \use_i:nn \exp_after:wN
    \fp_round_aux:NNNNNNNNN \int_use:N \l_fp_input_a_decimal_int
}
\cs_new_protected_nopar:Npn \fp_round_aux:NNNNNNNNN #1#2#3#4#5#6#7#8#9 {
  \fp_round_loop:N #9#8#7#6#5#4#3#2#1
  \bool_if:NT \l_fp_round_carry_bool
    { \tex_advance:D \l_fp_input_a_integer_int \c_one }
  \l_fp_input_a_decimal_int \l_fp_round_decimal_tl \scan_stop:
  \tex_ifnum:D \l_fp_input_a_integer_int < \c_ten
  \tex_else:D
    \l_fp_input_a_integer_int \c_one
    \tex_divide:D \l_fp_input_a_decimal_int \c_ten
    \tex_advance:D \l_fp_input_a_exponent_int \c_one
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_round_loop:N #1 {
  \tex_ifnum:D \l_fp_round_position_int < \l_fp_round_target_int
    \bool_if:NTF \l_fp_round_carry_bool
      { \l_fp_tmp_int \etex_numexpr:D #1 + \c_one \scan_stop: }
      { \l_fp_tmp_int \etex_numexpr:D #1 \scan_stop: }
    \tex_ifnum:D \l_fp_tmp_int = \c_ten
      \l_fp_tmp_int \c_zero
    \tex_else:D
      \bool_set_false:N \l_fp_round_carry_bool
    \tex_fi:D
    \tl_set:Nx \l_fp_round_decimal_tl
      { \int_use:N \l_fp_tmp_int \l_fp_round_decimal_tl }
  \tex_else:D
    \tl_set:Nx \l_fp_round_decimal_tl { 0 \l_fp_round_decimal_tl }
    \tex_ifnum:D \l_fp_round_position_int = \l_fp_round_target_int
      \tex_ifnum:D #1 > \c_four
        \bool_set_true:N \l_fp_round_carry_bool
      \tex_fi:D
    \tex_fi:D
  \tex_fi:D
  \tex_advance:D \l_fp_round_position_int \c_minus_one
  \tex_ifnum:D \l_fp_round_position_int > \c_minus_one
    \exp_after:wN \fp_round_loop:N
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_abs:N {
  \fp_abs_aux:NN \tl_set:Nn
}
\cs_new_protected_nopar:Npn \fp_gabs:N {
  \fp_abs_aux:NN \tl_gset:Nn
}
\cs_generate_variant:Nn \fp_abs:N  { c }
\cs_generate_variant:Nn \fp_gabs:N { c }
\cs_new_protected_nopar:Npn \fp_abs_aux:NN #1#2 {
  \group_begin:
    \fp_read:N #2
    \tex_advance:D \l_fp_input_a_decimal_int \c_one_thousand_million
    \cs_set_protected_nopar:Npx \fp_tmp:w
      {
        \group_end:
        #1 \exp_not:N #2
          {
            +
            \int_use:N \l_fp_input_a_integer_int
            .
            \exp_after:wN \use_none:n
              \int_use:N \l_fp_input_a_decimal_int
            e
            \int_use:N \l_fp_input_a_exponent_int
          }
      }
  \fp_tmp:w
}
\cs_new_protected_nopar:Npn \fp_neg:N {
  \fp_neg_aux:NN \tl_set:Nn
}
\cs_new_protected_nopar:Npn \fp_gneg:N {
  \fp_neg_aux:NN \tl_gset:Nn
}
\cs_generate_variant:Nn \fp_neg:N  { c }
\cs_generate_variant:Nn \fp_gneg:N { c }
\cs_new_protected_nopar:Npn \fp_neg_aux:NN #1#2 {
  \group_begin:
    \fp_read:N #2
    \tex_advance:D \l_fp_input_a_decimal_int \c_one_thousand_million
    \tl_set:Nx \l_fp_tmp_tl
      {
        \tex_ifnum:D \l_fp_input_a_sign_int < \c_zero
          +
        \tex_else:D
          -
        \tex_fi:D
        \int_use:N \l_fp_input_a_integer_int
        .
        \exp_after:wN \use_none:n
          \int_use:N \l_fp_input_a_decimal_int
        e
        \int_use:N \l_fp_input_a_exponent_int
      }
  \exp_after:wN \group_end: \exp_after:wN
  #1 \exp_after:wN #2 \exp_after:wN { \l_fp_tmp_tl }
}
\cs_new_protected_nopar:Npn \fp_add:Nn {
  \fp_add_aux:NNn \tl_set:Nn
}
\cs_new_protected_nopar:Npn \fp_gadd:Nn {
  \fp_add_aux:NNn \tl_gset:Nn
}
\cs_generate_variant:Nn \fp_add:Nn   { c }
\cs_generate_variant:Nn \fp_gadd:Nn  { c }
\cs_new_protected_nopar:Npn \fp_add_aux:NNn #1#2#3 {
  \group_begin:
    \fp_read:N #2
    \fp_split:Nn b {#3}
    \fp_standardise:NNNN
      \l_fp_input_b_sign_int
      \l_fp_input_b_integer_int
      \l_fp_input_b_decimal_int
      \l_fp_input_b_exponent_int
    \fp_add_core:
  \fp_tmp:w #1#2
}
\cs_new_protected_nopar:Npn \fp_add_core: {
  \fp_level_input_exponents:
  \tex_ifnum:D
    \etex_numexpr:D
      \l_fp_input_a_sign_int * \l_fp_input_b_sign_int
    \scan_stop:
      > \c_zero
    \exp_after:wN \fp_add_sum:
  \tex_else:D
    \exp_after:wN \fp_add_difference:
  \tex_fi:D
  \l_fp_output_exponent_int \l_fp_input_a_exponent_int
  \fp_standardise:NNNN
    \l_fp_output_sign_int
    \l_fp_output_integer_int
    \l_fp_output_decimal_int
    \l_fp_output_exponent_int
  \cs_set_protected_nopar:Npx \fp_tmp:w ##1##2
    {
      \group_end:
      ##1 ##2
        {
          \tex_ifnum:D \l_fp_output_sign_int < \c_zero
            -
          \tex_else:D
            +
          \tex_fi:D
          \int_use:N \l_fp_output_integer_int
          .
          \exp_after:wN \use_none:n
            \tex_number:D \etex_numexpr:D
               \l_fp_output_decimal_int + \c_one_thousand_million
          e
          \int_use:N \l_fp_output_exponent_int
        }
    }
}
\cs_new_protected_nopar:Npn \fp_add_sum: {
  \l_fp_output_sign_int \l_fp_input_a_sign_int
  \l_fp_output_integer_int
    \etex_numexpr:D
      \l_fp_input_a_integer_int + \l_fp_input_b_integer_int
    \scan_stop:
  \l_fp_output_decimal_int
    \etex_numexpr:D
      \l_fp_input_a_decimal_int + \l_fp_input_b_decimal_int
    \scan_stop:
  \tex_ifnum:D \l_fp_output_decimal_int < \c_one_thousand_million
  \tex_else:D
    \tex_advance:D \l_fp_output_integer_int \c_one
    \tex_advance:D \l_fp_output_decimal_int -\c_one_thousand_million
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_add_difference: {
  \l_fp_output_integer_int
    \etex_numexpr:D
      \l_fp_input_a_integer_int - \l_fp_input_b_integer_int
    \scan_stop:
  \l_fp_output_decimal_int
    \etex_numexpr:D
      \l_fp_input_a_decimal_int - \l_fp_input_b_decimal_int
    \scan_stop:
  \tex_ifnum:D \l_fp_output_decimal_int < \c_zero
    \tex_advance:D \l_fp_output_integer_int \c_minus_one
    \tex_advance:D \l_fp_output_decimal_int \c_one_thousand_million
  \tex_fi:D
  \tex_ifnum:D \l_fp_output_integer_int < \c_zero
    \l_fp_output_sign_int \l_fp_input_b_sign_int
    \tex_ifnum:D \l_fp_output_decimal_int = \c_zero
      \l_fp_output_integer_int -\l_fp_output_integer_int
    \tex_else:D
      \l_fp_output_decimal_int
        \etex_numexpr:D
          \c_one_thousand_million - \l_fp_output_decimal_int
        \scan_stop:
      \l_fp_output_integer_int
         \etex_numexpr:D
           - \l_fp_output_integer_int - \c_one
         \scan_stop:
    \tex_fi:D
  \tex_else:D
    \l_fp_output_sign_int \l_fp_input_a_sign_int
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_sub:Nn {
  \fp_sub_aux:NNn \tl_set:Nn
}
\cs_new_protected_nopar:Npn \fp_gsub:Nn {
  \fp_sub_aux:NNn \tl_gset:Nn
}
\cs_generate_variant:Nn \fp_sub:Nn   { c }
\cs_generate_variant:Nn \fp_gsub:Nn  { c }
\cs_new_protected_nopar:Npn \fp_sub_aux:NNn #1#2#3 {
  \group_begin:
    \fp_read:N #2
    \fp_split:Nn b {#3}
    \fp_standardise:NNNN
      \l_fp_input_b_sign_int
      \l_fp_input_b_integer_int
      \l_fp_input_b_decimal_int
      \l_fp_input_b_exponent_int
    \tex_multiply:D \l_fp_input_b_sign_int \c_minus_one
    \fp_add_core:
  \fp_tmp:w #1#2
}
\cs_new_protected_nopar:Npn \fp_mul:Nn {
  \fp_mul_aux:NNn \tl_set:Nn
}
\cs_new_protected_nopar:Npn \fp_gmul:Nn {
  \fp_mul_aux:NNn \tl_gset:Nn
}
\cs_generate_variant:Nn \fp_mul:Nn  { c }
\cs_generate_variant:Nn \fp_gmul:Nn { c }
\cs_new_protected_nopar:Npn \fp_mul_aux:NNn #1#2#3 {
  \group_begin:
    \fp_read:N #2
    \fp_split:Nn b {#3}
    \fp_standardise:NNNN
      \l_fp_input_b_sign_int
      \l_fp_input_b_integer_int
      \l_fp_input_b_decimal_int
      \l_fp_input_b_exponent_int
    \fp_mul_int:
    \l_fp_output_exponent_int
      \etex_numexpr:D
        \l_fp_input_a_exponent_int + \l_fp_input_b_exponent_int
      \scan_stop:
    \fp_standardise:NNNN
      \l_fp_output_sign_int
      \l_fp_output_integer_int
      \l_fp_output_decimal_int
      \l_fp_output_exponent_int
    \cs_set_protected_nopar:Npx \fp_tmp:w
      {
        \group_end:
        #1 \exp_not:N #2
          {
            \tex_ifnum:D
              \etex_numexpr:D
                \l_fp_input_a_sign_int * \l_fp_input_b_sign_int
                < \c_zero
              \tex_ifnum:D
                \etex_numexpr:D
                  \l_fp_output_integer_int + \l_fp_output_decimal_int
                  = \c_zero
                +
              \tex_else:D
                -
              \tex_fi:D
            \tex_else:D
              +
           \tex_fi:D
            \int_use:N \l_fp_output_integer_int
            .
            \exp_after:wN \use_none:n
              \tex_number:D \etex_numexpr:D
                 \l_fp_output_decimal_int + \c_one_thousand_million
            e
            \int_use:N \l_fp_output_exponent_int
          }
      }
  \fp_tmp:w
}
\cs_new_protected_nopar:Npn \fp_mul_int: {
  \fp_mul_split:NNNN \l_fp_input_a_decimal_int
    \l_fp_mul_a_i_int \l_fp_mul_a_ii_int \l_fp_mul_a_iii_int
  \fp_mul_split:NNNN \l_fp_input_b_decimal_int
    \l_fp_mul_b_i_int \l_fp_mul_b_ii_int \l_fp_mul_b_iii_int
  \l_fp_mul_output_int \c_zero
  \tl_clear:N \l_fp_mul_output_tl
  \fp_mul_product:NN \l_fp_mul_a_i_int         \l_fp_mul_b_iii_int
  \fp_mul_product:NN \l_fp_mul_a_ii_int        \l_fp_mul_b_ii_int
  \fp_mul_product:NN \l_fp_mul_a_iii_int       \l_fp_mul_b_i_int
  \tex_divide:D \l_fp_mul_output_int \c_one_thousand
  \fp_mul_product:NN \l_fp_input_a_integer_int \l_fp_mul_b_iii_int
  \fp_mul_product:NN \l_fp_mul_a_i_int         \l_fp_mul_b_ii_int
  \fp_mul_product:NN \l_fp_mul_a_ii_int        \l_fp_mul_b_i_int
  \fp_mul_product:NN \l_fp_mul_a_iii_int       \l_fp_input_b_integer_int
  \fp_mul_end_level:
  \fp_mul_product:NN \l_fp_input_a_integer_int \l_fp_mul_b_ii_int
  \fp_mul_product:NN \l_fp_mul_a_i_int         \l_fp_mul_b_i_int
  \fp_mul_product:NN \l_fp_mul_a_ii_int        \l_fp_input_b_integer_int
  \fp_mul_end_level:
  \fp_mul_product:NN \l_fp_input_a_integer_int \l_fp_mul_b_i_int
  \fp_mul_product:NN \l_fp_mul_a_i_int         \l_fp_input_b_integer_int
  \fp_mul_end_level:
  \l_fp_output_decimal_int 0 \l_fp_mul_output_tl \scan_stop:
  \tl_clear:N \l_fp_mul_output_tl
  \fp_mul_product:NN \l_fp_input_a_integer_int \l_fp_input_b_integer_int
  \fp_mul_end_level:
  \l_fp_output_integer_int 0 \l_fp_mul_output_tl \scan_stop:
}
\cs_new_protected_nopar:Npn \fp_mul_split:NNNN #1#2#3#4 {
  \tex_advance:D #1 \c_one_thousand_million
  \cs_set_protected_nopar:Npn \fp_mul_split_aux:w
    ##1##2##3##4##5##6##7##8##9 \q_stop {
      #2 ##2##3##4 \scan_stop:
      #3 ##5##6##7 \scan_stop:
      #4 ##8##9    \scan_stop:
    }
  \exp_after:wN \fp_mul_split_aux:w \int_use:N #1 \q_stop
  \tex_advance:D #1 -\c_one_thousand_million
}
\cs_new_protected_nopar:Npn \fp_mul_product:NN #1#2 {
  \l_fp_mul_output_int
    \etex_numexpr:D \l_fp_mul_output_int + #1 * #2 \scan_stop:
}
\cs_new_protected_nopar:Npn \fp_mul_end_level: {
  \tex_advance:D \l_fp_mul_output_int \c_one_thousand_million
  \exp_after:wN \use_i:nn \exp_after:wN
    \fp_mul_end_level:NNNNNNNNN \int_use:N \l_fp_mul_output_int
}
\cs_new_protected_nopar:Npn \fp_mul_end_level:NNNNNNNNN
  #1#2#3#4#5#6#7#8#9 {
  \tl_set:Nx \l_fp_mul_output_tl { #7#8#9 \l_fp_mul_output_tl }
  \l_fp_mul_output_int #1#2#3#4#5#6 \scan_stop:
}
\cs_new_protected_nopar:Npn \fp_div:Nn {
  \fp_div_aux:NNn \tl_set:Nn
}
\cs_new_protected_nopar:Npn \fp_gdiv:Nn {
  \fp_div_aux:NNn \tl_gset:Nn
}
\cs_generate_variant:Nn \fp_div:Nn  { c }
\cs_generate_variant:Nn \fp_gdiv:Nn { c }

\cs_new_protected_nopar:Npn \fp_div_aux:NNn #1#2#3 {
  \group_begin:
    \fp_read:N #2
    \fp_split:Nn b {#3}
    \fp_standardise:NNNN
      \l_fp_input_b_sign_int
      \l_fp_input_b_integer_int
      \l_fp_input_b_decimal_int
      \l_fp_input_b_exponent_int
    \tex_ifnum:D
      \etex_numexpr:D
        \l_fp_input_b_integer_int + \l_fp_input_b_decimal_int
        = \c_zero
      \cs_set_protected_nopar:Npx \fp_tmp:w ##1##2
        {
          \group_end:
          #1 \exp_not:N #2 { \c_undefined_fp }
        }
    \tex_else:D
      \tex_ifnum:D
        \etex_numexpr:D
          \l_fp_input_a_integer_int + \l_fp_input_a_decimal_int
          = \c_zero
        \cs_set_protected_nopar:Npx \fp_tmp:w ##1##2
          {
            \group_end:
            #1 \exp_not:N #2 { \c_zero_fp }
          }
      \tex_else:D
        \exp_after:wN \exp_after:wN \exp_after:wN
          \fp_div_aux:
      \tex_fi:D
    \tex_fi:D
  \fp_tmp:w #1#2
}
\cs_new_protected_nopar:Npn \fp_div_aux: {
  \l_fp_output_integer_int \c_zero
  \l_fp_output_decimal_int \c_zero
  \cs_set_eq:NN \fp_div_store: \fp_div_store_integer:
  \l_fp_div_offset_int \c_one_hundred_million
  \fp_div_loop:
  \l_fp_output_exponent_int
    \etex_numexpr:D
      \l_fp_input_a_exponent_int - \l_fp_input_b_exponent_int
    \scan_stop:
  \fp_standardise:NNNN
    \l_fp_output_sign_int
    \l_fp_output_integer_int
    \l_fp_output_decimal_int
    \l_fp_output_exponent_int
  \cs_set_protected_nopar:Npx \fp_tmp:w ##1##2
    {
      \group_end:
      ##1 ##2
        {
          \tex_ifnum:D
            \etex_numexpr:D
              \l_fp_input_a_sign_int * \l_fp_input_b_sign_int
              < \c_zero
            \tex_ifnum:D
              \etex_numexpr:D
                \l_fp_output_integer_int + \l_fp_output_decimal_int
                = \c_zero
              +
            \tex_else:D
              -
            \tex_fi:D
          \tex_else:D
            +
          \tex_fi:D
          \int_use:N \l_fp_output_integer_int
          .
          \exp_after:wN \use_none:n
            \tex_number:D \etex_numexpr:D
               \l_fp_output_decimal_int + \c_one_thousand_million
             \scan_stop:
          e
          \int_use:N \l_fp_output_exponent_int
        }
    }
}
\cs_new_protected_nopar:Npn \fp_div_loop: {
  \l_fp_count_int \c_zero
  \fp_div_divide:
  \fp_div_store:
  \tex_multiply:D \l_fp_input_a_integer_int \c_ten
  \tex_advance:D \l_fp_input_a_decimal_int \c_one_thousand_million
  \exp_after:wN \fp_div_loop_step:w
    \int_use:N \l_fp_input_a_decimal_int \q_stop
  \tex_ifnum:D
    \etex_numexpr:D
      \l_fp_input_a_integer_int + \l_fp_input_a_decimal_int
      > \c_zero
      \tex_ifnum:D \l_fp_div_offset_int > \c_zero
        \exp_after:wN \exp_after:wN \exp_after:wN
          \fp_div_loop:
      \tex_fi:D
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_div_divide: {
  \tex_ifnum:D \l_fp_input_a_integer_int > \l_fp_input_b_integer_int
    \exp_after:wN \fp_div_divide_aux:
  \tex_else:D
    \tex_ifnum:D \l_fp_input_a_integer_int < \l_fp_input_b_integer_int
    \tex_else:D
      \tex_ifnum:D
        \l_fp_input_a_decimal_int < \l_fp_input_b_decimal_int
      \tex_else:D
        \exp_after:wN \exp_after:wN \exp_after:wN
          \exp_after:wN \exp_after:wN \exp_after:wN
          \exp_after:wN \fp_div_divide_aux:
      \tex_fi:D
    \tex_fi:D
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_div_divide_aux: {
  \tex_advance:D \l_fp_count_int \c_one
  \tex_advance:D \l_fp_input_a_integer_int -\l_fp_input_b_integer_int
  \tex_advance:D \l_fp_input_a_decimal_int -\l_fp_input_b_decimal_int
  \tex_ifnum:D \l_fp_input_a_decimal_int < \c_zero
    \tex_advance:D \l_fp_input_a_integer_int \c_minus_one
    \tex_advance:D \l_fp_input_a_decimal_int \c_one_thousand_million
  \tex_fi:D
  \fp_div_divide:
}
\cs_new_protected_nopar:Npn \fp_div_store: { }
\cs_new_protected_nopar:Npn \fp_div_store_integer: {
  \l_fp_output_integer_int \l_fp_count_int
  \cs_set_eq:NN \fp_div_store: \fp_div_store_decimal:
}
\cs_new_protected_nopar:Npn \fp_div_store_decimal: {
  \l_fp_output_decimal_int
    \etex_numexpr:D
      \l_fp_output_decimal_int +
      \l_fp_count_int * \l_fp_div_offset_int
    \scan_stop:
  \tex_divide:D \l_fp_div_offset_int \c_ten
}
\cs_new_protected_nopar:Npn
  \fp_div_loop_step:w #1#2#3#4#5#6#7#8#9 \q_stop {
  \l_fp_input_a_integer_int
    \etex_numexpr:D
      #2 + \l_fp_input_a_integer_int
    \scan_stop:
  \l_fp_input_a_decimal_int #3#4#5#6#7#8#9 0 \scan_stop:
}
\cs_new_protected_nopar:Npn \fp_add:NNNNNNNNN #1#2#3#4#5#6#7#8#9 {
  #7 \etex_numexpr:D #1 + #4 \scan_stop:
  #8 \etex_numexpr:D #2 + #5 \scan_stop:
  #9 \etex_numexpr:D #3 + #6 \scan_stop:
  \tex_ifnum:D #9 < \c_one_thousand_million
  \tex_else:D
    \tex_advance:D #8 \c_one
    \tex_advance:D #9 -\c_one_thousand_million
  \tex_fi:D
  \tex_ifnum:D #8 < \c_one_thousand_million
  \tex_else:D
    \tex_advance:D #7 \c_one
    \tex_advance:D #8 -\c_one_thousand_million
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_sub:NNNNNNNNN #1#2#3#4#5#6#7#8#9 {
  #7 \etex_numexpr:D #1 - #4 \scan_stop:
  #8 \etex_numexpr:D #2 - #5 \scan_stop:
  #9 \etex_numexpr:D #3 - #6 \scan_stop:
  \tex_ifnum:D #9 < \c_zero
    \tex_advance:D #8 \c_minus_one
    \tex_advance:D #9 \c_one_thousand_million
  \tex_fi:D
  \tex_ifnum:D #8 < \c_zero
    \tex_advance:D #7 \c_minus_one
    \tex_advance:D #8 \c_one_thousand_million
  \tex_fi:D
  \tex_ifnum:D #7 < \c_zero
    \tex_ifnum:D \etex_numexpr:D #8 + #9 = \c_zero
      #7 -#7
    \tex_else:D
      \tex_advance:D #7 \c_one
      #8 \etex_numexpr:D \c_one_thousand_million - #8 \scan_stop:
      #9 \etex_numexpr:D \c_one_thousand_million - #9 \scan_stop:
    \tex_fi:D
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_mul:NNNNNN #1#2#3#4#5#6 {
  \fp_mul_split:NNNN #1
    \l_fp_mul_a_i_int \l_fp_mul_a_ii_int \l_fp_mul_a_iii_int
  \fp_mul_split:NNNN #2
    \l_fp_mul_a_iv_int \l_fp_mul_a_v_int \l_fp_mul_a_vi_int
  \fp_mul_split:NNNN #3
    \l_fp_mul_b_i_int \l_fp_mul_b_ii_int \l_fp_mul_b_iii_int
  \fp_mul_split:NNNN #4
    \l_fp_mul_b_iv_int \l_fp_mul_b_v_int \l_fp_mul_b_vi_int
  \l_fp_mul_output_int \c_zero
  \tl_clear:N \l_fp_mul_output_tl
  \fp_mul_product:NN \l_fp_mul_a_i_int         \l_fp_mul_b_vi_int
  \fp_mul_product:NN \l_fp_mul_a_ii_int        \l_fp_mul_b_v_int
  \fp_mul_product:NN \l_fp_mul_a_iii_int       \l_fp_mul_b_iv_int
  \fp_mul_product:NN \l_fp_mul_a_iv_int        \l_fp_mul_b_iii_int
  \fp_mul_product:NN \l_fp_mul_a_v_int         \l_fp_mul_b_ii_int
  \fp_mul_product:NN \l_fp_mul_a_vi_int        \l_fp_mul_b_i_int
  \tex_divide:D \l_fp_mul_output_int \c_one_thousand
  \fp_mul_product:NN \l_fp_mul_a_i_int        \l_fp_mul_b_v_int
  \fp_mul_product:NN \l_fp_mul_a_ii_int       \l_fp_mul_b_iv_int
  \fp_mul_product:NN \l_fp_mul_a_iii_int      \l_fp_mul_b_iii_int
  \fp_mul_product:NN \l_fp_mul_a_iv_int       \l_fp_mul_b_ii_int
  \fp_mul_end_level:
  \fp_mul_product:NN \l_fp_mul_a_i_int        \l_fp_mul_b_iv_int
  \fp_mul_product:NN \l_fp_mul_a_ii_int       \l_fp_mul_b_iii_int
  \fp_mul_product:NN \l_fp_mul_a_iii_int      \l_fp_mul_b_ii_int
  \fp_mul_product:NN \l_fp_mul_a_iv_int       \l_fp_mul_b_i_int
  \fp_mul_end_level:
  \fp_mul_product:NN \l_fp_mul_a_i_int        \l_fp_mul_b_iii_int
  \fp_mul_product:NN \l_fp_mul_a_ii_int       \l_fp_mul_b_ii_int
  \fp_mul_product:NN \l_fp_mul_a_iii_int      \l_fp_mul_b_i_int
  \fp_mul_end_level:
  #6 0 \l_fp_mul_output_tl \scan_stop:
  \tl_clear:N \l_fp_mul_output_tl
  \fp_mul_product:NN \l_fp_mul_a_i_int        \l_fp_mul_b_ii_int
  \fp_mul_product:NN \l_fp_mul_a_ii_int       \l_fp_mul_b_i_int
  \fp_mul_end_level:
  \fp_mul_product:NN \l_fp_mul_a_i_int        \l_fp_mul_b_i_int
  \fp_mul_end_level:
  \fp_mul_end_level:
  #5 0 \l_fp_mul_output_tl \scan_stop:
}
\cs_new_protected_nopar:Npn \fp_div_integer:NNNNN #1#2#3#4#5 {
  \l_fp_tmp_int #1
  \tex_divide:D \l_fp_tmp_int #3
  \l_fp_tmp_int \etex_numexpr:D #1 - \l_fp_tmp_int * #3 \scan_stop:
  #4 #1
  \tex_divide:D #4 #3
  #5 #2
  \tex_divide:D #5 #3
  \tex_multiply:D \l_fp_tmp_int \c_one_thousand
  \tex_divide:D \l_fp_tmp_int #3
  #5 \etex_numexpr:D #5 + \l_fp_tmp_int * \c_one_million \scan_stop:
  \tex_ifnum:D #5 > \c_one_thousand_million
    \tex_advance:D #4 \c_one
    \tex_advancd:D #5 -\c_one_thousand_million
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_trig_normalise: {
  \tex_ifnum:D \l_fp_input_a_exponent_int < \c_ten
    \l_fp_input_a_extended_int \c_zero
    \fp_trig_normalise_aux_i:
    \fp_trig_normalise_aux_ii:
    \fp_trig_normalise_aux_iii:
    \tex_ifnum:D \l_fp_input_a_integer_int < \c_zero
      \l_fp_input_a_sign_int -\l_fp_input_a_sign_int
      \l_fp_input_a_integer_int -\l_fp_input_a_integer_int
    \tex_fi:D
     \exp_after:wN \fp_trig_octant:
  \tex_else:D
    \l_fp_input_a_sign_int    \c_one
    \l_fp_output_integer_int  \c_zero
    \l_fp_output_decimal_int  \c_zero
    \l_fp_output_exponent_int \c_zero
    \exp_after:wN \fp_trig_overflow_msg:
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_trig_normalise_aux_i: {
  \tex_ifnum:D \l_fp_input_a_exponent_int > \c_zero
    \tex_multiply:D \l_fp_input_a_integer_int \c_ten
    \tex_advance:D \l_fp_input_a_decimal_int \c_one_thousand_million
    \exp_after:wN \fp_trig_normalise_aux:w
      \int_use:N \l_fp_input_a_decimal_int \q_stop
     \exp_after:wN \fp_trig_normalise_aux_i:
   \tex_fi:D
}
\cs_new_protected_nopar:Npn
  \fp_trig_normalise_aux:w #1#2#3#4#5#6#7#8#9 \q_stop {
  \l_fp_input_a_integer_int
    \etex_numexpr:D \l_fp_input_a_integer_int + #2 \scan_stop:
  \l_fp_input_a_decimal_int #3#4#5#6#7#8#9 0 \scan_stop:
  \tex_advance:D \l_fp_input_a_exponent_int \c_minus_one
}
\cs_new_protected_nopar:Npn \fp_trig_normalise_aux_ii: {
  \tex_ifnum:D \l_fp_input_a_exponent_int < \c_zero
    \tex_advance:D \l_fp_input_a_decimal_int \c_one_thousand_million
    \exp_after:wN \use_i:nn \exp_after:wN
      \fp_trig_normalise_aux:NNNNNNNNN
      \int_use:N \l_fp_input_a_decimal_int
     \exp_after:wN \fp_trig_normalise_aux_ii:
   \tex_fi:D
}
\cs_new_protected_nopar:Npn
  \fp_trig_normalise_aux:NNNNNNNNN #1#2#3#4#5#6#7#8#9 {
  \tex_ifnum:D \l_fp_input_a_integer_int = \c_zero
    \l_fp_input_a_decimal_int #1#2#3#4#5#6#7#8 \scan_stop:
  \tex_else:D
    \tl_set:Nx \l_fp_tmp_tl
      {
        \int_use:N \l_fp_input_a_integer_int
        #1#2#3#4#5#6#7#8
      }
    \l_fp_input_a_integer_int \c_zero
    \l_fp_input_a_decimal_int \l_fp_tmp_tl \scan_stop:
  \tex_fi:D
  \tex_divide:D \l_fp_input_a_extended_int \c_ten
  \tl_set:Nx \l_fp_tmp_tl
    {
      #9
      \int_use:N \l_fp_input_a_extended_int
    }
  \l_fp_input_a_extended_int \l_fp_tmp_tl \scan_stop:
  \tex_advance:D \l_fp_input_a_exponent_int \c_one
}
\cs_new_protected_nopar:Npn \fp_trig_normalise_aux_iii: {
  \tex_ifnum:D \l_fp_input_a_integer_int > \c_three
    \fp_sub:NNNNNNNNN
      \l_fp_input_a_integer_int \l_fp_input_a_decimal_int
        \l_fp_input_a_extended_int
      \c_six \c_fp_two_pi_decimal_int \c_fp_two_pi_extended_int
      \l_fp_input_a_integer_int \l_fp_input_a_decimal_int
        \l_fp_input_a_extended_int
    \exp_after:wN \fp_trig_normalise_aux_iii:
  \tex_else:D
    \tex_ifnum:D \l_fp_input_a_integer_int > \c_two
      \tex_ifnum:D \l_fp_input_a_decimal_int > \c_fp_pi_decimal_int
        \fp_sub:NNNNNNNNN
          \l_fp_input_a_integer_int \l_fp_input_a_decimal_int
            \l_fp_input_a_extended_int
          \c_six \c_fp_two_pi_decimal_int \c_fp_two_pi_extended_int
          \l_fp_input_a_integer_int \l_fp_input_a_decimal_int
            \l_fp_input_a_extended_int
        \exp_after:wN \exp_after:wN \exp_after:wN
        \exp_after:wN \exp_after:wN \exp_after:wN
          \exp_after:wN \fp_trig_normalise_aux_iii:
        \tex_fi:D
    \tex_fi:D
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_trig_octant: {
  \l_fp_trig_octant_int \c_one
  \fp_trig_octant_aux:
  \tex_ifnum:D \l_fp_input_a_decimal_int < \c_ten
    \l_fp_input_a_decimal_int  \c_zero
    \l_fp_input_a_extended_int \c_zero
  \tex_fi:D
  \tex_ifodd:D \l_fp_trig_octant_int
  \tex_else:D
    \fp_sub:NNNNNNNNN
      \c_zero \c_fp_pi_by_four_decimal_int \c_fp_pi_by_four_extended_int
      \l_fp_input_a_integer_int \l_fp_input_a_decimal_int
        \l_fp_input_a_extended_int
      \l_fp_input_a_integer_int \l_fp_input_a_decimal_int
        \l_fp_input_a_extended_int
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_trig_octant_aux: {
  \tex_ifnum:D \l_fp_input_a_integer_int > \c_zero
    \fp_sub:NNNNNNNNN
      \l_fp_input_a_integer_int \l_fp_input_a_decimal_int
        \l_fp_input_a_extended_int
      \c_zero \c_fp_pi_by_four_decimal_int \c_fp_pi_by_four_extended_int
      \l_fp_input_a_integer_int \l_fp_input_a_decimal_int
        \l_fp_input_a_extended_int
    \tex_advance:D \l_fp_trig_octant_int \c_one
    \exp_after:wN \fp_trig_octant_aux:
  \tex_else:D
    \tex_ifnum:D
      \l_fp_input_a_decimal_int > \c_fp_pi_by_four_decimal_int
      \fp_sub:NNNNNNNNN
        \l_fp_input_a_integer_int \l_fp_input_a_decimal_int
          \l_fp_input_a_extended_int
        \c_zero \c_fp_pi_by_four_decimal_int
          \c_fp_pi_by_four_extended_int
        \l_fp_input_a_integer_int \l_fp_input_a_decimal_int
          \l_fp_input_a_extended_int
      \tex_advance:D \l_fp_trig_octant_int \c_one
      \exp_after:wN \exp_after:wN \exp_after:wN
        \fp_trig_octant_aux:
    \tex_fi:D
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_sin:Nn {
  \fp_sin_aux:NNn \tl_set:Nn
}
\cs_new_protected_nopar:Npn \fp_gsin:Nn {
  \fp_sin_aux:NNn \tl_gset:Nn
}
\cs_generate_variant:Nn \fp_sin:Nn   { c }
\cs_generate_variant:Nn \fp_gsin:Nn  { c }
\cs_new_protected_nopar:Npn \fp_sin_aux:NNn #1#2#3 {
  \group_begin:
    \fp_split:Nn a {#3}
    \fp_standardise:NNNN
      \l_fp_input_a_sign_int
      \l_fp_input_a_integer_int
      \l_fp_input_a_decimal_int
      \l_fp_input_a_exponent_int
    \tl_set:Nx \l_fp_trig_arg_tl
      {
        \tex_ifnum:D \l_fp_input_a_sign_int < \c_zero
          -
        \tex_else:D
          +
        \tex_fi:D
        \int_use:N \l_fp_input_a_integer_int
        .
        \exp_after:wN \use_none:n
          \tex_number:D \etex_numexpr:D
            \l_fp_input_a_decimal_int + \c_one_thousand_million
        e
        \int_use:N \l_fp_input_a_exponent_int
      }
    \tex_ifnum:D \l_fp_input_a_exponent_int < -\c_five
      \cs_set_protected_nopar:Npx \fp_tmp:w
      {
        \group_end:
        #1 \exp_not:N #2 { \l_fp_trig_arg_tl }
      }
    \tex_else:D
      \etex_ifcsname:D
        c_fp_sin ( \l_fp_trig_arg_tl ) _tl
      \tex_endcsname:D
      \tex_else:D
        \exp_after:wN \exp_after:wN \exp_after:wN
          \fp_sin_aux_i:
      \tex_fi:D
      \cs_set_protected_nopar:Npx \fp_tmp:w
        {
          \group_end:
          #1 \exp_not:N #2
            { \use:c { c_fp_sin ( \l_fp_trig_arg_tl ) _tl } }
        }
    \tex_fi:D
  \fp_tmp:w
}
\cs_new_protected_nopar:Npn \fp_sin_aux_i: {
  \fp_trig_normalise:
  \fp_sin_aux_ii:
  \tex_ifnum:D \l_fp_output_integer_int = \c_one
    \l_fp_output_exponent_int \c_zero
  \tex_else:D
    \l_fp_output_integer_int \l_fp_output_decimal_int
    \l_fp_output_decimal_int \l_fp_output_extended_int
    \l_fp_output_exponent_int -\c_nine
  \tex_fi:D
  \fp_standardise:NNNN
    \l_fp_input_a_sign_int
    \l_fp_output_integer_int
    \l_fp_output_decimal_int
    \l_fp_output_exponent_int
  \tl_new:c { c_fp_sin ( \l_fp_trig_arg_tl ) _tl }
  \tl_set:cx { c_fp_sin ( \l_fp_trig_arg_tl ) _tl }
    {
      \tex_ifnum:D \l_fp_input_a_sign_int > \c_zero
        +
      \tex_else:D
        -
      \tex_fi:D
      \int_use:N \l_fp_output_integer_int
      .
      \exp_after:wN \use_none:n
        \tex_number:D \etex_numexpr:D
           \l_fp_output_decimal_int + \c_one_thousand_million
         \scan_stop:
      e
      \int_use:N \l_fp_output_exponent_int
    }
}
\cs_new_protected_nopar:Npn \fp_sin_aux_ii: {
  \tex_ifcase:D \l_fp_trig_octant_int
  \tex_or:D
    \exp_after:wN \fp_trig_calc_sin:
  \tex_or:D
    \exp_after:wN \fp_trig_calc_cos:
  \tex_or:D
    \exp_after:wN \fp_trig_calc_cos:
  \tex_or:D
    \exp_after:wN \fp_trig_calc_sin:
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_cos:Nn {
  \fp_cos_aux:NNn \tl_set:Nn
}
\cs_new_protected_nopar:Npn \fp_gcos:Nn {
  \fp_cos_aux:NNn \tl_gset:Nn
}
\cs_generate_variant:Nn \fp_cos:Nn   { c }
\cs_generate_variant:Nn \fp_gcos:Nn  { c }
\cs_new_protected_nopar:Npn \fp_cos_aux:NNn #1#2#3 {
  \group_begin:
    \fp_split:Nn a {#3}
    \fp_standardise:NNNN
      \l_fp_input_a_sign_int
      \l_fp_input_a_integer_int
      \l_fp_input_a_decimal_int
      \l_fp_input_a_exponent_int
    \tl_set:Nx \l_fp_trig_arg_tl
      {
        \tex_ifnum:D \l_fp_input_a_sign_int < \c_zero
          -
        \tex_else:D
          +
        \tex_fi:D
        \int_use:N \l_fp_input_a_integer_int
        .
      \exp_after:wN \use_none:n
        \tex_number:D \etex_numexpr:D
           \l_fp_input_a_decimal_int + \c_one_thousand_million
        e
        \int_use:N \l_fp_input_a_exponent_int
      }
    \etex_ifcsname:D c_fp_cos ( \l_fp_trig_arg_tl ) _tl \tex_endcsname:D
    \tex_else:D
      \exp_after:wN \fp_cos_aux_i:
    \tex_fi:D
    \cs_set_protected_nopar:Npx \fp_tmp:w
      {
        \group_end:
        #1 \exp_not:N #2
          { \use:c { c_fp_cos ( \l_fp_trig_arg_tl ) _tl } }
      }
  \fp_tmp:w
}
\cs_new_protected_nopar:Npn \fp_cos_aux_i: {
  \fp_trig_normalise:
  \fp_cos_aux_ii:
  \tex_ifnum:D \l_fp_output_integer_int = \c_one
    \l_fp_output_exponent_int \c_zero
  \tex_else:D
    \l_fp_output_integer_int \l_fp_output_decimal_int
    \l_fp_output_decimal_int \l_fp_output_extended_int
    \l_fp_output_exponent_int -\c_nine
  \tex_fi:D
  \fp_standardise:NNNN
    \l_fp_input_a_sign_int
    \l_fp_output_integer_int
    \l_fp_output_decimal_int
    \l_fp_output_exponent_int
  \tl_new:c { c_fp_cos ( \l_fp_trig_arg_tl ) _tl }
  \tl_set:cx { c_fp_cos ( \l_fp_trig_arg_tl ) _tl }
    {
      \tex_ifnum:D \l_fp_input_a_sign_int > \c_zero
        +
      \tex_else:D
        -
      \tex_fi:D
      \int_use:N \l_fp_output_integer_int
      .
      \exp_after:wN \use_none:n
        \tex_number:D \etex_numexpr:D
           \l_fp_output_decimal_int + \c_one_thousand_million
         \scan_stop:
      e
      \int_use:N \l_fp_output_exponent_int
    }
}
\cs_new_protected_nopar:Npn \fp_cos_aux_ii: {
  \tex_ifcase:D \l_fp_trig_octant_int
  \tex_or:D
    \exp_after:wN \fp_trig_calc_cos:
  \tex_or:D
    \exp_after:wN \fp_trig_calc_sin:
  \tex_or:D
    \exp_after:wN \fp_trig_calc_sin:
  \tex_or:D
    \exp_after:wN \fp_trig_calc_cos:
  \tex_fi:D
  \tex_ifnum:D \l_fp_input_a_sign_int > \c_zero
    \tex_ifnum:D \l_fp_trig_octant_int > \c_two
      \l_fp_input_a_sign_int \c_minus_one
    \tex_fi:D
  \tex_else:D
    \tex_ifnum:D \l_fp_trig_octant_int > \c_two
    \tex_else:D
      \l_fp_input_a_sign_int \c_one
    \tex_fi:D
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_trig_calc_cos: {
  \tex_ifnum:D \l_fp_input_a_decimal_int = \c_zero
    \l_fp_output_integer_int \c_one
    \l_fp_output_decimal_int \c_zero
  \tex_else:D
    \l_fp_trig_sign_int \c_minus_one
    \fp_mul:NNNNNN
      \l_fp_input_a_decimal_int \l_fp_input_a_extended_int
      \l_fp_input_a_decimal_int \l_fp_input_a_extended_int
      \l_fp_trig_decimal_int \l_fp_trig_extended_int
    \fp_div_integer:NNNNN
      \l_fp_trig_decimal_int \l_fp_trig_extended_int
      \c_two
      \l_fp_trig_decimal_int \l_fp_trig_extended_int
    \l_fp_count_int \c_three
    \tex_ifnum:D \l_fp_trig_extended_int = \c_zero
      \tex_ifnum:D \l_fp_trig_decimal_int = \c_zero
        \l_fp_output_integer_int \c_one
        \l_fp_output_decimal_int \c_zero
        \l_fp_output_extended_int \c_zero
      \tex_else:D
        \l_fp_output_integer_int \c_zero
        \l_fp_output_decimal_int \c_one_thousand_million
        \l_fp_output_extended_int \c_zero
      \tex_fi:D
    \tex_else:D
      \l_fp_output_integer_int \c_zero
      \l_fp_output_decimal_int 999999999 \scan_stop:
      \l_fp_output_extended_int \c_one_thousand_million
    \tex_fi:D
    \tex_advance:D \l_fp_output_extended_int -\l_fp_trig_extended_int
    \tex_advance:D \l_fp_output_decimal_int -\l_fp_trig_decimal_int
    \exp_after:wN \fp_trig_calc_aux:
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_trig_calc_sin: {
  \l_fp_output_integer_int \c_zero
  \tex_ifnum:D \l_fp_input_a_decimal_int = \c_zero
    \l_fp_output_decimal_int \c_zero
  \tex_else:D
    \l_fp_output_decimal_int \l_fp_input_a_decimal_int
    \l_fp_output_extended_int \l_fp_input_a_extended_int
    \l_fp_trig_sign_int \c_one
    \l_fp_trig_decimal_int \l_fp_input_a_decimal_int
    \l_fp_trig_extended_int \l_fp_input_a_extended_int
    \l_fp_count_int \c_two
    \exp_after:wN \fp_trig_calc_aux:
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_trig_calc_aux: {
  \l_fp_trig_sign_int -\l_fp_trig_sign_int
  \fp_mul:NNNNNN
    \l_fp_trig_decimal_int \l_fp_trig_extended_int
    \l_fp_input_a_decimal_int \l_fp_input_a_extended_int
    \l_fp_trig_decimal_int \l_fp_trig_extended_int
  \fp_mul:NNNNNN
    \l_fp_trig_decimal_int \l_fp_trig_extended_int
    \l_fp_input_a_decimal_int \l_fp_input_a_extended_int
    \l_fp_trig_decimal_int \l_fp_trig_extended_int
  \fp_div_integer:NNNNN
    \l_fp_trig_decimal_int \l_fp_trig_extended_int
    \l_fp_count_int
    \l_fp_trig_decimal_int \l_fp_trig_extended_int
  \tex_advance:D \l_fp_count_int \c_one
  \fp_div_integer:NNNNN
    \l_fp_trig_decimal_int \l_fp_trig_extended_int
    \l_fp_count_int
    \l_fp_trig_decimal_int \l_fp_trig_extended_int
  \tex_advance:D \l_fp_count_int \c_one
  \tex_ifnum:D \l_fp_trig_decimal_int > \c_zero
    \tex_ifnum:D \l_fp_trig_sign_int > \c_zero
      \tex_advance:D \l_fp_output_decimal_int \l_fp_trig_decimal_int
      \tex_advance:D \l_fp_output_extended_int
        \l_fp_trig_extended_int
      \tex_ifnum:D \l_fp_output_extended_int < \c_one_thousand_million
      \tex_else:D
        \tex_advance:D \l_fp_output_decimal_int \c_one
        \tex_advance:D \l_fp_output_extended_int
          -\c_one_thousand_million
      \tex_fi:D
      \tex_ifnum:D \l_fp_output_decimal_int < \c_one_thousand_million
      \tex_else:D
        \tex_advance:D \l_fp_output_integer_int \c_one
        \tex_advance:D \l_fp_output_decimal_int
          -\c_one_thousand_million
      \tex_fi:D
    \tex_else:D
      \tex_advance:D \l_fp_output_decimal_int -\l_fp_trig_decimal_int
      \tex_advance:D \l_fp_output_extended_int
        -\l_fp_input_a_extended_int
      \tex_ifnum:D \l_fp_output_extended_int < \c_zero
        \tex_advance:D \l_fp_output_decimal_int \c_minus_one
        \tex_advance:D \l_fp_output_extended_int \c_one_thousand_million
      \tex_fi:D
      \tex_ifnum:D \l_fp_output_decimal_int < \c_zero
        \tex_advance:D \l_fp_output_integer_int \c_minus_one
        \tex_advance:D \l_fp_output_decimal_int \c_one_thousand_million
      \tex_fi:D
    \tex_fi:D
    \exp_after:wN \fp_trig_calc_aux:
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_tan:Nn {
  \fp_tan_aux:NNn \tl_set:Nn
}
\cs_new_protected_nopar:Npn \fp_gtan:Nn {
  \fp_tan_aux:NNn \tl_gset:Nn
}
\cs_generate_variant:Nn \fp_tan:Nn   { c }
\cs_generate_variant:Nn \fp_gtan:Nn  { c }
\cs_new_protected_nopar:Npn \fp_tan_aux:NNn #1#2#3 {
  \group_begin:
    \fp_split:Nn a {#3}
    \fp_standardise:NNNN
      \l_fp_input_a_sign_int
      \l_fp_input_a_integer_int
      \l_fp_input_a_decimal_int
      \l_fp_input_a_exponent_int
    \tl_set:Nx \l_fp_trig_arg_tl
      {
        \tex_ifnum:D \l_fp_input_a_sign_int < \c_zero
          -
        \tex_else:D
          +
        \tex_fi:D
        \int_use:N \l_fp_input_a_integer_int
        .
        \exp_after:wN \use_none:n
          \tex_number:D \etex_numexpr:D
            \l_fp_input_a_decimal_int + \c_one_thousand_million
        e
        \int_use:N \l_fp_input_a_exponent_int
      }
    \tex_ifnum:D \l_fp_input_a_exponent_int < -\c_five
      \cs_set_protected_nopar:Npx \fp_tmp:w
      {
        \group_end:
        #1 \exp_not:N #2 { \l_fp_trig_arg_tl }
      }
    \tex_else:D
      \etex_ifcsname:D
        c_fp_tan ( \l_fp_trig_arg_tl ) _tl
      \tex_endcsname:D
      \tex_else:D
        \exp_after:wN \exp_after:wN \exp_after:wN
          \fp_tan_aux_i:
      \tex_fi:D
      \cs_set_protected_nopar:Npx \fp_tmp:w
        {
          \group_end:
          #1 \exp_not:N #2
            { \use:c { c_fp_tan ( \l_fp_trig_arg_tl ) _tl } }
        }
    \tex_fi:D
  \fp_tmp:w
}
\cs_new_protected_nopar:Npn \fp_tan_aux_i: {
  \tex_ifnum:D \l_fp_input_a_exponent_int < \c_ten
    \exp_after:wN \fp_tan_aux_ii:
  \tex_else:D
    \cs_new_eq:cN { c_fp_tan ( \l_fp_trig_arg_tl ) _tl }
      \c_zero_fp
    \exp_after:wN \fp_trig_overflow_msg:
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_tan_aux_ii: {
  \fp_trig_normalise:
  \fp_cos_aux_ii:
  \tex_ifnum:D \l_fp_input_a_decimal_int = \c_zero
    \tex_ifnum:D \l_fp_input_a_integer_int = \c_zero
      \cs_new_eq:cN { c_fp_tan ( \l_fp_trig_arg_tl ) _tl }
        \c_undefined_fp
    \tex_else:D
      \exp_after:wN \exp_after:wN \exp_after:wN
        \fp_tan_aux_iii:
    \tex_fi:D
  \tex_else:D
    \exp_after:wN \fp_tan_aux_iii:
  \tex_fi:D
}
\cs_new_protected_nopar:Npn \fp_tan_aux_iii: {
  \l_fp_input_b_integer_int \l_fp_output_decimal_int
  \l_fp_input_b_decimal_int \l_fp_output_extended_int
  \l_fp_input_b_exponent_int -\c_nine
  \fp_standardise:NNNN
    \l_fp_input_b_sign_int
    \l_fp_input_b_integer_int
    \l_fp_input_b_decimal_int
    \l_fp_input_b_exponent_int
  \fp_sin_aux_ii:
  \l_fp_input_a_integer_int \l_fp_output_decimal_int
  \l_fp_input_a_decimal_int \l_fp_output_extended_int
  \l_fp_input_a_exponent_int -\c_nine
  \fp_standardise:NNNN
    \l_fp_input_a_sign_int
    \l_fp_input_a_integer_int
    \l_fp_input_a_decimal_int
    \l_fp_input_a_exponent_int
  \tex_ifnum:D \l_fp_input_a_decimal_int = \c_zero
    \tex_ifnum:D \l_fp_input_a_integer_int = \c_zero
      \cs_new_eq:cN { c_fp_tan ( \l_fp_trig_arg_tl ) _tl }
        \c_zero_fp
    \tex_else:D
      \exp_after:wN \exp_after:wN \exp_after:wN
        \fp_tan_aux_iv:
    \tex_fi:D
  \tex_else:D
    \exp_after:wN \fp_tan_aux_iv:
  \tex_fi:D
}
 \cs_new_protected_nopar:Npn \fp_tan_aux_iv: {
  \l_fp_output_integer_int \c_zero
  \l_fp_output_decimal_int \c_zero
  \cs_set_eq:NN \fp_div_store: \fp_div_store_integer:
  \l_fp_div_offset_int \c_one_hundred_million
  \fp_div_loop:
  \l_fp_output_exponent_int
    \etex_numexpr:D
      \l_fp_input_a_exponent_int - \l_fp_input_b_exponent_int
    \scan_stop:
  \tex_ifnum:D \l_fp_trig_octant_int < \c_three
    \l_fp_output_sign_int \c_one
  \tex_else:D
    \l_fp_output_sign_int \c_minus_one
  \tex_fi:D
  \fp_standardise:NNNN
    \l_fp_output_sign_int
    \l_fp_output_integer_int
    \l_fp_output_decimal_int
    \l_fp_output_exponent_int
  \tl_new:c { c_fp_tan ( \l_fp_trig_arg_tl ) _tl }
  \tl_set:cx { c_fp_tan ( \l_fp_trig_arg_tl ) _tl }
    {
      \tex_ifnum:D \l_fp_output_sign_int > \c_zero
        +
      \tex_else:D
        -
      \tex_fi:D
      \int_use:N \l_fp_output_integer_int
      .
      \exp_after:wN \use_none:n
        \tex_number:D \etex_numexpr:D
           \l_fp_output_decimal_int + \c_one_thousand_million
         \scan_stop:
      e
      \int_use:N \l_fp_output_exponent_int
    }
}
\prg_new_conditional:Npnn \fp_if_infinity:N #1 { p , T , F , TF } {
  \tex_ifx:D #1 \c_infinity_fp
    \prg_return_true:
  \tex_else:D
    \prg_return_false:
  \tex_fi:D
}
\prg_new_conditional:Npnn \fp_if_undefined:N #1 { p , T , F , TF } {
  \tex_ifx:D #1 \c_undefined_fp
    \prg_return_true:
  \tex_else:D
    \prg_return_false:
  \tex_fi:D
}
\prg_new_conditional:Npnn \fp_if_zero:N #1 { p , T , F , TF } {
  \tex_ifx:D #1 \c_zero_fp
    \prg_return_true:
  \tex_else:D
    \prg_return_false:
  \tex_fi:D
}
\prg_new_protected_conditional:Npnn \fp_compare:nNn #1#2#3 { T , F , TF }
  {
  \group_begin:
    \fp_split:Nn a {#1}
    \fp_standardise:NNNN
      \l_fp_input_a_sign_int
      \l_fp_input_a_integer_int
      \l_fp_input_a_decimal_int
      \l_fp_input_a_exponent_int
    \fp_split:Nn b {#3}
    \fp_standardise:NNNN
      \l_fp_input_b_sign_int
      \l_fp_input_b_integer_int
      \l_fp_input_b_decimal_int
      \l_fp_input_b_exponent_int
    \fp_compare_aux:N #2
}
\prg_new_protected_conditional:Npnn \fp_compare:NNN #1#2#3 { T , F , TF }
  {
  \group_begin:
    \fp_read:N #3
    \l_fp_input_b_sign_int     \l_fp_input_a_sign_int
    \l_fp_input_b_integer_int  \l_fp_input_a_integer_int
    \l_fp_input_b_decimal_int  \l_fp_input_a_decimal_int
    \l_fp_input_b_exponent_int \l_fp_input_a_exponent_int
    \fp_read:N #1
    \fp_compare_aux:N #2
}
\cs_new_protected_nopar:Npn \fp_compare_aux:N #1 {
  \cs_if_exist:cTF { fp_compare_#1: }
    { \use:c { fp_compare_#1: } }
    {
      \group_end:
      \prg_return_false:
    }
}
\cs_new_protected_nopar:cpn { fp_compare_=: } {
  \tex_ifnum:D \l_fp_input_a_sign_int = \l_fp_input_b_sign_int
    \tex_ifnum:D \l_fp_input_a_integer_int = \l_fp_input_b_integer_int
      \tex_ifnum:D \l_fp_input_a_decimal_int = \l_fp_input_b_decimal_int
        \tex_ifnum:D
          \l_fp_input_a_exponent_int = \l_fp_input_b_exponent_int
          \group_end:
          \prg_return_true:
        \tex_else:D
          \group_end:
          \prg_return_false:
        \tex_fi:D
      \tex_else:D
        \group_end:
        \prg_return_false:
      \tex_fi:D
    \tex_else:D
      \group_end:
      \prg_return_false:
    \tex_fi:D
  \tex_else:D
    \group_end:
    \prg_return_false:
  \tex_fi:D
}
\cs_new_protected_nopar:cpn { fp_compare_>: } {
  \tex_ifnum:D \l_fp_input_a_sign_int > \l_fp_input_b_sign_int
    \group_end:
    \prg_return_true:
  \tex_else:D
    \tex_ifnum:D \l_fp_input_a_sign_int < \l_fp_input_b_sign_int
      \group_end:
      \prg_return_false:
    \tex_else:D
      \tex_ifnum:D \l_fp_input_a_sign_int > \c_zero
        \use:c { fp_compare_absolute_a > b: }
      \tex_else:D
        \use:c { fp_compare_absolute_a < b: }
      \tex_fi:D
    \tex_fi:D
  \tex_fi:D
}
\cs_new_protected_nopar:cpn { fp_compare_<: } {
  \tex_ifnum:D \l_fp_input_b_sign_int > \l_fp_input_a_sign_int
    \group_end:
    \prg_return_true:
  \tex_else:D
    \tex_ifnum:D \l_fp_input_b_sign_int < \l_fp_input_a_sign_int
      \group_end:
      \prg_return_false:
    \tex_else:D
      \tex_ifnum:D \l_fp_input_b_sign_int > \c_zero
        \use:c { fp_compare_absolute_a < b: }
      \tex_else:D
        \use:c { fp_compare_absolute_a > b: }
      \tex_fi:D
    \tex_fi:D
  \tex_fi:D
}
\cs_new_protected_nopar:cpn { fp_compare_absolute_a > b: } {
  \tex_ifnum:D \l_fp_input_a_exponent_int > \l_fp_input_b_exponent_int
    \group_end:
    \prg_return_true:
  \tex_else:D
    \tex_ifnum:D \l_fp_input_a_exponent_int < \l_fp_input_b_exponent_int
      \tex_ifnum:D
        \etex_numexpr:D
          \l_fp_input_b_integer_int + \l_fp_input_b_decimal_int
        = \c_zero
        \group_end:
        \prg_return_true:
      \tex_else:D
        \group_end:
        \prg_return_false:
      \tex_fi:D
    \tex_else:D
      \tex_ifnum:D \l_fp_input_a_integer_int > \l_fp_input_b_integer_int
        \group_end:
        \prg_return_true:
      \tex_else:D
        \tex_ifnum:D
          \l_fp_input_a_integer_int < \l_fp_input_b_integer_int
          \group_end:
          \prg_return_false:
        \tex_else:D
          \tex_ifnum:D
            \l_fp_input_a_decimal_int > \l_fp_input_b_decimal_int
            \group_end:
            \prg_return_true:
          \tex_else:D
            \group_end:
            \prg_return_false:
          \tex_fi:D
        \tex_fi:D
      \tex_fi:D
    \tex_fi:D
  \tex_fi:D
}
\cs_new_protected_nopar:cpn { fp_compare_absolute_a < b: } {
  \tex_ifnum:D \l_fp_input_b_exponent_int > \l_fp_input_a_exponent_int
    \tex_ifnum:D
      \etex_numexpr:D
        \l_fp_input_b_integer_int + \l_fp_input_b_decimal_int
      = \c_zero
      \group_end:
      \prg_return_false:
    \tex_else:D
      \group_end:
      \prg_return_true:
    \tex_fi:D
  \tex_else:D
    \tex_ifnum:D \l_fp_input_b_exponent_int < \l_fp_input_a_exponent_int
      \group_end:
      \prg_return_false:
    \tex_else:D
      \tex_ifnum:D \l_fp_input_b_integer_int > \l_fp_input_a_integer_int
        \group_end:
        \prg_return_true:
      \tex_else:D
        \tex_ifnum:D
          \l_fp_input_b_integer_int < \l_fp_input_a_integer_int
          \group_end:
          \prg_return_false:
        \tex_else:D
          \tex_ifnum:D
            \l_fp_input_b_decimal_int > \l_fp_input_a_decimal_int
            \group_end:
            \prg_return_true:
          \tex_else:D
            \group_end:
            \prg_return_false:
          \tex_fi:D
        \tex_fi:D
      \tex_fi:D
    \tex_fi:D
  \tex_fi:D
}

\msg_kernel_new:nnnn { fpu } { overflow }
  { Number~too~big. }
  {
    The~input~given~is~too~big~for~the~LaTeX~floating~point~unit. \\
    Further~errors~may~well~occur!
  }
\cs_new_protected_nopar:Npn \fp_overflow_msg: {
  \msg_kernel_error:nn { fpu } { overflow }
}
\msg_kernel_new:nnnn { fpu } { trigonometric-overflow }
  { Number~too~big~for~trigonometry~unit. }
  {
    The~trigonometry~code~can~only~work~with~numbers~smaller~
    than~1000000000.
  }
\cs_new_protected_nopar:Npn \fp_trig_overflow_msg: {
  \msg_kernel_error:nn { fpu } { trigonometric-overflow }
}
%% 
%%
%% End of file `l3fp.sty'.
