Someone help me out here. I feel like I’m losing my mind.
a = RealVector2D.newFrom([3,-2]);
b = RealVector2D.newFrom([3,-2]);
x = (a<|>b)/(a.norm*b.norm); // x = 1.0
acos(1.0); // 0.0
x; // sanity check
acos(x); // going insane?
Is there something weird going on here or am I missing something?
Would be helpful to identify the extension where you got RealVector2D. It is not part of the base class library, and I don’t know where to get it.
hjh
Not sure what that (a<|>b) notation means, but regardless, I imagine x isn’t exactly (floating point) 1, it’s likely a miniscule amount greater than 1. Thus acos() returns NaN. (The domain of valid inputs for acos is [-1, 1].) Just because it prints out “1” when you postln doesn’t meant it is exactly that value (with float types)!
What does x-1.0 return? Or x==1.0? It’s also possible that x is a RealVector2D result and that class has its own overload of acos?
Just a few thoughts to check out…
Glen.
what does x.class
gives you ?
It’s from VectorSpace; sorry, spaced on passing that along. Here’s some other code with the functions written out by hand. <|> is the inner product of the two vectors. x.class
returns Float
a = [3,-2];
b = [3,-2];
~innerProduct = {|vec1, vec2| (vec1[0] * vec2[0]) + (vec1[1] * vec2[1])}; // define inner product
~norm = {|vec| vec[0].sumsqr(vec[1]).sqrt}; // define norm
x = ~innerProduct.(a,b) / (~norm.(a) * ~norm.(b)); // do it by hand
acos(x); // nan
acos(1.0); // 0.0
x == 1.0; // false
I think @totalgee is right; x == 1.0
returns false
. x-1
returns 2.2204460492503e-16
. Is there a way to check when a value not quite 1.0?
I would probably just do acos(x.clip(-1, 1)).
Glen.
There’s also .equalWithPrecision
Thanks all. I’ll likely just clip the input to acos.