首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何强迫J给出错误而不是错误地返回无穷大?

如何强迫J给出错误而不是错误地返回无穷大?
EN

Stack Overflow用户
提问于 2015-03-08 23:36:13
回答 3查看 110关注 0票数 2

如果您指示J在默认精度名词上计算一个大的结果,那么您很快就会遇到这样的情况,即结果是无穷大的_。这是令人不快的,因为无穷大在数学上意味着什么。

当超过标准精度时,我如何指示J给出错误而不是无穷大?我可以在我的J安装中设置这一默认设置吗?

例如:

代码语言:javascript
复制
   !1000x  NB. Extended precision gives large finite result.
4023872600770937735437024339230039857193748642107146325437999104299385123986290205920442084869694048004799886101971960586316668729948085589013238296699445909974245040870737599188236277271887325197795059509952761208749754624970436014182780946464962910563938...

   !1000  NB. Default precision claims infinity. I'd generally prefer an error.
_
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-09 15:46:57

要完成您想要做的事情,最简单的方法是用assert.重新定义每个您想要使用这个行为的原语。这可能会对性能产生影响。

代码语言:javascript
复制
   SafeFactorial =: 3 : 0
p =. ! y
assert. p < _
assert. p > __
p
)
   SafeFactorial 5
120
   SafeFactorial 50
3.04141e64
   SafeFactorial 500
|assertion failure: SafeFactorial
|   p<_

评论中有一个重要的警告:

J是一种面向数组的语言,它是一种罕见的情况,在这种情况下,只对单个数字进行操作。通常,阶乘之类的函数的输入是多个数字的数组,所以如果您设计一个函数来抛出这样的错误,它将完全阻止您获得任何结果,甚至如果一个原子是坏的,结果也是正确的。

换句话说,当对数组进行操作时,无限结果通常是一种理想的行为。在引入额外的故障点之前,您应该仔细考虑。

票数 3
EN

Stack Overflow用户

发布于 2015-03-10 09:46:33

我的目标是得到数学上正确的结果。我突然得出结论,我应该尽早失败,而不是像在Java中那样给出不正确的结果。我所要求的都是戴恩和埃尔斯韦克斯所涵盖的,他们应该得到所有的赞扬。

不过,有些观察可能有助于其他人进入J思维:

首先,我已经知道了扩展的精度文本,并意识到动词x:将整数转换为扩展精度。如果我想要数学上正确的结果,在默认情况下,我应该养成使用这些东西的习惯。

其次,我已经观察到动词,如并元i.,它返回超大型的结果而不是失败。这在J中很常见,我应该学会过滤我不想要的结果,而不是让我的程序总是出错。

票数 4
EN

Stack Overflow用户

发布于 2015-03-09 01:06:45

这可能不完全符合您的要求,因为它使用外接8!:0格式将无穷大更改为您想要的任何内容(包括“错误”)。当然,它看起来只是一个错误;它真正要做的是用'_'替换'error',所以它可能不是您想要的。结果也是盒式字符串,可能不适合您的约束。

代码语言:javascript
复制
   inf=: 'd<error>'&(8!:0)
   % i.6
_ 1 0.5 0.333333 0.25 0.2
   inf % i.6
┌─────┬───────────┬───────────┬───────────┬───────────┬───────────┐
│error│1.000000000│0.500000000│0.333333333│0.250000000│0.200000000│
└─────┴───────────┴───────────┴───────────┴───────────┴───────────┘

更多信息可以在J字典的8!:条目中找到外国连词。http://www.jsoftware.com/help/dictionary/dx008.htm

由于您的注释表明您确实想要触发错误,所以可以使用断言。关键字,用于在显示前测试“_”的结果,但它是以动词为基础的,并且没有我所知道的全局设置。

代码语言:javascript
复制
   9!:35 [ 1 NB. to set the assert. flag on
   test =: 3 : 0
​assert. _~:%y  NB. to see if _ shows up in the result of %y
​%y
​)
   test 1 + i.5
1 0.5 0.333333 0.25 0.2
   test  i.5
|assertion failure: test
|   _~:%y
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28933201

复制
相关文章

相似问题

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