首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ISO-Prolog中变性浮标的正确处理

ISO-Prolog中变性浮标的正确处理
EN

Stack Overflow用户
提问于 2020-08-09 10:58:34
回答 2查看 168关注 0票数 3

极光浮标是很特别的:

ISO-Prolog标准对如何处理这些问题有什么规定?

在我看来,每当出现这些异常时都会引发evaluation_error(underflow)异常,这是处理这些异常的正确方法,但这会带来额外的成本--必须检查每个产生的浮点数。

但是,如何处理许多处理器提供的“将取消正态转换为零”(FTZ)和“将取消正态作为零”(DAZ)操作模式?Prolog实现可以使用这些工具吗?如果可以的话,它们如何正确地实现这些功能?

(1)记录这些操作模式的使用情况,(2)确保取消正常值被刷新到相同符号(FTZ)的零,以及(3)确保取消正常值被视为相同符号(DAZ)的零?救命啊!

EN

回答 2

Stack Overflow用户

发布于 2020-09-03 22:23:08

在第7.1.3节中,ISO标准将set F定义为您选择的浮点格式可以表示的数字集。此集合可能包含也可能不包含非规范化值,这两种选择都是允许的。

当计算结果(绝对)大于零而小于最小归一化值时,您可以选择

  • 舍入到一个以F表示的值
  • 引发底流异常

根据9.1.4.2节,这一选择是定义的实现,即您必须记录它。

票数 2
EN

Stack Overflow用户

发布于 2021-04-03 22:10:44

这是一个很小的测试用例,可以查看Prolog系统是否可以返回算术结果(不刷新到零,~FTZ):

代码语言:javascript
复制
/* 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):

代码语言:javascript
复制
/* 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年。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63325437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档