EvalhfDataProc
evaluate a procedure using the hardware floats evaluator with floats, procedures and rtables as arguments
Calling Sequence
Parameters
Description
Examples
EvalhfDataProc(kv, fn, n, args)
kv
-
kernel handle of type MKernelVector
fn
Maple FUNCTION object
n
number of arguments
args
array of n hfdata structs
These functions can be used in external code with OpenMaple or define_external.
EvalhfDataProc evaluates the function, f(args), to a numerical value using evalhf. The n arguments provided are all hfdata structures representing complex floating point values, Maple procedures or rtables of type float[8]. The first argument must be inserted at args[1]. For example, to call f(3.14,2.718), set args[1] = 3.14, and args[2] = 2.718. The value at args[0] is not used.
The MapleTohfData function can be used to initialize the hfdata from a Maple procedure or rtable. The DoubleTohfData and ComplexTohfData routines can be used to initialize an hfdata variable from doubles or pairs of doubles.
The return value of EvalhfDataProc is an hfdata object. Currently this will always represent a real double. The real component of an hfData structure can be accessed using the RealhfData function.
#include <math.h>
#include "maplec.h"
ALGEB MyNewtonData( MKernelVector kv, ALGEB *args )
{
M_INT i;
FLOAT64 tolerance, newguess, res;
hfdata guess[2];
ALGEB f, fprime, x;
if( 3 != MapleNumArgs(kv,(ALGEB)args) ) {
MapleRaiseError(kv,"three arguments expected");
return( NULL );
}
if( IsMapleProcedure(kv,args[1]) ) {
f = args[1];
else {
ALGEB indets;
indets = EvalMapleProc(kv,ToMapleName(kv,"indets",TRUE),1,args[1]);
if( !IsMapleSet(kv,indets) || MapleNumArgs(kv,indets) != 1 ) {
MapleRaiseError(kv,"unable to find roots");
i = 1;
f = EvalMapleProc(kv,ToMapleName(kv,"unapply",TRUE),2,args[1],
MapleSelectIndexed(kv,indets,1,&i));
if( !f || !IsMapleProcedure(kv,f) ) {
MapleRaiseError(kv,"unable to convert first arg to a procedure");
x = ToMapleName(kv,"x",FALSE);
fprime = EvalMapleProc(kv,ToMapleName(kv,"unapply",TRUE),2,
EvalMapleProc(kv,ToMapleName(kv,"diff",TRUE),2,
ToMapleFunction(kv,f,1,x),x),x);
if( !fprime || !IsMapleProcedure(kv,fprime) ) {
MapleRaiseError(kv,"unable to compute derivative");
DoubleTohfData( kv, MapleEvalhf( kv, args[2] ), 0, guess+1 );
tolerance = MapleEvalhf(kv,args[3]);
res = 0.0;
for( i=0; i<500; ++i ) {
res = RealhfData( kv, EvalhfDataProc(kv,f,1,guess) );
if( fabs( res ) <= tolerance )
break;
newguess = RealhfData( kv, guess[1] ) -
res / RealhfData( kv, EvalhfDataProc(kv,fprime,1,guess) );
DoubleTohfData( kv, newguess, 0, guess+1 );
if( i == 500 ) {
MapleRaiseError(kv,"unable to find root after 500 iterations");
return( ToMapleFloat(kv, RealhfData( kv, guess[1] ) ) );
Execute the external function from Maple.
with⁡ExternalCalling:
dll≔ExternalLibraryName⁡HelpExamples:
newton≔DefineExternal⁡MyNewtonData,dll:
f≔x4−5⁢x2+6⁢x−2:
newton⁡f,0,0.001
0.731892751250226237
eval⁡f,x=
−0.000039355
newton⁡f,sqrt⁡2,0.00001
1.00195003210012135
3.833×10−6
newton⁡f,−π,1.×10−10
−2.73205080756887719
Digits≔15:
1.5×10−13
f≔unapply⁡f,x:
evalhf⁡f⁡
−7.10542735760100186×10−15
See Also
CustomWrapper
define_external
evalhf
OpenMaple
OpenMaple/C/API
OpenMaple/C/ComplexTohfData
OpenMaple/C/DoubleTohfData
OpenMaple/C/Examples
OpenMaple/C/MapleTohfData
OpenMaple/C/RealhfData
OpenMaple/C/ToMaplehfData
Download Help Document