2011-12-25 79 views
1

V 8.0.4,windows 7.为什么我在这个例子中得到“没有显示数字可用”?

正如我想看看如果我可以得到更快的计算,如果我可以得到M硬件单精度运行(我不知道即使这是可能的,我是尝试新事物),我注意到,AbsoluteTiming只是时机的Pause时,我碰巧做出精密的两倍少一点返回0,但优于单:

下面是一个例子:

我重新启动的内核,并类型

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运行使用硬件双顶部

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

以下的一切。

谢谢, ps。我之前检查过这个控制台,我发现没有语法错误。

+0

好问题,我也得到同样的行为。可悲的是我无法提供明智的解释。虽然你的问题似乎很好。 – nixeagle 2011-12-25 15:03:21

+2

你说:“我知道M使用任意精度数内部”。这通常不是事实。如果您输入的数字如1.0 mma将使用精度未跟踪的机器精度数字。 – 2011-12-25 16:59:59

回答

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个hundreths第二,而第二运算需要近三秒。现实情况是,第一次计算是在机器算法中完成的,而第二次是在软件算术中完成的,这恰好具有相同的数值精度。

我认为,最简单的方法来强制机器算术数学8是使用Compile"CatchMachineOverflow""CatchMachineUnderflow"设置为False;或更好,但只需将"RuntimeOptions"设置为"Speed"即可。

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

+0

主要的原因,我把'$ MaxPrecision = $ MinPrecision = $ MachinePrecision;'在我的手机的顶部是不是真的表现(但如果性能恰好是我做的更好,我不是在抱怨),或使M在HW中运行(我不知道它是否在我这样做时)。但是,只有这样我得到相同的数值,以便能够当我在双运行的Fortran或Matlab相同的计算/算法来比较的结果。这样,我在看的浮动与具有相同精度消除调查一个变量产生的点数。 – Nasser 2011-12-25 20:28:38