公告:1)网站程序升级:Q2A升级到1.8.6,Wordpress升级到5.7.2
2)修复了头像加载慢与提交问题反应慢等问题
2021-06-16

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

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

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

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

社区建议QQ群:365716997

分类

0 投票
533 浏览
f1[\[Tau]_] := Function[t, Exp[-2 Log[2] ((t - 2 \[Tau])/\[Tau])^2]]

f2 := Compile[{{\[Tau], _Real}, {t, _Real}}, 
  Exp[-2 Log[2] ((t - 2 \[Tau])/\[Tau])^2]]
In[54]:= Do[f2[100., i], {i, 1., 100000., 1}] // AbsoluteTiming
Do[f1[100.][i], {i, 1., 100000., 1}] // AbsoluteTiming

Out[54]= {6.14074, Null}

Out[55]= {1.64779, Null}

问题1:为什么编译函数的话不能使用延迟定义,我试过了,不用延迟定义,计算速度会快,我的理解是因为如果用延迟定义,那么在每次计算的时候,都会去编译函数,所以计算速度会很慢。

f1[\[Tau]_] := Function[t, Exp[-2 Log[2] ((t - 2 \[Tau])/\[Tau])^2]]
f2 = Compile[{{\[Tau], _Real}, {t, _Real}}, 
  Exp[-2 Log[2] ((t - 2 \[Tau])/\[Tau])^2]]
In[62]:= Do[f2[100., i], {i, 1., 100000., 1}] // AbsoluteTiming
Do[f1[100.][i], {i, 1., 100000., 1}] // AbsoluteTiming

Out[62]= {0.0964466, Null}

Out[63]= {1.59263, Null}
In[64]:= f2[100., 1000000.] // AbsoluteTiming
f1[100.][1000000.] // AbsoluteTiming

Out[64]= {0.0000199563, 0.}

Out[65]= {0.000075834, 7.221326*10^-60181920}
In[70]:= N /@ f2[100., 1000000.] // AbsoluteTiming
N /@ f1[100.][1000000.] // AbsoluteTiming

Out[70]= {0.0000228072, 0.}

Out[71]= {0.000066141, 7.221326*10^-60181920}

使用非延迟定义编译函数,运算速度提高了,但是在结果显示上面和function定义的稍微有点不同,虽然function定义的函数所得到的结果近似也是零,我该怎么调整,才能让编译函数得到和function定义函数所得到的结果相同

用户: 落雨流觞 (1.0k 分)

1个回答

+1 投票
第一个问题你的理解是对的,延迟赋值定义每次调用时都会计算,而编译本身会消耗一定时间,所以这里应该用直接赋值

第二个问题的答案是不可能,因为编译后是用浮点数计算,而机器能表示的最小浮点数是$MinMachineNumber,在64位系统上一般是2.22507*10^-308,绝对值小于$MinMachineNumber的数全部会表示成0.
用户: 无影东瓜 (1.2k 分)
那为什么Out[71]的结果可以这样表示,这是我的疑问。
...