9
$\begingroup$

The code:

<< Quaternions`;
Exp[Quaternion[1, 0, 0, 0]]

produces an error:

During evaluation of In[81]:= Power::infy: Infinite expression 1/0 encountered. >>

During evaluation of In[81]:= Power::infy: Infinite expression 1/0 encountered. >>

During evaluation of In[81]:= Power::infy: Infinite expression 1/0 encountered. >>

During evaluation of In[81]:= General::stop: Further output of Power::infy will be suppressed during this calculation. >>

During evaluation of In[81]:= $RecursionLimit::reclim: Recursion depth of 1024 exceeded. >>

During evaluation of In[81]:= $RecursionLimit::reclim: Recursion depth of 1024 exceeded. >>

During evaluation of In[81]:= $RecursionLimit::reclim: Recursion depth of 1024 exceeded. >>

During evaluation of In[81]:= General::stop: Further output of $RecursionLimit::reclim will be suppressed during this calculation. >>

During evaluation of In[81]:= $IterationLimit::itlim: Iteration limit of 4096 exceeded. >>

During evaluation of In[81]:= Infinity::indet: Indeterminate expression 0 ComplexInfinity encountered. >>

I expect it to output E instead.

Quaternion exponent formula is

In[84]:= ScalarQ[x_] = True;
Exp[Quaternion[a, b, c, d]]

Out[85]= Quaternion[E^a Cos[Sqrt[b^2 + c^2 + d^2]], (
 b E^a Sin[Sqrt[b^2 + c^2 + d^2]])/Sqrt[b^2 + c^2 + d^2], (
 c E^a Sin[Sqrt[b^2 + c^2 + d^2]])/Sqrt[b^2 + c^2 + d^2], (
 d E^a Sin[Sqrt[b^2 + c^2 + d^2]])/Sqrt[b^2 + c^2 + d^2]]

but quaternion cannot substitute directly in case AbsIJK[x] == 0.

Is there a fix in Mathematica 10? Is there any reason for it to cause error?

$\endgroup$
  • 1
    $\begingroup$ It still present in 10.x. $\endgroup$ – user18792 Apr 28 '16 at 7:27
  • 1
    $\begingroup$ Version 5.2 (the version before the add-on packages were completely overhauled) does not have a problem evaluating Exp[Quaternion[1, 0, 0, 0]]. I suspect something done during the transition to version 6 broke it. $\endgroup$ – J. M. will be back soon May 6 '16 at 0:04
2
$\begingroup$

An attempt to fix

Go to Mathematica installation path, find the Quaternion.m package file. In line 359, you should find the original definition:

Quaternion /:
Sign[a:Quaternion[__?ScalarQ]]:= a / Abs[a]

change the definition to this:

Quaternion /:
Sign[a:Quaternion[__?ScalarQ]]:= If[Abs[a]==0, 0, a / Abs[a]]

My investigations

First I used TracePrint on Mathematica 10.4.1, and found something like Quaternion[0, 0, 0, 0]/Abs[Quaternion[0, 0, 0, 0]] appears before the error messages, and Sign function was simply defined as a/Abs[a], that's why I changed that function.

J.M. mentioned that in 5.2 this can return a result. I tested it and also found it true. But when I see the trace print, I found AdjustedSignIJK runs into a case where it commented: (* This seems very wrong. *), and returns I for sign. However in the following calculations, a 0 from other place multiples with this I, so accidentally it becomes correct. In 6.0, the package was modified. From line 387 to 390:

(* fix bug 66775 -- charlesp *)

SignIJK[Quaternion[a_?ScalarQ, b_?ScalarQ, c_?ScalarQ, d_?ScalarQ]] :=
Sign[Quaternion[0, b, c, d]]

Looks like an attempt to fix this bug(at least it doesn't run into that case anymore), that's where it made the program calls Sign. Since Sign did not consider case 0, the new bug happened.

This is only my shallow observation. I am not sure if this can break anything else.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.