我正在查看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有哪些实施方案?
答案 0 :(得分:7)
浮点数的范围是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.0
,inf.0
,0.Inf
,inf
,inf
分别由
制作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。