Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "cmplrs/host.h"
00037 #include "qcmplx.h"
00038 #include "cq_div.h"
00039
00040 qcomplex __powcqi(long double aqreal, long double aqimag, int32 n)
00041 {
00042 long double t;
00043 qcomplex x, p;
00044
00045 p.qreal = 1;
00046 p.qimag = 0;
00047
00048 if(n == 0)
00049 return p;
00050
00051 if(n < 0) {
00052 n = -n;
00053 x = __cqdiv(p.qreal, p.qimag, aqreal, aqimag);
00054 } else {
00055 x.qreal = aqreal;
00056 x.qimag = aqimag;
00057 }
00058
00059 for( ; ; ) {
00060 if(n & 01) {
00061 t = p.qreal * x.qreal - p.qimag * x.qimag;
00062 p.qimag = p.qreal * x.qimag + p.qimag * x.qreal;
00063 p.qreal = t;
00064 }
00065 if(n >>= 1) {
00066 t = x.qreal * x.qreal - x.qimag * x.qimag;
00067 x.qimag = 2 * x.qreal * x.qimag;
00068 x.qreal = t;
00069 } else {
00070 break;
00071 }
00072 }
00073 return p;
00074 }
00075
00076 qcomplex __powcql(long double aqreal, long double aqimag, int64 n)
00077 {
00078 long double t;
00079 qcomplex x, p;
00080
00081 p.qreal = 1;
00082 p.qimag = 0;
00083
00084 if(n == 0)
00085 return p;
00086
00087 if(n < 0) {
00088 n = -n;
00089 x = __cqdiv(p.qreal, p.qimag, aqreal, aqimag);
00090 } else {
00091 x.qreal = aqreal;
00092 x.qimag = aqimag;
00093 }
00094
00095 for( ; ; ) {
00096 if(n & 01) {
00097 t = p.qreal * x.qreal - p.qimag * x.qimag;
00098 p.qimag = p.qreal * x.qimag + p.qimag * x.qreal;
00099 p.qreal = t;
00100 }
00101 if(n >>= 1) {
00102 t = x.qreal * x.qreal - x.qimag * x.qimag;
00103 x.qimag = 2 * x.qreal * x.qimag;
00104 x.qreal = t;
00105 } else {
00106 break;
00107 }
00108 }
00109 return p;
00110 }
00111
00112 void __pow_cqi(qcomplex *p, qcomplex *a, int32 *b)
00113 {
00114 *p = __powcqi(a->qreal, a->qimag, *b);
00115 }
00116
00117 void __pow_cql(qcomplex *p, qcomplex *a, int64 *b)
00118 {
00119 *p = __powcql(a->qreal, a->qimag, *b);
00120 }