1:- module(ieee_754, [ieee_754_float/3]). 2 3:- use_module(library(clpfd)). 4 5:- use_module(library(canny/maths)). 6:- use_module(library(canny/bits)).
Supports binary formats only. Does not support decimal formats.
16ieee(16, 5, 15). 17ieee(32, 8, 127). 18ieee(64, 11, 1023). 19ieee(128, 15, 16383). 20ieee(256, 19, 262143).
28inf(Bits, Inf) :-
29 ieee(Bits, ExpBits, _),
30 Inf is ((1 << ExpBits) - 1) << (Bits - ExpBits - 1).
Not designed for performance. Uses CLP(FD) for bit manipulation. and hence remains within the integer domain. Float arithmetic applies outside the finite-domain constraints.
51ieee_754_float(Bits, Word, Float) :- 52 var(Float), 53 !, 54 sig_exp(Bits, Word, Sig, Exp), 55 ldexp(Sig, Float, Exp). 56ieee_754_float(Bits, 0, 0.0) :- ieee(Bits, _, _), !. 57ieee_754_float(Bits, Inf, +1.0Inf) :- !, inf(Bits, Inf). 58ieee_754_float(Bits, Inf, -1.0Inf) :- 59 !, 60 inf(Bits, Inf0), 61 Inf is 1 << (Bits - 1) \/ Inf0. 62ieee_754_float(Bits, NaN, 1.5NaN) :- 63 !, 64 inf(Bits, Inf0), 65 ieee(Bits, ExpBits, _), 66 NaN is Inf0 \/ (1 << (Bits - ExpBits - 2)). 67ieee_754_float(Bits, Word, Float) :- 68 frexp(Float, Sig, Exp), 69 sig_exp(Bits, Word, Sig * 2, Exp - 1). 70 71sig_exp(Bits, Word, Sig, Exp) :- 72 ieee(Bits, ExpBits, ExpBias), 73 SigBits is Bits - ExpBits - 1, 74 bits(Bits - 1, 1, Word, Sign, Word1), 75 bits(0, SigBits, Word1, Word0, Word2), 76 bits(SigBits, ExpBits, Word2, Exp0, 0), 77 Exp #= Exp0 - ExpBias, 78 sig(Sign, Word0, 1 << SigBits, Sig). 79 80sig(Sign, Word, Max, Sig) :- var(Sig), !, ieee_sig(Sign, Word, Max, Sig). 81sig(Sign, Word, Max, Sig) :- sig_ieee(Sign, Sig, Max, Word). 82 83ieee_sig(0, Word, Max, Sig) :- ieee_sig(Word, Max, Sig), !. 84ieee_sig(1, Word, Max, Sig) :- ieee_sig(Word, Max, Sig0), Sig is -Sig0. 85 86ieee_sig(Word, Max, Sig) :- Sig is Word / Max + 1. 87 88sig_ieee(1, Sig, Max, Word) :- sign(Sig) < 0, !, sig_ieee(-Sig, Max, Word). 89sig_ieee(0, Sig, Max, Word) :- sig_ieee(Sig, Max, Word). 90 91sig_ieee(Sig, Max, Word) :- Word is round((Sig - 1) * Max)