|
I replaced all occurrences of float with double , and removed all the tail f , then the results match.
Maxwell Chen
|
|
|
|
|
Maxwell Chen wrote: I replaced all occurrences of float with double, and removed all the tail f, then the results match.
Of course, because you're cheating!
double numbers have a 52 bit mantissa (float have a 23 bit one) and, for instance, OP's s*1023 and s numbers can be comfortably lined up for addition without precision loss.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Maxwell - thanks for your reply!
what do you mean by 'results match'? match mine, or match each other?
i already tried going double, and still got different results:
double d = 1.0 + pow(2.0,-8.0) + pow(2.0,-18.0);
double dRes1 = 1024 * d;
double dRes2 = 0.0;
for(int i=0; i<1024; ++i)
dRes2 +=d;
on my machine gives:
dRes1= 1028.0039062500000
dRes2= 1028.0002441406250
which didn't even budge the difference down.
do you get different results? on what machine/compiler?
modified 23-Jan-21 21:03pm.
|
|
|
|
|
My result:
dRes1 = 1028.003906250000000
dRes2 = 1028.003906250000000
Visual C++ 2005,
Intel Centrino Core 2 Duo, T2400
Maxwell Chen
|
|
|
|
|
Pallini - thanks, you're right of course, but i suspect there's more to it. going double didn't make any difference (see my post to Maxwell below).
modified 23-Jan-21 21:03pm.
|
|
|
|
|
I tried and got, like Maxwell Chen, the same result (1028.0039062500000 ) for both dRes1 and dRes2 .
I'm using VC++ 2005 on Windows XP .
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Sorry for the delay - just returned from lunch. Upon further investigation, the difference is between debug and release builds. Debug build compiles to fpu code:
00C1A579 fldz
00C1A57B fstp qword ptr [ebp-48h]
00C1A57E mov dword ptr [i],0
00C1A585 jmp CurrentFunction+0C0h (0C1A590h)
00C1A587 mov eax,dword ptr [i]
00C1A58A add eax,1
00C1A58D mov dword ptr [i],eax
00C1A590 cmp dword ptr [i],400h
00C1A597 jge CurrentFunction+0D4h (0C1A5A4h)
00C1A599 fld qword ptr [ebp-48h]
00C1A59C fadd qword ptr [ebp-28h]
00C1A59F fstp qword ptr [ebp-48h]
00C1A5A2 jmp CurrentFunction+0B7h (0C1A587h)
which gives the wrong result, while release builds SSE code (along with loop unrolling):
004CAB82 xorps xmm1,xmm1
004CAB85 mov eax,80h
004CAB8A lea ebx,[ebx]
004CAB90 sub eax,1
004CAB93 addsd xmm1,xmm0
004CAB97 addsd xmm1,xmm0
004CAB9B addsd xmm1,xmm0
004CAB9F addsd xmm1,xmm0
004CABA3 addsd xmm1,xmm0
004CABA7 addsd xmm1,xmm0
004CABAB addsd xmm1,xmm0
004CABAF addsd xmm1,xmm0
004CABB3 jne CurrentFunction+80h (4CAB90h)
004CABB5 movsd mmword ptr [esp+38h],xmm1
which gives an accurate result.
setting the FPU control word to double or extended double precision solved it - i guess either your FPU control word was already set right, or you tested it in release builds.
thanks for everyone's time!
modified 23-Jan-21 21:03pm.
|
|
|
|
|
I tested in debug build.
Maxwell Chen
|
|
|
|
|
The project created earlier a Direct3D device. Apparently [^] this changes by default the FPU precision to single.
Haven't decided yet whether to change creation params to use D3DCREATE_FPU_PRESERVE, or to surround the code where i (think i) need extra precision with manual precision set/restore. Either way - problem found.
Thanks everyone!
modified 23-Jan-21 21:03pm.
|
|
|
|
|
I want to set a timer to execute in every two minutes in visual C++. Please help
|
|
|
|
|
If you are using MFC, you can use CWnd::SetTimer[^]
BTW, don't forget your friend google...
|
|
|
|
|
::SetTimer(1, 120000, MyTest);
void CALLBACK MyTest(HWND hW, UINT msg, UINT ev, DWORD time) {
}
Maxwell Chen
modified on Tuesday, January 29, 2008 10:35:27 AM
|
|
|
|
|
Maxwell Chen wrote: ::SetTimer(1, 120, MyTest);
Perhaps you meant to use 120000 instead.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
DavidCrow wrote: Perhaps you meant to use 120000 instead.
Yes.
Maxwell Chen
|
|
|
|
|
Have a look at SetTimer function documentation [^].
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Hi Friends....
i have some doubts regarding with my project ..i am trouble and i dont know how to finish up this one..
Tis is my queries:
1.i have one file that file contains list of data.first i wanna convert
that data Cfile into CStringArray how its possible.i used these function
CFile Lfile;
CStringArray data;
data=Lfile.GetLenght();
is it right conversion to data converting CFile to CStringArray..its shows one error :
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'ULONGLONG' (or there is no acceptable conversion)
how to cure it ? r wat method is suitable for converting CFile to CString Array.?
Thanks
raju.k
|
|
|
|
|
CFile file("data.txt", CFile::modeReadWrite | CFile::modeCreate);
CStringArray ar;
CString s;
s.format("%d", file.GetLength());
ar.Add(s);
Maxwell Chen
|
|
|
|
|
I think the OP wanted to read all the strings from the file and convert them into a CStringArray, not adding the file size to the string array.
Am I wrong ?
|
|
|
|
|
Maxwell Chen
|
|
|
|
|
You already asked this question yesterday and people told you that it is not the way to go. The GetLenght function only returns the size of the file. How could the compiler convert it to a string array ?
No, you really need to read your file yourself and extract each string, create a CString object and push it into the CStringArray.
|
|
|
|
|
Thanks guys its working ...i am really happy ..
Thank u very much
raju.k
|
|
|
|
|
You really took my solution?!
Maxwell Chen
|
|
|
|
|
May be you need to use CStdioFile instead of CFile ?
CStdioFile csf;
CFileException cfe;
CString str;
CStringArray csa;
csf.Open(_T("E:\\myfile.txt"), CFile::modeRead, &cfe);
while(csf.ReadString(str))
{
csa.Add(str);
}
AfxMessageBox(csa.GetAt(0));
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->Rajesh<-·´¯`·.
Codeproject.com: Visual C++ MVP
|
|
|
|
|
I need to call the function AfxBeginThread in one of my function (say, myFunc). myFunc should receive a function name which should become a thread.
My code is as follows:
void myFunc(void* fthread)
{
HANDLE cmd_thread;
CWinThread* pCmdThread = AfxBeginThread(fthread, NULL);
cmd_thread = pCmdThread->m_hThread;
..........
}
But i get an error that: cannot convert parameter one of AfxBeginThread from void* to unsigned int(_cdecl*)(void *).....
What should the parameter type be?
|
|
|
|
|
gReaen wrote: myFunc should receive a function name which should become a thread
In your example, you don't provide a function name but a void pointer. What do really need to do ? To provide the name of the function (so, a string containing the function name, like "MyThreadFunc") or a function pointer ?
The first option is much more complicated because there is no way for the compiler to get a function pointer just with its name (its like trying to get a variable with a string containing its name).
For the second option, that's much more easier: you just pass the function pointer that can be passed to the AfxBeginThread.
So, can you be more clear on that point ?
|
|
|
|