极光浮标是很特别的:

ISO-Prolog标准对如何处理这些问题有什么规定?
在我看来,每当出现这些异常时都会引发evaluation_error(underflow)异常,这是处理这些异常的正确方法,但这会带来额外的成本--必须检查每个产生的浮点数。
但是,如何处理许多处理器提供的“将取消正态转换为零”(FTZ)和“将取消正态作为零”(DAZ)操作模式?Prolog实现可以使用这些工具吗?如果可以的话,它们如何正确地实现这些功能?
(1)记录这些操作模式的使用情况,(2)确保取消正常值被刷新到相同符号(FTZ)的零,以及(3)确保取消正常值被视为相同符号(DAZ)的零?救命啊!
发布于 2020-09-03 22:23:08
在第7.1.3节中,ISO标准将set F定义为您选择的浮点格式可以表示的数字集。此集合可能包含也可能不包含非规范化值,这两种选择都是允许的。
当计算结果(绝对)大于零而小于最小归一化值时,您可以选择
根据9.1.4.2节,这一选择是定义的实现,即您必须记录它。
发布于 2021-04-03 22:10:44
这是一个很小的测试用例,可以查看Prolog系统是否可以返回算术结果(不刷新到零,~FTZ):
/* SWI-Prolog */
?- X is 2.2250738585072011e-308 - 2.2250738585072012e-308.
X = -5.0e-324.
/* Jekejeke Prolog */
?- X is 2.2250738585072011e-308 - 2.2250738585072012e-308.
X = -4.9E-324这是API中的一个新添加,在Prolog系统中是不一样的,它显示了次范式的参数传递(没有非正态值-都是零,~DAZ):
/* SWI-Prolog */
?- X is 2.2250738585072011e-308 - 2.2250738585072012e-308,
float_parts(X,M,B,E).
X = -5.0e-324,
M = -0.5,
B = 2,
E = -1073.
/* Jekejeke Prolog */
?- X is 2.2250738585072011e-308 - 2.2250738585072012e-308,
sys_float_mantissa(X,M), sys_float_exponent(X,E), sys_float_radix(X,R).
X = -4.9E-324,
M = -1,
E = -1074,
R = 2调查结果来自MacBook航空公司2019年。
https://stackoverflow.com/questions/63325437
复制相似问题