Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const size_t initialSize=24;
- const size_t sizeForMult1=initialSize+initialSize;
- const size_t finalSize=sizeForMult1+initialSize;
- class imSoHuge{
- public:
- bool isNegative;
- uint8_t r[finalSize];
- void load(float v){
- isNegative=false;
- for(size_t p=0;p<finalSize;p++)r[p]=0;
- union{
- uint8_t b[4];
- uint32_t u;
- float f;
- } reunion;
- reunion.f=v;
- if((reunion.b[3]&0x80) != 0x00)isNegative=true;
- uint32_t m, eu;
- eu=reunion.u<<1; //get rid of the sign;
- eu>>=24;
- m=reunion.u&(0x007fffff);
- if(eu==0){//zero or denormal
- if(m==0)return; //zero
- }else{
- m|=(0x00800000); //implicit leading one if it's not denormal
- }
- int32_t e=(int32_t)eu-127; //exponent is now in [e]. Debiased (does this word exists?)
- reunion.u=m;
- r[finalSize-1]=reunion.b[3];
- r[finalSize-2]=reunion.b[2];
- r[finalSize-3]=reunion.b[1];
- r[finalSize-4]=reunion.b[0];
- rollArrayRight(r, finalSize, e-(sizeForMult1*8)); //correct position for fixed-point
- }
- explicit imSoHuge(float v){
- load(v);
- }
- };
- float a[]={0.0097905760, 0.0223784577, 0.9997016787};
- float b[]={0.8248013854, 0.4413521587, 0.3534274995};
- float c[]={0.4152690768, 0.3959976136, 0.8189856410};
- float fTripleProduct(float*a, float*b, float*c){
- float crossAB[3];
- crossAB[0]=(a[1]*b[2])-(a[2]*b[1]);
- crossAB[1]=(a[2]*b[0])-(a[0]*b[2]);
- crossAB[2]=(a[0]*b[1])-(a[1]*b[0]);
- float tripleP=(crossAB[0]*c[0])+(crossAB[1]*c[1])+(crossAB[2]*c[2]);
- return tripleP;
- }
- imSoHuge tripleProduct(float*a, float*b, float*c){
- imSoHuge crossAB[3];
- crossAB[0]=(imSoHuge(a[1])*imSoHuge(b[2]))-(imSoHuge(a[2])*imSoHuge(b[1]));
- crossAB[1]=(imSoHuge(a[2])*imSoHuge(b[0]))-(imSoHuge(a[0])*imSoHuge(b[2]));
- crossAB[2]=(imSoHuge(a[0])*imSoHuge(b[1]))-(imSoHuge(a[1])*imSoHuge(b[0]));
- imSoHuge tripleP=(crossAB[0]*imSoHuge(c[0]))+(crossAB[1]*imSoHuge(c[1]))+(crossAB[2]*imSoHuge(c[2]));
- return tripleP;
- }
- 0 0 0 4 46 b9 4 69 39 3f 53 b8 19 e0 ...
- 0 0 0 4 46 b9 4 85 93 82 df ba 7d 80 ...
- Using class: second result is greater
- casting to float:
- first reasult: 1.336331e-001
- second result: 1.336331e-001
- as floats, the results are the same: 1.336331e-001
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement