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有什么实施方案?
浮动范围是由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语法的含义.