MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / decFloatScaleB

Function decFloatScaleB

extern/decNumber/decBasic.c:3353–3378  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3351/* ------------------------------------------------------------------ */
3352#define SCALEBMAX 2*(DECEMAX+DECPMAX) // D=800, Q=12356
3353decFloat * 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 */

Callers

nothing calls this directly

Calls 5

decInvalidFunction · 0.85
decFloatDigitsFunction · 0.85
decInfinityFunction · 0.85
decFloatSetExponentFunction · 0.85
decNaNsFunction · 0.70

Tested by

no test coverage detected