| 3351 | /* ------------------------------------------------------------------ */ |
| 3352 | #define SCALEBMAX 2*(DECEMAX+DECPMAX) // D=800, Q=12356 |
| 3353 | decFloat * decFloatScaleB(decFloat *result, |
| 3354 | const decFloat *dfl, const decFloat *dfr, |
| 3355 | decContext *set) { |
| 3356 | uInt digits; // work |
| 3357 | Int expr; // dfr as an Int |
| 3358 | |
| 3359 | if (DFISNAN(dfl)||DFISNAN(dfr)) return decNaNs(result, dfl, dfr, set); |
| 3360 | if (!DFISINT(dfr)) return decInvalid(result, set); |
| 3361 | digits=decFloatDigits(dfr); // calculate digits |
| 3362 | |
| 3363 | #if DOUBLE |
| 3364 | if (digits>3) return decInvalid(result, set); // definitely out of range |
| 3365 | expr=DPD2BIN[DFWORD(dfr, 1)&0x3ff]; // must be in bottom declet |
| 3366 | #elif QUAD |
| 3367 | if (digits>5) return decInvalid(result, set); // definitely out of range |
| 3368 | expr=DPD2BIN[DFWORD(dfr, 3)&0x3ff] // in bottom 2 declets .. |
| 3369 | +DPD2BIN[(DFWORD(dfr, 3)>>10)&0x3ff]*1000; // .. |
| 3370 | #endif |
| 3371 | if (expr>SCALEBMAX) return decInvalid(result, set); // oops |
| 3372 | // [from now on no error possible] |
| 3373 | if (DFISINF(dfl)) return decInfinity(result, dfl); // canonical |
| 3374 | if (DFISSIGNED(dfr)) expr=-expr; |
| 3375 | // dfl is finite and expr is valid |
| 3376 | *result=*dfl; // copy to target |
| 3377 | return decFloatSetExponent(result, set, GETEXPUN(result)+expr); |
| 3378 | } // decFloatScaleB |
| 3379 | |
| 3380 | /* ------------------------------------------------------------------ */ |
| 3381 | /* decFloatShift -- shift the coefficient of a decFloat left or right */ |
nothing calls this directly
no test coverage detected