floating-point - “float”对Prolog的实现意味着什么?

标签 floating-point prolog iso-prolog

我浏览了SICStus手册的语法说明,并且有一个“float”的定义。但是,没有迹象表明“float”的实现实际上是什么。 IEEE single or double precision?也许甚至是BigDecimal

在SWI Prolog中(或至少为SWISH),“浮点数”似乎是IEEE的 double ,可以通过以下方式确定:

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中的最后一个值,对于IEEE 64位浮点算术来说,它仍然比1.0听起来要正确。

其他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.

最佳答案

SICStus的文档4.3.1 reads:

The range of floats is the one provided by the C double type, typically [4.9e-324, 1.8e+308] (plus or minus). In case of overflow or division by zero, an evaluation error exception will be raised. Floats are represented by 64 bits and they conform to the IEEE 754 standard.



与ISO一致性声明一起,这没有任何问题。请注意,仅“IEEE 754标准”没有任何进一步的限定并不能说太多,因为它可能表示小数,小数和各种模式。同样,exception handling与延续值以及other recommendations使事情变得更加复杂,绝非易事。

在所有情况下,ISO Prolog标准都要求产生Prolog异常(exception)(IEEE措辞中的“陷阱”)。没有提供连续值,例如NaN,+∞等。乍看之下,这表明这些值与ISO Prolog完全不兼容。但是,第5.5节定义了对该标准的可能扩展。尤其是以下条款允许引入连续值。

5.5.10 Evaluable functors

A processor may support one or more additional evaluable
functors (9) as an implementation specific feature. A
processor may support the value of an expression being a
value of an additional type instead of an exceptional value.

NOTE - A program that makes no use of extensions should
not rely on catching errors from procedures that evaluate their
arguments (such as is/2, 8.6.1) unless it is executed in strictly
conforming mode (5.1 e).



该注释揭示了其背后的意图:在严格遵循的模式下,所有这些扩展都不存在,仅发出Prolog异常信号。到目前为止,扩展的外观应如何精确尚不清楚。 @jschimpf的建议包含一些有趣的观点,但是没有考虑William Kahan's documents的意图。特别是,IEEE-exception-flags完全丢失(或相应的更好的作用域功能),这使得NaN几乎无用。其他两个适当的代数补全不存在。 (此外,that proposal的日期为2009年,尚未考虑到Cor.2:2012。)

ISO Prolog仅提供了一个浮点框架(请参阅ISO/IEC 13211-1:1995 7.1.3浮点),二进制,十进制甚至任何正偶数基数(基数)都适用。在1980年代,某些系统(例如C-Prolog)过去使用的浮标的精度要比单精度IEEE浮标的精度低一点。 Prolog标记和浮点数均以32位压缩(尾数较小),而实际计算以C缺省值( double )(旧有效,不再有效)进行。我相信这种表示形式也适用于ISO。 ISO Prolog至少需要6个十进制数字。但是,我不知道当前系统使用的是二进制IEEE double 以外的任何其他功能。

ISO Prolog中的浮点数基本上基于ISO LIA标准(“独立于语言的算法”)ISO/IEC 10967-1:1995,同时它已由与ISO/IEC/IEEE 60559:2011,vulgo IEEE 754-2008兼容的ISO/IEC 10967-1:2012取代。

请注意,IEEE和LIA具有不同的用途:IEEE是关于浮点数的,只有几个函数,而LIA也包括更多的函数,整数算术和复数。

为了给您一个想法,当前在各种Prolog系统中如何实现浮点运算,请考虑目标
X is 0** -1, write_canonical(X).

应该产生一个evaluation_error(undefined)。符合三个系统(IF,SICStus,Prolog IV),除两个系统外,其他所有系统均不同。

0, (+inf), Infinity.0, inf.0, 0.Inf, inf, inf



分别由

SWI, YAP, Minerva, XSB, Ciao, B, GNU



由于所有这些输出均构成有效的Prolog文本(某些输出需要中缀.),因此它们都是无效的扩展名,因为它们重新定义了现有Prolog语法的含义。

关于floating-point - “float”对Prolog的实现意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27647635/

相关文章:

javascript - float 到字符串的转换 - JS

c - 如何获得最大精度 float 据类型的实现及其printf说明符?

返回 prolog-false 而不是数字

prolog - 两种变体实现之间的差异

java - 原生 Float.floatToRawIntBits(float value) 的输出是什么?

用于浮点和整数验证的 JavaScript

recursion - 达到基本情况后无法从 Prolog 中的递归中获取结果

list - 如何对 Prolog 列表的元素执行算术运算

prolog - 序言中没有标题的子句是什么意思?

prolog - 两个变量集的并集