公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

+1 投票
3.5k 浏览
Which[
 z <= 0, a^z - 2,
 0 < z <= 1, z - 1,
 z > 1, Block[{i = -1}, 
  NestWhile[Log[a, #] &, z, (i++; # > 1) &] - 1 + i]]

 

主要问题就是在NestWhile上面...不知道是用Nest-While-Break好,还是Nest-Which-Catch&Throw好

分类:函数 | 用户: EmberEdison (806 分)
你说a是复数?那这个问题本身就错了,NestWhile停止条件是个不等式,可是复数要怎么比大小?
不是#>1么?最少 8 个字符
所以说停止条件是个不等式,你要怎么让一个复数和实数比大小?
应该是算法有毒吧,我查查
是算法有毒,实际上这个算法只能用在实数域上

1个回答

+2 投票
 
已采纳

“主要问题就是在NestWhile上面”……你哪来的自信啊?我们把这一块去掉看看:

cf = Compile[{a, z}, 
  Which[z <= 0, a^z - 2, 0 < z <= 1, z - 1(*,z>1,Block[{i=-1},NestWhile[Log[a,#]&,
   z,(i++;#>1)&]-1+i]*)]]

CompilePrint@cf
(*照样MainEvaluate*)

于是乎为什么会这样呢?在这篇教程的规则四里我已经提到了,Compile内的变量类型不能中途改变,并且在很多情况下,Compile的某些看似古怪的行为骨子里都和这有关,而这里Which的失效就属于这种情况。我们回忆一下Which的语法,如果Which内的全体条件都不能返回True,它的返回值是啥?0吗?不对,是Null。

这就导致了Which语句的返回值出现了不确定的情况(以你的例子而言,其他情况下Which的返回值的类型是Real),于是,编译失败。修改方法很简单,让全体返回值的类型一致就行了:

cf2 = Compile[{a, z}, 
  Which[z <= 0, a^z - 2, 0 < z <= 1, z - 1, z > 1, 
   Block[{i = -1}, NestWhile[Log[a, #] &, z, (i++; # > 1) &] - 1 + i], True, 0.]]

 

这个问题还可以参看这帖

用户: xzczd (2.2k 分)
采纳于 用户:EmberEdison
我还以为是NestWhile不在可编译列表中的缘故。
...