# ArbNumerics.jl | questions regarding use

Hello,

WSL 2 | Ubuntu 22.04.4
Julia 1.10.2
ArbNumerics 1.5.0

My first go at using extended precision in Julia. Ball arithmetic as implemented in the package ArbNumerics.jl is the method that I would like to use.

To try and learn how to use ArbNumerics, I wrote a short program
that first computes a symbolics Taylor-Maclaurin series expansion pf exp(x^2) followed by numeric substitution: first in standard Float64, then using ArbNumerics.

However, I am clearly missing something in my understanding of ArbNumerics implementation as the two results are the same - no improvement in precision.

The code:

``````# test_ArbNumerics.jl

using ArbNumerics
using Printf
using Symbolics

# Taylor-Maclaurin series: standard Float64
function Taylor_Maclaurin_series(
f::Num,
Dx::Differential,
x::Num,
n::Int64)::Num

f_series = 1

f_term = [f, Num(0)]

for i in range(1, n)
f_term[2] = expand_derivatives(Dx(f_term[1]))

f_series +=
Symbolics.value(substitute(f_term[2], Dict(x => 0))) / (factorial(BigInt(i))) * x^i

f_term[1] = f_term[2]
end

return f_series
end

# Taylor-Maclaurin series: ArbNumerics
function Taylor_Maclaurin_series_ArbNumerics(
f::Num,
Dx::Differential,
x::Num,
n::Int64)::Num

f_series = ArbReal("1")

f_term = [f, Num(0)]

for i in range(1, n)
f_term[2] = expand_derivatives(Dx(f_term[1]))

f_series +=
Symbolics.value(substitute(f_term[2], Dict(x => ArbReal("0")))) / ArbReal(factorial(BigInt(i))) * x^i

f_term[1] = f_term[2]
end

return f_series
end

function main()
@variables x

# Test function
f = exp(x^2)

# Derivative
Dx = Differential(x)

# Taylor Maclaurin series expansion of test function
# Expansion order: n
n = 30

#
# Standard Float64
#
xt = 1.1

f_TMs = Taylor_Maclaurin_series(
f,
Dx,
x,
n)

println("f_TMs: ", f_TMs, "\n")

f_TMs_nm = Symbolics.value(substitute(f_TMs, Dict(x => 1.0)))

@printf "f_TMs_nm: %.16g \n"  f_TMs_nm
@printf "exp(1.0)  %.16g \n" exp(1.0)
println("e:        2.7182818284590452353602874713527 \n")

f_TMs_nm = Symbolics.value(substitute(f_TMs, Dict(x => xt)))

@printf "f_TMs_nm: %.16g \n"  f_TMs_nm
@printf "exp(%g) %.16g \n\n" xt^2 exp(xt^2)

#
# ArbNumerics test version
#
setworkingprecision(ArbReal, bits=128)

xt = ArbReal("1.1")

f_TMs = Taylor_Maclaurin_series_ArbNumerics(
f,
Dx,
x,
n)

f_TMs_am = Symbolics.value(substitute(f_TMs, Dict(x => ArbReal("1.0"))))

println("typeof(f_TMs_am): ", typeof(f_TMs_am), "\n")

@printf "f_TMs_am: %.32g \n"  f_TMs_am
@printf "exp(1.0)  %.32g \n" ArbNumerics.exp(ArbReal("1.0"))
println("e:        2.7182818284590452353602874713527 \n")

f_TMs_am = Symbolics.value(substitute(f_TMs, Dict(x => ArbReal(string(xt)))))

@printf "f_TMs_am: %.32g \n"  f_TMs_am
@printf "exp(%g) %.32g \n\n" xt^2 ArbNumerics.exp(xt^2)
end

begin
main()
end
``````

which gives the output

``````julia> include("test_ArbNumerics.jl")
f_TMs: 1.0 + x^2 + 0.5(x^4) + 0.1666666666666666666666666666666666666666666666666666666666666666666666666666674(x^6) + 0.04166666666666666666666666666666666666666666666666666666666666666666666666666685(x^8) + 0.008333333333333333333333333333333333333333333333333333333333333333333333333333396(x^10) + 0.001388888888888888888888888888888888888888888888888888888888888888888888888888883(x^12) + 0.0001984126984126984126984126984126984126984126984126984126984126984126984126984127(x^14) + 2.480158730158730158730158730158730158730158730158730158730158730158730158730159e-05(x^16) + 2.755731922398589065255731922398589065255731922398589065255731922398589065255725e-06(x^18) + 2.755731922398589065255731922398589065255731922398589065255731922398589065255716e-07(x^20) + 2.505210838544171877505210838544171877505210838544171877505210838544171877505204e-08(x^22) + 2.087675698786809897921009032120143231254342365453476564587675698786809897921014e-09(x^24) + 1.605904383682161459939237717015494793272571050348828126605904383682161459939241e-10(x^26) + 1.147074559772972471385169797868210566623265035963448661861360274058686757099453e-11(x^28) - 2.675932660178072500588950046965145797228427372556499266212877509367465857313922e-16(x^30) - 1.672457912611295312868093779353216123267767107847812041383048443354666160821201e-17(x^32)

f_TMs_nm: 2.718281828458229
exp(1.0)  2.718281828459045
e:        2.7182818284590452353602874713527

f_TMs_nm: 3.353484652534589
exp(1.21) 3.353484652549025

typeof(f_TMs_am): ArbReal{128}

f_TMs_am: 2.7182818284582292989171037334017
exp(1.0)  2.7182818284590450907955982984276
e:        2.7182818284590452353602874713527

f_TMs_am: 3.3534846525345884948876573616872
exp(1.21) 3.3534846525490236146538336470257
``````