Wolfram mathematica 为什么我会得到;没有可用于显示的有效数字";在这个例子中?
V8.0.4,Windows7 当我试着看看如果我能让M以硬件单精度运行,我是否能获得更快的计算速度(我不知道这是否可能,我正在尝试一些事情),我注意到AbsoluteTiming仅为计时aWolfram 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
暂停返回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将使用精度未跟踪的机器精度数字我的单元格顶部的code>实际上不是为了性能(但如果我这样做时性能恰好更好,我不是在抱怨),也不是为了让M在HW浮动中运行(我不知道我这样做时是否会这样)。但只有这样,当我在Fortran或Matlab中使用double运行相同的计算/算法时,才能得到相同的数值,以便能够比较结果。通过这种方式,我看到了以相同精度生成的浮点数,从调查中消除了一个变量我的单元格顶部的code>实际上不是为了性能(但如果我这样做时性能恰好更好,我不是在抱怨),也不是为了让M在HW浮动中运行(我不知道我这样做时是否会这样)。但只有这样,当我在Fortran或Matlab中使用double运行相同的计算/算法时,才能得到相同的数值,以便能够比较结果。通过这种方式,我看到了以相同精度生成的浮点数,从调查中消除了一个变量。