|
Just comment out the error. It's a stupid error anyway. I've done it for years on numberous projects and it's never broken anything running that way.
|
|
|
|
|
Hi:
I am not able to explain this behaviour:
1. The following code produces 0.013721122105938371, which is correct:
printf("\n\n%4.25Lf\n\n", + mBase[3][3] * exp( -4.0 * fAlpha * fPeriod )
+ mBase[3][2] * exp( -3.0 * fAlpha * fPeriod )
+ mBase[3][1] * exp( -2.0 * fAlpha * fPeriod )
+ mBase[3][0] * exp( -1.0 * fAlpha * fPeriod ));
2. The following code also produces the same number:
double a,b,c,d;
a = mBase[3][3] * exp( -4.0 * fAlpha * fPeriod );
b = mBase[3][2] * exp( -3.0 * fAlpha * fPeriod );
c = mBase[3][1] * exp( -2.0 * fAlpha * fPeriod );
d = mBase[3][0] * exp( -1.0 * fAlpha * fPeriod );
printf("\n\n%4.25Lf\n\n", a+b+c+d);
3. But this code produces a slightly different number 0.013721122105938344 (error in the last 2 digits for a relatively small loop! for larger loops it only gets worse!):
int n;
double fOrthonormal = 0.0;
for (n = 0; n <= 3; n++) {
fOrthonormal += mBase[3][n] * exp( -( double )(n + 1) * fAlpha * fPeriod);
}
4. MOreover this code, surprisingly also produces a different number!
int n;
double fOrthonormal = 0.0;
for (n = 3; n >= 0; n--) {
fOrthonormal += mBase[3][n] * exp( -( double )(n + 1) * fAlpha * fPeriod);
}
Precision in my case is important. It looks like it's really sensitive to the order in which numbers are added. But when I would intuitively expect an error in the last digit only (for a 4 item loop), it produces an error in the last 2 or 3! Any ideas why this happens?
IS THERE A BETTER NUMBER CLASS TO USE WHEN PRECISION MATTERS?
Thanks
|
|
|
|
|
Anton A. Loukine wrote:
Any ideas why this happens?
because doubles are only approximations.
Anton A. Loukine wrote:
IS THERE A BETTER NUMBER CLASS TO USE WHEN PRECISION MATTERS?
you'll probably need a scaled integer solution, if absolute accuracy is important.
-c
Be very, very careful what you put into that head, because you will never, ever get it out. --Thomas Cardinal Wolsey
|
|
|
|
|
Double precision numbers only have 15 places of precision. Also, when doing addition and subtraction, order of operation can change the result since those operations are most prone to error.
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
Assuming this reference is upto date:
http://www.cs.nyu.edu/exact/core/download/windowsInstr.html
Its code that deals with exact mathematics. Might be what you need
Roger Allen
Sonork 100.10016
Were you different as a kid? Did you ever say "Ooohhh, shiny red" even once? - Paul Watson 11-February-2003
|
|
|
|
|
This is because of the IEEE format for FP numbers. If you knew how it's stored, then you'd be amazed that you can get that accurate at all.
The difference is the -(double)(n+1)
Try initalizing a negative double array double a[]={-4.0, -3.0 ...} and using that, if at all possible. It is in the negation that you are losing precision, IMHO.
|
|
|
|
|
Negation is just a simple flip of the sign bit. Addition and subtraction are the usual causes in precision problems..
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
Skewled
Well I do know that multiplication is addition - you convert to the same base and add exponents. I forget how addition works. It's been a few years.
|
|
|
|
|
Anton A. Loukine screamed:
IS THERE A BETTER NUMBER CLASS TO USE WHEN PRECISION MATTERS?
1. You don't need to scream.
2. That depends on what you define as "better". Try Googling for NTL (Number theory library). It has almost arbitrary bit-length precision floating point numbers (if you want 1024 bits of FP precision, you get it). It also contains class(es) to handle large integeres.
|
|
|
|
|
Does anyone know how to to get mouse events in the area OUTSIDE the buttons of a tab control?
If I derive a new class from CTabCtrl and then add, for example, a OnLButtonDown() handler, it *never* gets called unless I click on the tab/button area of the control. Is there some mechanism to turn this on? If I override PreTranslateMessage() in my custom tab class, it receives NO messages at all if I click or move the mouse over the out tab control area (i.e. the area that contains the buttons/tabs)
Any thoughts?
¡El diablo está en mis pantalones! ¡Mire, mire!
Real Mentats use only 100% pure, unfooled around with Sapho Juice(tm)!
|
|
|
|
|
Hi when i compile the code i get
WINDOWS.H already included. MFC apps must not #include <windows.h>
this is when I add the #include <afx.h>
if i try to remove the #include <windows.h> i get many many error and if i don't add #include <afx.h> I don't can use my funktion.
So what should i do please help if you can.
This is a tricky one.
\Larsson
|
|
|
|
|
Probably removing the LEAN_AND_MEAN define and the #include <windows.h> from your stdafx.h helps.
... you keep forgetting that sheep shagging is not a crime in Australia ...Paul Watson, The Lounge
|
|
|
|
|
Hmmm,
I don't now what you meen what should I remove and whare?
\Larsson
|
|
|
|
|
Normally your Wizard generated stdafx.h file contains a line
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
which you might need to remove because it excludes some definitions from the (later included) windows.h
You do not need to include windows.h yourself anywhere, when you include stdafx.h.
... you keep forgetting that sheep shagging is not a crime in Australia ...Paul Watson, The Lounge
|
|
|
|
|
Sorry,
But that don't work for me do you have any more ide's?
\Larsson
|
|
|
|
|
Just one: read the VC documentation on using include files.
... you keep forgetting that sheep shagging is not a crime in Australia ...Paul Watson, The Lounge
|
|
|
|
|
Well,
I have done that butt I don't get what's wrong.
\Larsson
|
|
|
|
|
I have an app (we'll call this app "Ice") that I need to communicate with from another app (we'll call this app "Kicker") . In order to communicate between processes, I need each program's HWND.
If Ice is not already running, Kicker will run it, and can obtain the Ice HWND from the resulting ProcessInfo structure.
If Ice is already running, there are a number of ways that I can think of to obtain the running program's HWND, but these two are the ones I've settled on:.
1) Use the win api function "FindWindow()". This works fine as long as Ice hasn't loaded a file because the act of loading a file changes ICE's titlebar, and I can no longer find the window using "FindWindow()". If this attempt at finding the HWND fails, I resort to the following:
2) Use a combination of HWND_BROADCAST and WM_COPYDATA to get Ice to respond with it's HWND. This does not appear to work at all.
Ice already handles the WM_COPYDATA message. In Kicker, I'm trying to use the following code to tell Ice that Kicker is looking for it's HWND:
HWND CKickerDlg::FindThruCopyData()
{
HWND hWndIce = NULL;
m_hGlobalIceWnd = NULL;
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = 0;
cds.lpData = NULL;
WPARAM wParam = WPARAM(m_hWnd);
LPARAM lParam = LPARAM(&cds);
int nTimeout = 5000;
int nTime = 0;
int nInterval = 200;
::SendNotifyMessage(HWND_BROADCAST, WM_COPYDATA, wParam, lParam);
do
{
MSG msg;
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
hWndIce = m_hGlobalIceWnd;
if (hWndIce == NULL)
{
Sleep(nInterval);
nTime += nInterval;
}
} while (hWndIce == NULL && nTime <= nTimeout);
return hWndIce;
}
I've also tried PostMessage with no luck. SendMessage is not really viable because it sits and waits for a response from the hwnd the message was sent to, and I just want to sit and spin while waiting for Ice torespond.
The problem is that Ice never seems to get the WM_COPYDATA message that I broadcasted.
Can anyone shed some light on this?
------- signature starts
"...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
Please review the Legal Disclaimer in my bio.
------- signature ends
|
|
|
|
|
John Simmons / outlaw programmer wrote:
Can anyone shed some light on this?
Have you tried BroadcastSystemMessage() ? From the MSDN docs: The BroadcastSystemMessage function sends a message to the specified recipients. The recipients can be applications, installable drivers, network drivers, system-level device drivers, or any combination of these system components.
Available in Win95 and later.
--
"And God said, Let us make man in our image"
|
|
|
|
|
That made explorer crash.
------- signature starts
"...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
Please review the Legal Disclaimer in my bio.
------- signature ends
|
|
|
|
|
Why dont you use SendMessageTimeout() if SendMessage() is not an option because it blocks?
... you keep forgetting that sheep shagging is not a crime in Australia ...Paul Watson, The Lounge
|
|
|
|
|
Probably because it tried to interpret the WM_COPYDATA message. I didn't foresee that one.
Schlaubi, in the thread below, has probably the best solution.
--
"And God said, Let us make man in our image"
|
|
|
|
|
John Simmons / outlaw programmer wrote:
) Use the win api function "FindWindow()". This works fine as long as Ice hasn't loaded a file because the act of loading a file changes ICE's titlebar, and I can no longer find the window using "FindWindow()
That's only partly true. Assign an unique class name to your window and provide it in your call to FindWindow. Then it doesn't matter what the title contains.
|
|
|
|
|
Wow - that solved every problem I was having.
Thanks mucho amigo.
------- signature starts
"...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
Please review the Legal Disclaimer in my bio.
------- signature ends
|
|
|
|
|
If you are solely attempting to communicate, let me offer another way. It's kinda hacky, but it works quite well.
Create custom messages using RegisterWindowMessage. These messages should be unique.
UINT MY_READY_MSG = ::RegisterWindowMessage(_T("MY_READY_MSG--{EECA87052-A43D-4c82-835D-12776024CB70}"));
Create this id in both apps, and use
::PostMessage( HWND_BROADCAST, MY_READY_MSG, 0, 0 );
If you need to send arguments, use atoms...
just a thought....
|
|
|
|