|
>Is "the" cube root of -1, -1?
>No.
>It is one of at least two cube roots.
By that logic, pow(1, 1/3) should return undefined too, since -1/2 + j * sqrt(3)/2 and -1/2 - j * sqrt(3)/2 are also solutions. (It doesn't. It returns 1, as you would expect.)
For what it's worth, the calculator in Windows XP returns "Invalid input for function" when you try to do (-1)^(1/3). I think that's what most calculators that don't handle complex numbers do.
|
|
|
|
|
Read the second half of the message please. I amended my response long before you posted your message where I talk about the problem of detecting the 1/x where x is an integer.
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
Sorry. I didn't mean to offend you. I guess I should have worded that more carefully.
I was just trying to point out that his question was a little deeper than people were giving it credit for. As you said, the floating point representation of 1/3 is not exact. Yet, pow(1,1/3) correctly returns 1, even though there are two equally valid complex solutions. Why, then, shouldn't pow(-1,1/3) return -1? It is, after all, the only real-valued solution. I guess the ANSI C developers opted for efficiency rather than completeness.
Again, sorry if I offended you. That wasn't my intention.
|
|
|
|
|
Hi there
Tim is absolutely right.
The easiest way to calculate a power is using logarithms, so let say we have this
r = x ^ y
so to calculate r will be something like this
r = e ^ (y * log x)
where e^ and log can be obtained using the Taylor Polynomial
f(x) = f(a) + f'(a) * (x-a)/1! + f"(a) * (x-a)^2/2! + ...+ fN(a) * (x-a)^n/n!
where f', f" ... fN are the first n derivatives of f, and a is a value with which all the funcion can be calculated, for e^ can be 0 for ln, 1.
Anyway, like I was saing the use of logarithm is the reason you are not geting the real root you are looking for, as you can see in your case you would have something like this
r = e ^ ( 1/3 * log -1)
and as we all know log -1 has no solution on the domain of real numbers, the solution is an imaginary number, -PI i, and there is your problem.
So you have some options here, one is to do some analitical preprocessing before the actual calculations, the other one is to redefine pow and/or log to handle complex numbers.
Fabian
|
|
|
|
|
I think it is because of this reason:
a^x = y
ln(a^x) = ln(y)
x.ln(a) = ln(y)
e^(x.ln(a)) = y
ln(a) is undefined for a <= 0
it should work for a,x,y are of type complex. I have done such a thing many years ago. It works also for -1 ^ 1/2 (which is the complex number "i" or "j") written as y.re=0 and y.im=1 .
I am not sure if pow can be called as "complex y = pow( complex a, complex x )", if not, you need to overload it in some way. That's a challenge!!
Wish it helps some.
Michel
|
|
|
|
|
thanks, i get what you're saying
i think maybe i will implement sets and complex numbers into my calculator program to get around this..
i've never heard of the "complex" class, though.. is it STL?
so far i'm only using STL classes and would like to keep it to a bare minimum of external libraries
r -€
|
|
|
|
|
Hi,
Yes Complex is a class of STL, but it won't help you either, try this
complex<double> x, y, r;
x.real(-1.0);
x.imag(0.0);<br> <br>
y.real(1.0/3.0);
y.imag(0.0);<br> <br>
r = pow(x, y);<br>
r = exp(y * log(x));
So as I said, you will have to do some preprocessing or redefine pow yourself
Fabian
|
|
|
|
|
thanks for the info... ill leave the fix for a later date
r -€
|
|
|
|
|
I use Visual C++ 6.0. I want to link my MFC application staticly instead of using shared DLLs. If I go to Project->Settings->General I can ONLY chose "Use MFC in a shared DLL". What's wrong?
|
|
|
|
|
|
|
::VkKeyScan translates a character to the corresponding virtual-key code and shift state for the current keyboard, but which function does the reverse and translates the VK code and shift state to a character, is there any? Thanks.
|
|
|
|
|
|
ToAsciiEx / ToUnicodeEx .
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
i want to make a keyboard driver. my aim is to type any Indian languages in ms word or excel or notepad etc.what are the code words for hooking ( trap ) a key stroke and post it to a desired application. i have some idea first we have to get the focus of the window ( get focus api) then each keystroke has to be trapped and converted to their ascii. Then using post message api converted ascii is passed to the input focus window.
but i am not sure, pls give me a small program by which when we type 'a' in the keyboard we must get 'b' in the desired window. thanks
|
|
|
|
|
I think you will need to install a keyboard hook. Check ::SetWindowsHookEx .
|
|
|
|
|
I'm trying to display a small icon in a CStatusBarCtrl. I created a 16x16 icon, IDI_X, in the resource editor, then I tried the following:
HICON hIcon;
hIcon = theApp.LoadIcon(MAKEINTRESOURCE(IDI_X));
m_wndSBC.SetIcon(0, hIcon);
The icon is resized to 32x32 and doesn't fit in the status bar. The CApp::LoadIcon documentation says it can only be used to load an icon whose size conforms to the SM_CXICON and SM_CYICON system metric. It says to use LoadImage instead. So, I tried this:
HANDLE hIcon;
hIcon = LoadImage(NULL, MAKEINTRESOURCE(IDI_X),
IMAGE_ICON, 0, 0, 0);
DWORD dwError;
dwError = GetLastError();
That didn't work either. LoadImage returns NULL and GetLastError returns 1813: "The specified resource type cannot be found in the image file."
Can anyone help?
|
|
|
|
|
Just an update. I got it to work by doing the following:
HANDLE hIcon;
hIcon = ::LoadImage(NULL, "res\\icon1.ico",
IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
m_wndSBC.SetIcon(0, (HICON) hIcon);
But I'd still like to know why it didn't work the other way, if anyone can help.
Thanks.
|
|
|
|
|
|
Hmmm... I'm still getting the same error 1831. What am I doing wrong?
m_hIconX = LoadImage(NULL, MAKEINTRESOURCE(IDI_X),
IMAGE_ICON, 16, 16, 0);
DWORD dwError;
dwError = GetLastError();
|
|
|
|
|
|
Thanks, Mike! That did the trick. Much appreciated.
|
|
|
|
|
Hi Barvus,
An unrelated coment to your problem, I saw you used GetLastError() just to check what was wrong with the LoadImage call, good news for you, you don't have to type those two lines ever again, you can check the registers and pseudoregister and see among other things, the last error directly, to better undestand what I'm talking about, check this article
An introduction to debugging in MSVC++ using Pseudoregisters
By Wouter Dhondt
Fabian
|
|
|
|
|
Hey, thanks for the tip! Good to know. I wonder why that's not documented in MSDN.... Or is it? Must be buried somewhere deep.
|
|
|
|
|