为什么我在这个例子中得到“没有可显示的有效数字”?

时间:2011-12-25 10:10:01

标签: wolfram-mathematica

V 8.0.4,Windows 7。

正如我试图看看我是否可以获得更快的计算,如果我可以让M在硬件单精度运行(我不知道即使这是可能的,我也在尝试)我注意到AbsoluteTiming只返回0当我碰巧使精确度小于两倍但优于单身时,计时Pause

以下是一个例子:

我重新启动内核,然后输入

r=AbsoluteTiming[Pause[2]]
{2.00111440000,Null}

Accuracy[r]

Out[26]= 11.438897913739035

现在我将M设置为加倍

 $MinPrecision=$MachinePrecision;
 $MaxPrecision=$MachinePrecision;
 r=AbsoluteTiming[Pause[2]]

 Out[32]= {2.001114400000000,Null}

 Accuracy[r]
 Out[33]= 15.653317853034773

没问题。

但是当我做的时候

 prec=Log[10,2]*29;
 $MaxPrecision=prec;
 $MinPrecision=prec;

 r=AbsoluteTiming[Pause[2]]

 Out[41]= {0.,Null}

你看,它是零。

 Accuracy[r]
 Out[42]= 307.6526555685888

但是我一直试着看看它从零到零翻转的实际秒数,并在一次尝试中得到了这个

enter image description here

我知道M在内部使用任意精确数字:

http://reference.wolfram.com/mathematica/tutorial/ArbitraryPrecisionNumbers.html

从上面的链接中可以看出:

In doing calculations that degrade precision, it is possible 
to end up with numbers that have no significant digits at all

我的问题是:有人可以在这个例子中解释这种行为吗?为什么仅测量Pause[]的时序需要比单精度更精确?计算究竟涉及至少需要双倍来衡量AbsoluteTime?帮助说:

AbsoluteTiming is always accurate down to a granularity of $TimeUnit 
seconds, but on many systems is much more accurate.

In[22]:= $TimeUnit//N
Out[22]= 0.001

实际上我的主要目的只是为了看看我是否可以使用硬件单精度浮点运行M计算,只是为了看它是否会运行得更快。我在一本书中读到,单个Precision的速度可以是double的2倍,并且只是在我注意到这一点时尝试测试它。

我目前在顶部使用以下内容运行所有内容

$MinPrecision = $MachinePrecision;
$MaxPrecision = $MachinePrecision;

因此M使用硬件双运行。

谢谢, PS。我之前检查过这个控制台,我看到没有语法错误。

1 个答案:

答案 0 :(得分:1)

首先,我认为设置$MaxPrecision和/或$MachinePrecision不会产生您想要的效果。这是一个例子。

$MaxPrecision = $MinPrecision = $MachinePrecision;
result1 = Nest[4 # (1 - #) &, 0.123, 10^6]; // Timing
result2 = Nest[4 # (1 - #) &, SetPrecision[0.123, 
   $MinPrecision], 10^6]; // Timing

在我的机器上,第一次计算需要8个星期一秒,而第二次计算需要将近3秒钟。实际情况是,第一次计算是在机器算术中完成的,而第二次是在软件算术中完成的,恰好具有相同的数值精度。

我认为在Mathematica 8中强制机器算术的最简单方法是使用Compile并将"CatchMachineOverflow""CatchMachineUnderflow"设置为False;或者更好,只需将"RuntimeOptions"设置为"Speed"

此外,我认为你的AbsoluteTiming命令得到0的原因是你将精度设置得太低而不能代表结果。