RE: [SDK]Double to long in c++ ?

Date : Wed, 6 Jun 2007 21:03:24 -0700
To : <XSI(at)Softimage.COM>
From : "Wessam Al-Bahnasi" <wbahnassi(at)inframez.com>
Subject : RE: [SDK]Double to long in c++ ?

Or better yet:

 

double t = (double)T + (double)oOffset;
long id = (long)(t * 3.0 * (double)nbPoints);

 

Wessam Bahnassi

Microsoft DirectX MVP,

Programmer

Electronic Arts

--

'Talk is cheap because supply exceeds demand'

 

From: owner-xsi(at)Softimage.COM [mailto:owner-xsi(at)Softimage.COM] On Behalf Of Luc-Eric Rousseau
Sent: Wednesday, June 06, 2007 3:31 PM
To: XSI(at)Softimage.COM
Subject: RE: [SDK]Double to long in c++ ?

 

I don't really know the answer to your question, so I appologize if this is wrong, but the cast operator has higher precedence than the multiply. so it's going to take that 't', cast it to a long, and do the rest in longs.

I think you wanted to have another set of parenthesis like (long)(t*3*nbPoints)

 

in any case,

casting a double to long just like that is not a good idea, you should add an epsilon to compensate for any numerical innacuracies.

For example  :  long id = (long)(t*3*nbPoints + 0.25);

 


From: owner-xsi(at)Softimage.COM [mailto:owner-xsi(at)Softimage.COM] On Behalf Of Ahmidou Lyazidi
Posted At: Wednesday, June 06, 2007 3:20 PM
Posted To: xsi
Conversation: [SDK]Double to long in c++ ?
Subject: [SDK]Double to long in c++ ?

Hi
In an Operator,we are trying to convert the datas passed by OperatorContex.GetTime to a long.The thing that is strange is when I log the value
it seems good, but when I mutiply it with a fixed value it seems to round it and give me 2 equal values for 2 differant frame
here is the code and the log:

long oOffset = oOp.GetParameterValue(L"TimeOffset");

CTime T = ctxt.GetTime();
Application().LogMessage(L"Current operator Time " + T.GetAsText());

double t = double(T) + oOffset;
long id = (long) t * 3 * nbPoints;

Application().LogMessage( (CString)t +L"* 3 * "+(CString) nbPoints +L" = "+(CString)id);

if(t>=startFrame && t<=endFrame)
{
    Application().LogMessage(L"Reading Frame "+ (CString) t);
    for(long a=0;a<nbPoints;a++)
    {
        inPos[a].Set(position[id],position[id+1],position[id+2]);
        id += 3;
    }
}    


//-----------------------------------------
1* 3 * 4 = 11
NextFrame();
// INFO : Current operator Time 00:00:00:02
// INFO : 2* 3 * 4 = 23
// INFO : Reading Frame 2
NextFrame();
// INFO : Current operator Time 00:00:00:03
// INFO : 3* 3 * 4 = 36
// INFO : Reading Frame 3
NextFrame();
NextFrame();
// INFO : Current operator Time 00:00:00:05
// INFO : 5* 3 * 4 = 60
// INFO : Reading Frame 5
 
Any ideas?
Thanks
A.


Search the XSI List archives here or use the advanced search form to search across mailing lists. Searching help is available.
This site supposedly brought to you by Benjamin Grosser and the Imaging Technology Group.