Prolog实现对“浮动”意味着什么?

时间:2014-12-25 13:30:12

标签: floating-point prolog iso-prolog

我正在查看SICStus手册的语法描述,并且有#34; float"的定义。但是,没有迹象表明" float"的执行情况。实际上是。 IEEE single or double precision?甚至可能是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有哪些实施方案?

3 个答案:

答案 0 :(得分:7)

SICStus的文档4.3.1 reads

  

浮点数的范围是C double类型提供的浮点数,   通常[4.9e-324, 1.8e+308](加或减)。如果溢出或   除以零,将引发评估错误异常。花车   由64位表示,它们符合IEEE 754标准。

与ISO一致性声明一起,这不会留下任何开放性。请注意,单独使用“IEEE 754标准”没有任何进一步的限定,因为它可能意味着小型,小数和各种模式。此外,exception handling vs继续值和other recommendations使事情变得更加复杂,并非易事。

ISO Prolog标准要求在所有情况下产生Prolog异常(IEEE术语中的“陷阱”)。没有提供连续值,如NaN,+∞等。在粗略的视线中,这表明这些值与ISO Prolog完全不相容。但是,子条款5.5定义了标准的可能扩展。特别是以下子条款允许引入连续值。

  

5.5.10可评估的仿函数

     

处理器可以支持一个或多个其他可评估的仿函数   (9)作为实现特定功能。处理器可以支持   表达式的值是附加类型的值   而不是特殊的价值。

     

注意 - 不使用扩展程序的程序应该不依赖   从评估其论点的程序中捕获错误   (例如is / 2,8.6.1)除非严格执行   模式(5.1 e)。

本说明揭示了背后的意图:在严格符合模式下,所有这些扩展都不存在,只有Prolog-exceptions被发出信号。扩展应该如何精确到目前为止还不清楚。 @jschimpf的提议包含一些有趣的观点,但没有考虑William Kahan's documents的意图。特别是,完全缺少IEEE异常标志(或相应的更好的范围功能),这使得NaN接下来无用。另外两个正确的代数完成不存在。 (此外,that proposal的日期是2009年,并未考虑到Cor.2:2012。)

ISO Prolog只提供浮点框架(参见ISO / IEC 13211-1:1995 7.1.3浮点),二进制,十进制甚至任何正偶数基数(基数)都适合。在20世纪80年代,一些系统(例如,C-Prolog)过去的浮点数精度略低于单精度IEEE浮点数。在32位中,Prolog标签和浮动都被挤压(具有较小的尾数),而实际计算以双精度执行,好的olde,不再有效,C默认。我相信这种表述也适用于ISO。 ISO Prolog至少需要6个十进制数字。但是,我不知道当前系统使用除二进制IEEE双精度之外的任何其他系统。

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

请注意,IEEE和LIA用于不同的目的:IEEE是浮点数,只有少数函数,而LIA包含更多函数,整数算术和复数。

为了让您了解如何在各种Prolog系统中实现浮点运算,请考虑目标

X is 0** -1, write_canonical(X).

应生成evaluation_error(undefined)。三个系统符合(IF,SICStus,Prolog IV),除了两个系统外,其他系统都不同。

  

0(+inf)Infinity.0inf.00.Infinfinf

分别由

制作
  

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

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

答案 1 :(得分:2)

您所说的planck_float通常称为epsilon。许多Prolog系统对此值都有一个常数,因此不需要计算。

在N208中建议使用常量。

  

9.7.3.1说明epsilon评估为
  1.0到下一个最大浮点的距离
  数字,实现定义的值。
  https://www.complang.tuwien.ac.at/ulrich/iso-prolog/N208

许多Prolog系统都支持此常量,该常量可以告诉您默认的float类型是什么意思。例如,GNU Prolog给我:

GNU Prolog 1.4.5 (64 bits)
| ?- X is epsilon.
X = 2.2204460492503131e-016

这并不意味着Prolog系统只能具有一种float数据类型。 Prolog系统也可能支持多种浮点类型。例如,在Jekejeke Prolog中,可以使用由前缀0f表示的32位浮点数:

Jekejeke Prolog 3, Runtime Library 1.3.6
?- X is epsilon.
X = 2.220446049250313E-16
?- X is epsilon32.
X = 0f1.1920929E-7

答案 2 :(得分:1)

实际上,在Prolog中还有更多关于浮动的说法。 根据ISO核心标准,第7.1.3节浮点, 内部表示可以使用不同的基数。

因此Prolog系统可以使用radix = 2或radix = 10。那里 只是一个限制,Prolog系统应该允许 至少6位数的精度。在7.1.3浮点数中,我们发现:

r^p-1 >= 10^6

r是基数,p是尾数的宽度。那里 是同一节中的其他约束。数字的整数部分和浮点部分的概念(不要与函数混淆)

不参考本节。它们引用6.1.2抽象术语ISO核心标准的语法中的外部十进制表示形式,该语法将基数固定为10。