/** * float/1 emulator. * * Warranty & Liability * To the extent permitted by applicable law and unless explicitly * otherwise agreed upon, XLOG Technologies AG make_bdds no warranties * regarding the provided information. XLOG Technologies AG assumes * no liability that any problems might be solved with the information * provided by XLOG Technologies AG. * * Rights & License * All industrial property rights regarding the information - copyright * and patent rights in particular - are the sole property of XLOG * Technologies AG. If the company was not the originator of some * excerpts, XLOG Technologies AG has at least obtained the right to * reproduce, change and translate the information. * * Reproduction is restricted to the whole unaltered document. Reproduction * of the information is only allowed for non-commercial uses. Selling, * giving away or letting of the execution of the library is prohibited. * The library can be distributed as part of your applications and libraries * for execution provided this comment remains unchanged. * * Restrictions * Only to be distributed with programs that add significant and primary * functionality to the library. Not to be distributed with additional * software intended to replace any components of the library. * * Trademarks * Jekejeke is a registered trademark of XLOG Technologies AG. */ /** * float_half_even(X, Y): * Succeeds in Y with float(X) using rounding mode HALF_EVEN. */ % float_half_even(+Integer, -Float) float_half_even(X, Y) :- X < 0, !, H is -X, M is msb(H), float_half_even(M, H, J), Y is -J. float_half_even(X, Y) :- M is msb(X), float_half_even(M, X, Y). float_half_even(M, X,Y) :- (M < 53; getbit(X, M-53) =:= 0; getbit(X, M-52) =:= 0, M-53 =:= lsb(X)), !, mpz_get_d(X,Y). float_half_even(_, X,Y) :- mpz_get_d(X,H), Y is nexttoward(H, 1E300). /** * mpz_get(X, Y): * Succeeds in Y with float(X) using rounding mode DOWN. */ % mpz_get_d(+Integer, -Float) mpz_get_d(X, Y) :- M is msb(X), mpz_get_d(M, X, Y). % mpz_get_d(+Integer, +Integer, -Float) mpz_get_d(M, X, Y) :- M < 53, !, Y is float(X). mpz_get_d(M, X, Y) :- K is M-52, Y is float(X>>K)*(1<