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 #include "scs.h"
00029 #include "scs_private.h"
00030
00031
00032
00033
00034
00035
00036 void scs_set_d(scs_ptr result, double x){
00037 scs_db_number nb, mantissa;
00038 int exponent, exponent_remainder;
00039 int ind, i;
00040
00041 if(x>=0){R_SGN = 1; nb.d = x;}
00042 else {R_SGN = -1; nb.d = -x;}
00043
00044 exponent = nb.i[HI_ENDIAN] & 0x7ff00000 ;
00045
00046 if (exponent == 0x7ff00000) {
00047
00048
00049
00050 R_EXP = x;
00051 for(i=0; i<SCS_NB_WORDS; i++)
00052 R_HW[i] = 0;
00053
00054 R_IND = 0;
00055 R_SGN = 1;
00056 }
00057
00058 else {
00059
00060
00061 R_EXP = 1;
00062
00063 #if 1
00064
00065 if (exponent == 0){
00066
00067 nb.d = nb.d * SCS_RADIX_TWO_DOUBLE;
00068 exponent = nb.i[HI_ENDIAN] & 0x7ff00000 ;
00069 R_IND = -2;
00070 }else {
00071 R_IND = 0;
00072 }
00073
00074 exponent = exponent >> 20;
00075
00076 ind = ((exponent +((100*SCS_NB_BITS)-1023))/SCS_NB_BITS) - 100 ;
00077
00078
00079
00080
00081 exponent_remainder = exponent - 1022 - (SCS_NB_BITS*ind);
00082
00083 R_IND += ind;
00084
00085
00086 mantissa.l = (nb.l & 0x000fffffffffffff) | 0x0010000000000000;
00087
00088
00089
00090
00091 R_HW[0] = mantissa.l >> (53 - exponent_remainder);
00092
00093
00094 mantissa.l = (mantissa.l << (exponent_remainder+11));
00095 R_HW[1] = (mantissa.i[HI_ENDIAN] >> (32 - SCS_NB_BITS))& SCS_MASK_RADIX ;
00096 mantissa.l = (mantissa.l << SCS_NB_BITS);
00097 R_HW[2] = (mantissa.i[HI_ENDIAN] >> (32 - SCS_NB_BITS))& SCS_MASK_RADIX ;
00098 #if SCS_NB_BITS < 27
00099 mantissa.l = (mantissa.l << SCS_NB_BITS);
00100 R_HW[3] = (mantissa.i[HI_ENDIAN] >> (32 - SCS_NB_BITS))& SCS_MASK_RADIX ;
00101 #else
00102 R_HW[3] = 0 ;
00103 #endif
00104
00105 #if (SCS_NB_WORDS==8)
00106 R_HW[4] = 0; R_HW[5] = 0; R_HW[6] = 0; R_HW[7] = 0;
00107 #else
00108 for(i=4; i<SCS_NB_WORDS; i++)
00109 R_HW[i] = 0;
00110 #endif
00111
00112
00113
00114 #else
00115 R_IND = 0;
00116
00117 while(nb.d>SCS_RADIX_ONE_DOUBLE) {
00118 R_IND++;
00119 nb.d *= SCS_RADIX_MONE_DOUBLE;
00120 }
00121
00122 while(nb.d<1) {
00123 R_IND--;
00124 nb.d *= SCS_RADIX_ONE_DOUBLE;
00125 }
00126
00127 i=0;
00128 while(nb.d != 0){
00129 R_HW[i] = (unsigned int) nb.d;
00130 nb.d = (nb.d - (double)R_HW[i]) * SCS_RADIX_ONE_DOUBLE;
00131 i++;
00132 }
00133 for(; i<SCS_NB_WORDS; i++)
00134 R_HW[i] = 0;
00135
00136 #endif
00137
00138 }
00139
00140 return;
00141 }
00142
00143
00144
00145
00146
00147
00148 void scs_set_si(scs_ptr result, signed int x){
00149 unsigned int ux;
00150 int i;
00151
00152 if(x>=0){R_SGN = 1; ux = x;}
00153 else {R_SGN = -1; ux = -x;}
00154
00155
00156 if (ux > SCS_RADIX){
00157 R_IND = 1;
00158 R_HW[0] = (ux - SCS_RADIX) >> SCS_NB_BITS;
00159 R_HW[1] = ux - (R_HW[0] << SCS_NB_BITS);
00160 }else {
00161 R_IND = 0;
00162 R_HW[0] = ux;
00163 R_HW[1] = 0;
00164 }
00165
00166 for(i=2; i<SCS_NB_WORDS; i++)
00167 R_HW[i] = 0;
00168
00169 if (x != 0) R_EXP = 1;
00170 else R_EXP = 0;
00171
00172 return;
00173 }
00174