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

Dav*_*fer 5 floating-point prolog iso-prolog

我正在查看SICStus手册的语法描述,并且有一个"浮动"的定义.但是,没有迹象表明实际上"浮动"的实现是什么.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
Run Code Online (Sandbox Code Playgroud)

2.22e-16作为最后一个值,添加到1.0仍然产生比1.0IEEE 64位浮点算法更好的声音.

其他Prolog有什么实施方案?

fal*_*lse 7

SICStus 4.3.1 的文档内容如下:

浮动范围是由C double类型提供的,通常[4.9e-324, 1.8e+308](加或减).在溢出或除零的情况下,将引发评估错误异常.浮点数由64位表示,符合IEEE 754标准.

与ISO一致性声明一起,这不会留下任何开放性.请注意,单独使用"IEEE 754标准"没有任何进一步的限定,因为它可能意味着小型,小数和各种模式.此外,异常处理与持续值和其他建议使事情变得更加复杂,并非易事.

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的文件的意图.特别是,完全缺少IEEE异常标志(或相应的更好的范围功能),这使得NaN接下来无用.另外两个正确的代数完成不存在.(此外,该提案的日期为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兼容IEC/IEEE 60559:2011,vulgo IEEE 754-2008.

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

为了给您一个想法,如何在各种Prolog系统中实现浮点运算,请考虑目标

X is 0** -1, write_canonical(X).
Run Code Online (Sandbox Code Playgroud)

应该产生一个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语法的含义.

  • @DavidTonhofer:至于SICStus,目前的手册来自[Quintus](https://quintus.sics.se/isl/quintus/html/quintus/ref-ari-ove.html#ref-ari-ove),在[4.0](https://sicstus.sics.se/sicstus/docs/4.0.0/html/sicstus/ref_002dari_002dove.html#ref_002dari_002dove)与SICStus合并.但似乎这个公式从[3.12](https://sicstus.sics.se/sicstus/docs/3.12.11/html/sicstus/Arithmetic.html#Arithmetic)中幸存下来.听起来有点像:如果你的平台支持不同的`double`类型,我们不会模仿IEEE,而只是坚持我们到达那里. (2认同)
  • @DavidTonhofer:你最近看过[unums](http://en.wikipedia.org/wiki/Unum_%28number_format%29)吗? (2认同)