Wolfram mathematica 为什么我会得到;没有可用于显示的有效数字";在这个例子中?

Wolfram mathematica 为什么我会得到;没有可用于显示的有效数字";在这个例子中?,wolfram-mathematica,Wolfram Mathematica,V8.0.4,Windows7 当我试着看看如果我能让M以硬件单精度运行,我是否能获得更快的计算速度(我不知道这是否可能,我正在尝试一些事情),我注意到AbsoluteTiming仅为计时a暂停返回0,当我碰巧使精度略低于两倍,但优于单精度时: 以下是一个例子: 我重新启动内核,然后键入 r=AbsoluteTiming[Pause[2]] {2.00111440000,Null} Accuracy[r] Out[26]= 11.438897913739035 现在我把M设为双倍 $Mi

V8.0.4,Windows7

当我试着看看如果我能让M以硬件单精度运行,我是否能获得更快的计算速度(我不知道这是否可能,我正在尝试一些事情),我注意到AbsoluteTiming仅为计时a
暂停返回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
但我一直想知道它从零到返回实际秒的确切位置,在一次尝试中得到了这个结果

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

从上面的链接可以看出:

In doing calculations that degrade precision, it is possible 
to end up with numbers that have no significant digits at all
我的问题是:有人能在这个例子中解释这种行为吗?为什么仅仅测量一次
暂停[]
的计时需要比单个精度更高的精度?具体涉及哪些计算,需要至少两倍的时间来测量
绝对时间
?帮助说明:

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

实际上,我的主要目的只是想看看我是否能让M使用硬件单精度浮点运算,看看它是否能运行得更快。我在一本书中读到,单精度可以是双精度的2倍,当我注意到这一点时,我正试图用我的一些东西来测试这一点

我目前运行的所有程序都在顶部

$MinPrecision = $MachinePrecision;
$MaxPrecision = $MachinePrecision;
因此,M使用双硬件运行

谢谢,
另外,这次我检查了控制台,没有发现语法错误。

首先,我认为设置
$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
在我的机器上,第一次计算需要百分之八秒,而第二次计算需要将近三秒。实际情况是,第一次计算是在机器算法中完成的,而第二次是在软件算法中完成的,这恰好具有相同的数值精度

我认为在Mathematica 8中强制机器算法的最简单方法是使用
编译
,将
的“CatchMachineOverflow”和
的“CatchMachineUnderflow”设置为
False
;或者更好的方法是将
“RuntimeOptions”
设置为
“Speed”


另外,我认为您的
绝对计时
命令得到0的原因是您将精度设置得太低,无法表示结果。

首先,我认为设置
$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
在我的机器上,第一次计算需要百分之八秒,而第二次计算需要将近三秒。实际情况是,第一次计算是在机器算法中完成的,而第二次是在软件算法中完成的,这恰好具有相同的数值精度

我认为在Mathematica 8中强制机器算法的最简单方法是使用
编译
,将
的“CatchMachineOverflow”和
的“CatchMachineUnderflow”设置为
False
;或者更好的方法是将
“RuntimeOptions”
设置为
“Speed”


另外,我认为您的
绝对计时
命令得到0的原因是您将精度设置得太低,无法表示结果。

好问题,我在这里也得到了相同的行为。遗憾的是,我不能提供一个合理的解释。你的问题似乎问得很好,你说“我知道M在内部使用任意精度的数字”。这通常不是真的。如果你输入像1.0这样的数字,mma将使用精度不被跟踪的机器精度数字。好问题,我在这里也得到同样的行为。遗憾的是,我不能提供一个合理的解释。你的问题似乎问得很好,你说“我知道M在内部使用任意精度的数字”。这通常不是真的。如果您输入1.0之类的数字,mma将使用精度未跟踪的机器精度数字实际上不是为了性能(但如果我这样做时性能恰好更好,我不是在抱怨),也不是为了让M在HW浮动中运行(我不知道我这样做时是否会这样)。但只有这样,当我在Fortran或Matlab中使用double运行相同的计算/算法时,才能得到相同的数值,以便能够比较结果。通过这种方式,我看到了以相同精度生成的浮点数,从调查中消除了一个变量实际上不是为了性能(但如果我这样做时性能恰好更好,我不是在抱怨),也不是为了让M在HW浮动中运行(我不知道我这样做时是否会这样)。但只有这样,当我在Fortran或Matlab中使用double运行相同的计算/算法时,才能得到相同的数值,以便能够比较结果。通过这种方式,我看到了以相同精度生成的浮点数,从调查中消除了一个变量。