Elementary Functions in IronPython QuickStart Sample
Illustrates how to use additional elementary functions in IronPython.
This sample is also available in: C#, Visual Basic, F#.
Overview
This QuickStart sample demonstrates the use of specialized elementary mathematical functions provided by Numerics.NET that offer higher precision and better numerical stability than standard methods.
The sample shows how to use functions that handle edge cases and potential numerical issues that can arise when working with floating-point arithmetic. It specifically covers:
- Using
Log1PlusX
for accurately computing log(1+x) when x is close to zero - Using
ExpMinus1
for precise calculation of exp(x)-1 near zero - Computing hypotenuse values for very large numbers without overflow using
Hypot
- Efficient integer power calculations using specialized
Pow
methods
These functions are particularly important in scientific computing and numerical analysis where maintaining precision and avoiding numerical instability is crucial. The sample includes comparisons between standard .NET Math methods and their numerically stable Numerics.NET counterparts.
The code
import numerics
from math import *
# We use many classes from the Extreme.Mathematics namespace.
from Extreme.Mathematics import *
# Illustrates the use of the elementary functions implemented
# by the Elementary class in the Extreme.Mathematics.Curve namespace of
# Extreme Numerics.NET.
# This QuickStart sample deals with elementary
# functions, implemented in the Elementary class.
#
# Elementary functions
#
# Evaluating Log(1+x) directly causes significant
# round-off error when x is close to 0. The
# Log1PlusX function allows high precision evaluation
# of this expression for values of x close to 0:
print "Logarithm of 1+1e-12"
print " Math.Log:", log(1+1e-12)
print " Log1PlusX:", Elementary.Log1PlusX(1e-12)
# In a similar way, Exp(x) - 1 has a variant, # ExpXMinus1, for values of x close to 0:
print "Exponential of 1e-12 minus 1."
print " Math.Exp:", exp(1e-12) - 1
print " ExpMinus1:", Elementary.ExpMinus1(1e-12)
# The hypotenuse of two numbers that are very large
# may cause an overflow when not evaluated properly:
print "Hypotenuse:"
a = 3e200
b = 4e200
print " Simple method: "
try:
sumOfSquares = a*a + b*b
Math.Sqrt(sumOfSquares)
except: # (OverflowException)
print "Overflow!"
print " Elementary.Hypot:", Elementary.Hypot(a, b)
# Raising numbers to integer powers is much faster
# than raising numbers to real numbers. The
# overloaded Pow method implements this:
print "2.5^19 =", Elementary.Pow(2.5, 19)
# You can raise numbers to negative integer powers
# as well:
print "2.5^-19 =", Elementary.Pow(2.5,-19)