罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

为多种数据类型编程

你如何在MATLAB中编写m文件,让它无论输入是双精度还是单精度都能正确工作?我所说的正确,是指程序给出的答案与输入的精度相适应。

内容

特殊常数和函数在MATLAB中帮助精度

MATLAB中有一些相当新的函数来帮助提高精度,并对现有函数进行了一些更新。让我首先列出一些“常数”,它们可能会对处理不同精度的数据感兴趣:

  • 每股收益
  • 0

文档中有几个地方也特别相关:

克里夫写了这篇文章1996年的《新闻与笔记》。

问题描述

让我们编写一个程序,根据输入以单精度或双精度计算结果。斐波纳契数是一组具有有趣特征的数字序列。当您在序列中计算更多的数字时,连续斐波那契数之间的比率接近黄金平均或黄金比例.换句话说,

我目前的网络搜索发现,黄金分割有4200万页,949万页——哇!

黄金分割

中庸之道可以表示为

它的双重精度值是多少?

格式GoldenMeanDouble =(1+√(5))/2
GoldenMeanDouble = 1.61803398874989

单精度呢?

GoldenMeanSingle =(1+根号(single(5)))/2
gold mean single = 1.6180340

我们应该计算多少个斐波那契项?

在斐波那契数列中,我们应该计算多少项,才能使连续项之间的比值不改变我们对黄金均值的估计,使其处于适当的精度范围内?首先,停下来并猜测双精度和单精度。让我们从double开始,使用上一篇博客中的过滤器代码来计算斐波那契数。

格式nf = 100;X = [1 0 (1,nf-1)];A = [1 -1 -1];B = 1;fifidouble = filter(b, a, x);

计算其中几个比率,并与黄金分割率进行比较。

RatioDouble = FibDouble(2:11)./FibDouble(1:10) . ResidualDouble = FibDouble(2:11)./FibDouble(1:10) - GoldenMeanDouble
RatioDouble =列1至6 1.0000 2.0000 1.5000 1.6667 1.6000 1.6250列7至10 1.6154 1.6190 1.6176 1.6182 ResidualDouble =列1至6 -0.6180 0.3820 -0.1180 0.0486 -0.0180 0.0070列7至10 -0.0026 0.0010 -0.0004 0.0001

计算术语数量

以下是实现双倍精度所需的术语数量。大多数人预计所需术语的数量会高得多。

numdouble = goldfidouble ResidDouble = FibDouble(numdouble)/FibDouble(numdouble-1) - goldmeandouble
numdouble = 41 ResidDouble = 0

双算法

让我们看一下算法。在这个m文件中,我不担心计算斐波那契数列的效率,但是

类型goldFibDouble
function nterms = goldFibDouble % goldFib达到黄金平均比率的斐波那契项数。Fcurrent = 1;Fnext = 1;goldenMean =(1+根号(5))/2;tol = eps(goldenMean);计算下一个最接近数字的增量。Nterms = 2;而abs(fnext/fcurrent - goldenMean) >= tol nterms = nterms + 1;Temp = fnext;Fnext = Fnext + fcurrent; fcurrent = temp; end

浮点算法

我需要换什么goldFibDouble让它也能计算单精度的术语数?其实只有几件事我需要改变。首先,我可能想计算一下斐波那契数字本身的单次,以及黄金均值和容忍度。最后,我需要改变函数,这样我就可以指定我想要的输出精度。现在让我们看看goldFib我做了必要的改变

dbtypegoldFib
1 function nterms = goldFib(dtype) 2% goldFib达到黄金平均比率的斐波那契项数。3 4 fcurrent = ones(dtype);5 fnext = fcurrent;6 goldenMean = (1+sqrt(cast(5,dtype)))/2;7 tol = eps(黄金平均值);8 nterms = 2;9 while abs(fnext/fcurrent - goldenMean) >= tol 10 nterms = nterms + 1;11 temp = fnext;12 fnext = fnext + fcurrent;13 fcurrent = temp; 14 end

单人和双人术语的数量

现在我们来看看单峰和双峰需要多少项。

numSingle = goldFib(“单一”numDouble = goldFib(“双”
numSingle = 19 numDouble = 41

你会注意到在第七行goldFib,我们计算黄金平均在正确精度的相对精度。你可以看到这里的数值。

TolSingle = eps(GoldenMeanSingle) TolDouble = eps(GoldenMeanDouble)
TolSingle = 1.1921e-007 TolDouble = 2.2204e-016

MATLAB中用于编写“通用”浮点程序的工具

MATLAB提供了一些工具,使您可以创建在单精度和双精度下正确工作的程序。在这个示例中,您可以看到,我们只需要修改m文件中的少量行和术语,就可以将文件从仅处理双精度计算转换为能够适当地处理单精度和双精度计算。你需要做类似的事情吗?这是因为您有大型数据集并使用单一精度来帮助管理内存吗?让我知道


使用MATLAB®7.2发布

|