我正在查看 SICStus 手册的语法描述,并且有一个“float”的定义。但是,没有迹象表明“浮动”的实际实现是什么。IEEE 单精度还是双精度?甚至可能是一个BigDecimal
?
在 SWI Prolog (或至少SWISH)中,“浮点数”似乎是 IEEE 双精度,可以通过以下方式确定:
planck_float(P) :-
planck_float_descent(1.0,P).
planck_float_descent(X,P) :-
Xhalf is X / 2.0, Xtest is 1.0 + Xhalf, Xtest =\= 1.0, !,
write(Xhalf),writeln(Xtest),
planck_float_descent(Xhalf,P).
planck_float_descent(P,P) :-
Xhalf is P / 2.0, Xtest is 1.0 + Xhalf, Xtest == 1.0,
writeln(P).
?- planck_float(P).
P = 2.220446049250313e-16
2.22e-16
作为最后一个值,添加后1.0
仍然会产生比1.0
IEEE 64 位浮点运算正确的声音更大的值。
其他 Prolog 有什么实现?
多年后更新
更好的代码:
efloat(C,E) :-
Cf is 1.0 * C, float(Cf),
erecur(Cf,1.0,E).
erecur(C,X,E) :-
Xhalf is X / 2.0,
Xtest is C + Xhalf, Xtest \= C, !,
format("~e/2.0 = ~20f\n",[Xhalf,Xtest]),
erecur(C,Xhalf,E).
erecur(C,X,X) :-
Xhalf is X / 2.0,
Xtest is C + Xhalf,
Xtest = C,
format("~e",[X]).
然后:
?- efloat(1,X).
X = 2.220446049250313e-16.