DoubleTohfData - Maple Help
For the best experience, we recommend viewing online help using Google Chrome or Microsoft Edge.

Online Help

All Products    Maple    MapleSim


MapleTohfData

initialize hfdata structures for use in external code

 

Calling Sequence

Parameters

Description

Examples

Calling Sequence

MapleTohfData(kv, a, hf)

DoubleTohfData(kv, re, im, hf)

ComplexTohfData(kv, re, im, hf)

Parameters

kv

-

kernel handle of type MKernelVector

a

-

Maple PROC or RTABLE object

re

-

the value to use as the real component

im

-

the value to use as the imaginary component

hf

-

a pointer to the hfdata structure to initialize

Description

• 

These functions can be used in external code with OpenMaple or define_external.

• 

MapleTohfData encodes a Maple PROC or an RTABLE of type float[8] into an hfdata structure.  These structures are used to pass arguments into and get results out of EvalhfDataProc.

• 

DoubleTohfData and ComplexTohfData encode a complex number represented as two doubles into an hfdata structure.  They differ in that if the im argument to DoubleTohfData is 0.0 or -0.0 it will be ignored, so the resulting hf structure will be treated as representing a real number, not a real number with zero imaginary part.  These structures are used to pass arguments into and get results out of EvalhfDataProc.

• 

A Maple object encoded in a hfdata structure can be extracted by calling ToMaplehfData.  The real and imaginary parts of a hfdata can be extracted by calling RealhfData and ImaginaryhfData.

• 

All hfdata objects returned by EvalhfDataProc represent real floating point values.

Examples

    #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");

        return( NULL );

        }

        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");

        return( NULL );

        }

    }

    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");

        return( NULL );

    }

    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( NULL );

    }

    return( ToMapleFloat(kv, RealhfData( kv, guess[1] ) ) );

    }

Execute the external function from Maple.

withExternalCalling&colon;

dllExternalLibraryNameHelpExamples&colon;

newtonDefineExternalMyNewtonData&comma;dll&colon;

fx45x2+6x2&colon;

newtonf&comma;0&comma;0.001

0.731892751250226237

(1)

evalf&comma;x=

−0.000039355

(2)

newtonf&comma;sqrt2&comma;0.00001

1.00195003210012135

(3)

evalf&comma;x=

3.833×10−6

(4)

newtonf&comma;π&comma;1.×10−10

−2.73205080756887719

(5)

Digits15&colon;

evalf&comma;x=

1.5×10−13

(6)

funapplyf&comma;x&colon;

newtonf&comma;π&comma;1.×10−10

−2.73205080756887719

(7)

evalhff

−7.10542735760100186×10−15

(8)

See Also

CustomWrapper

define_external

evalhf

OpenMaple

OpenMaple/C/API

OpenMaple/C/EvalhfDataProc

OpenMaple/C/Examples

OpenMaple/C/ImaginaryhfData

OpenMaple/C/RealhfData

OpenMaple/C/ToMaplehfData