Problem with C++ operator for Vector

Discussion in 'C++' started by Toto, May 12, 2006.

  1. Toto

    Toto Guest

    Hello,
    I've got a problem with the redefinition of operator in C++. My intent
    is to create a TVector that internally work with __int64, with an
    external interface of double in order to optimize the operations. The
    double value put in input should be muliplied with factor 1e10, in
    order to limit
    the loss of precision and divided with the same quantity in output.
    To make this, I've supposed to can modify the operator() for the access
    at the singular element of a Vector.
    My test Vector class is like this

    class Vector
    {
    private:
    __int64 *Array;
    public:
    inline __int64& TVector::eek:perator()(byte Index) {if(Index>FDim) throw
    Exception("Out of bound Exception");return
    (__int64)Array[Index]*1e10;};
    };

    In the program:
    double Value = 3.43;
    Vector V(3);
    V(1) = Value:// Internally V.Array[1] =3.43e10;
    V(1)=V(1)+1;
    Value = V(1); // Value=4.43;


    Obviously the adopted solution does not work as I hope. Please, could
    someone help me with any kind of advise? I hope to have explain in good
    way the problem.
    Thanks in advance.
    Toto, May 12, 2006
    #1
    1. Advertising

  2. Toto wrote:
    > I've got a problem with the redefinition of operator in C++. My intent
    > is to create a TVector that internally work with __int64, with an
    > external interface of double in order to optimize the operations. The
    > double value put in input should be muliplied with factor 1e10, in
    > order to limit
    > the loss of precision and divided with the same quantity in output.
    > To make this, I've supposed to can modify the operator() for the
    > access at the singular element of a Vector.
    > My test Vector class is like this
    >
    > class Vector
    > {
    > private:
    > __int64 *Array;
    > public:
    > inline __int64& TVector::eek:perator()(byte Index) {if(Index>FDim) throw
    > Exception("Out of bound Exception");return
    > (__int64)Array[Index]*1e10;};


    You can't expect it to work on the left side of an assignment operator.
    You need something else there. Since you cannot expose the contents of
    your 'Array' to the user (as you tried), you need to write proxy classes,
    which will have assignment from a double expression and the conversion
    from 'double':

    struct proxy {
    __int64& lvalue;
    proxy(__int64& lv) : lvalue(lv) {}
    void operator = (double d) {
    lvalue = d * 1e10;
    }
    operator double () {
    return lvalue / 1e10;
    }
    };

    struct const_proxy {
    __int64 lvalue;
    const_proxy(__int64 lv) : lvalue(lv) {}
    operator double () {
    return lvalue / 1e10;
    }
    };

    and make your Vector return an instance of 'proxy':

    const_proxy operator()(byte Index) const {
    if (Index >= FDim) throw Exception("...");
    return const_proxy(Array[Index]);
    }

    proxy operator()(byte Index) {
    if (Index >= FDim) throw Exception("...");
    return proxy(Array[Index]);
    }

    > };
    >
    > In the program:
    > double Value = 3.43;
    > Vector V(3);
    > V(1) = Value:// Internally V.Array[1] =3.43e10;
    > V(1)=V(1)+1;
    > Value = V(1); // Value=4.43;
    >
    >
    > Obviously the adopted solution does not work as I hope. Please, could
    > someone help me with any kind of advise? I hope to have explain in
    > good way the problem.


    You have. Now I hope I have explained the solution well.

    V
    --
    Please remove capital 'A's when replying by e-mail
    I do not respond to top-posted replies, please don't ask
    Victor Bazarov, May 12, 2006
    #2
    1. Advertising

  3. Hi,

    Toto schrieb:

    > I've got a problem with the redefinition of operator in C++. My intent
    > is to create a TVector that internally work with __int64, with an
    > external interface of double in order to optimize the operations. The
    > double value put in input should be muliplied with factor 1e10, in
    > order to limit
    > the loss of precision and divided with the same quantity in output.


    1) you'll still lose a lot of precision, depending on the range of
    the numbers you want to store. Especially if they differ by more
    than a factor of 1e10
    2) Do you really think that an __int64-wrapper class will perform
    better than native CPU's doubles?

    Markus, not much help with your prblem, I know ;-)
    Markus Becker, May 13, 2006
    #3
  4. Toto

    Toto Guest

    Thank you very much for your help. Now I'm trying your solution and
    after I check whether it works.
    Toto, May 15, 2006
    #4
  5. Toto

    Toto Guest

    Dear Victor,
    I have tried your solution. It works very well!! It's wonderful!!!

    However I have encountered a little problem. Please read the example:

    void Function(void)
    {
    double Value = 0;
    Vector V(3);
    Vector V2(3);

    V(3) = 3; //OK
    Value = V(3); //OK
    V(2) = V(3); //OK
    V2(1) = V(3); //Error Message: Compiler could not generate operator=
    for class proxy
    }

    Please, could you help me to understand the Error of the last case? In
    my point of view the lasts two code rows are similar, because in both
    cases there are 2 assignment from element of Vector. Thanks in advance.



    Other question: I would like to implement this solution in order to
    speed up my mathematical libraries. Could anyone suggest me a website
    (or similar thinks) which contains
    sourcecode (for example written in assembler) that implements
    operations with Matrix
    and Vector? Thanks a lot.
    Toto, May 15, 2006
    #5
  6. Toto wrote:
    > Dear Victor,
    > I have tried your solution. It works very well!! It's wonderful!!!
    >
    > However I have encountered a little problem. Please read the example:
    >
    > void Function(void)
    > {
    > double Value = 0;
    > Vector V(3);
    > Vector V2(3);
    >
    > V(3) = 3; //OK
    > Value = V(3); //OK
    > V(2) = V(3); //OK
    > V2(1) = V(3); //Error Message: Compiler could not generate operator=
    > for class proxy
    > }
    >
    > Please, could you help me to understand the Error of the last case? In
    > my point of view the lasts two code rows are similar, because in both
    > cases there are 2 assignment from element of Vector. Thanks in
    > advance.


    The problem is that the proxy class contains a reference. The compiler
    cannot guess whether you mean to re-seat a reference or assign the value
    when performing operator==, and that's a guess at this point. Implement
    your own operator== in the proxy class and do what's right.

    > Other question: I would like to implement this solution in order to
    > speed up my mathematical libraries. Could anyone suggest me a website
    > (or similar thinks) which contains
    > sourcecode (for example written in assembler) that implements
    > operations with Matrix
    > and Vector? Thanks a lot.


    I don't know of any website with those things, but I strongly recommend
    putting aside performance for now. Only optimize what you know is not
    optimal. And you can only know by measuring. There are whole books
    written on optimization and performance, perhaps you need to check them
    out... "Efficient C++" is one of them. D. Knuth's "The Art of Computer
    Programming" is a classic, of course.

    V
    --
    Please remove capital As from my address when replying by mail
    Victor Bazarov, May 15, 2006
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. zhou
    Replies:
    9
    Views:
    452
    Andrey Tarasevich
    Sep 2, 2003
  2. pmatos
    Replies:
    6
    Views:
    23,725
  3. Replies:
    8
    Views:
    1,890
    Csaba
    Feb 18, 2006
  4. Javier
    Replies:
    2
    Views:
    542
    James Kanze
    Sep 4, 2007
  5. Rushikesh Joshi
    Replies:
    0
    Views:
    346
    Rushikesh Joshi
    Jul 10, 2004
Loading...

Share This Page