罗兰对MATLAB的艺术gydF4y2Ba

将想法转化为MATLABgydF4y2Ba

写几个数字?gydF4y2Ba

最近,我的同事gydF4y2Ba罗伯·卡莫gydF4y2Ba我讲的是如何写出一个十进制的数字,这样,如果把它读回MATLAB中,就能保持它的全部精度。问题是要写多少位。这个数字取决于几个因素,包括存储值的数据类型。此外,它可能取决于值的精度-即,它是在只记录两个有效数字的实验中收集的数据吗?今天我将发布罗布和我提出的解决方案,以选择数字的数量,所以如果你把数据写成字符串,你可以把它读回MATLAB,保留完整的精度。gydF4y2Ba

内容gydF4y2Ba

创建一些值gydF4y2Ba

让我们首先创建一些值gydF4y2Ba单gydF4y2Ba和gydF4y2Ba双gydF4y2Ba版本的gydF4y2BaπgydF4y2Ba。gydF4y2Ba

格式gydF4y2Ba长gydF4y2BaggydF4y2BaDblpi = PI snglpi = single(PI)gydF4y2Ba
= 3.14159265358979gydF4y2Ba

算出位数gydF4y2Ba

为了计算出要打印的位数,我们需要知道浮点精度,有时称为gydF4y2Ba每股收益gydF4y2Ba为感兴趣的数。gydF4y2Ba

每股收益(snglpi)每股收益(dblpi)gydF4y2Ba
Ans = 2.384186e-007 Ans = 4.44089209850063e-016gydF4y2Ba

因此,我们可以看到,单精度值的精度大于“等效”双精度值的精度。这意味着下一个最接近单精度值的数字比下一个最接近双精度值的数字更远。gydF4y2Ba

位数gydF4y2Ba

我们可以用gydF4y2Ba每股收益(x)gydF4y2Ba帮我们算出小数点后要打印多少位。首先找出以10为基数的总位数:gydF4y2Ba

log10 (eps (snglpi)) log10 (eps (dblpi))gydF4y2Ba
Ans = -6.62266 Ans = -15.352529778863gydF4y2Ba

要得到一个正数,只需将结果取反即可。gydF4y2Ba

log10 (eps (snglpi) log10 (eps (dblpi))gydF4y2Ba
Ans = 6.62266 Ans = 15.352529778863gydF4y2Ba

然后四舍五入以确保我们不会漏掉任何准确性。gydF4y2Ba

装天花板(log10 (eps (snglpi)))装天花板(log10 (eps (dblpi)))gydF4y2Ba
Ans = 7 Ans = 16gydF4y2Ba

让我们将结果转换为字符串。我们正在利用控制数字数量的能力gydF4y2Ba*gydF4y2Ba在gydF4y2BasprintfgydF4y2Ba。gydF4y2Ba

= sprintf()gydF4y2Ba“% * f '。gydF4y2Ba, -log10(eps(snglpi))), snglpi) dblpistr = sprintf(gydF4y2Ba“% * f '。gydF4y2Ba-log10(eps(dblpi)), dblpi)gydF4y2Ba
Snglpistr = 3.1415927 dblpistr = 3.1415926535897931gydF4y2Ba

现在我们已经捕获了每个值,所以如果作为字符串写出来,并读回MATLAB,精度是保留的。gydF4y2Ba

转换为函数gydF4y2Ba

根据我们已知的求位数的方法,我们来做一个函数,我们可以用它来测试。gydF4y2Ba

数字= @(x) ceil(-log10(eps(x)));Printdigs = @(x)gydF4y2Ba“% * f '。gydF4y2Ba, digits(x), x);gydF4y2Ba

尝试一些值gydF4y2Ba

Printdigs (pi) Printdigs (2/3) Printdigs (1000*pi) Printdigs (pi/1000)gydF4y2Ba
Ans = 3.1415926535897931 Ans = 0.6666666666666666 Ans = 3141.5926535897929 Ans = 0.0031415926535897933gydF4y2Ba

现在的魔法gydF4y2Ba

Rob创造了必要的魔法来去除小数点后的尾随零,同时在小数点的右边至少留下一位数字。gydF4y2Ba

STR = printdigs(X) strout = stripzeros(STR)gydF4y2Ba
X = 0.0005 STR = 0.0005000000000000000 strout = 0.0005gydF4y2Ba

让我们尝试更多的值。首先创建一个函数来帮助我们。gydF4y2Ba

strippedStringValues = @(x) stripzeros(printdigs(x));[100/289, -1/ 17,1 /2000, 0,500 - 200,123.4567]gydF4y2Ba为gydF4y2Bak = vals strippedStringValues(k)gydF4y2Ba结束gydF4y2Ba
vals =列1至2 0.346020761245675 -0.0588235294117647列3至4 0.0005 0列5至6 500 -200列7 123.4567 ans = 0.34602076124567471 ans = -0.058823529411764705 ans = 0.0005 ans = 0.0 ans = 500.0 ans = -200.0 ans = 123.4567gydF4y2Ba

对于感兴趣的人来说,这是去除零的神奇代码。gydF4y2Ba

dbtypegydF4y2BastripzerosgydF4y2Ba
1 function str = stripzeros(string) 2 % stripzeros去掉后面的零,在小数点右边留下一位。去掉后面的零,同时在小数点后4%的右边至少留下一位数字。5 6%版权所有2010 MathWorks, Inc. 7 8 str = string;9 n = regexp(str,'\.0*$');10 if ~isempty(n) 11%小数点右边全是0;n中的值是小数点本身的下标。除去除第一个以外的所有尾随零。14 str(n+2:end) = [];小数点右边有一个非零数字。17 m = regexp(str,'0*$'); 18 if ~isempty(m) 19 % There are trailing zeros, and the value in m is the index of 20 % the first trailing zero. Remove them all. 21 str(m:end) = []; 22 end 23 end

如何控制打印数字?gydF4y2Ba

您是否能够使用MATLAB的默认打印值?你用吗?gydF4y2BadispgydF4y2Ba,去掉分号(gydF4y2Ba;gydF4y2Ba),使用其中一个gydF4y2Ba* printfgydF4y2Ba功能呢?您需要进行哪些自定义才能打印出值?让我知道gydF4y2Ba在这里gydF4y2Ba。gydF4y2Ba




使用MATLAB®7.11发布gydF4y2Ba

|gydF4y2Ba

评论gydF4y2Ba

如欲留言,请点击gydF4y2Ba在这里gydF4y2Ba登录您的MathWorks帐户或创建一个新帐户。gydF4y2Ba