2010-11-19 136 views
6

我不明白使用sprintf命令发生的下一件事。在MATLAB中使用sprintf显示变量的小数点

>> vpa(exp(1),53) 

ans = 

2.7182818284590455348848081484902650117874145507812500 


>> e = 2.7182818284590455348848081484902650117874145507812500 

e = 

2.7183 

>> sprintf('%0.53f', e) 

ans = 

2.71828182845904550000000000000000000000000000000000000 

为什么sprintf告诉我圆润,而不是数数e和我保持在首位?

+0

这可能与你的问题无关,但如果你想要'e'的真实数字,你应该输入'vpa('exp(1)',53)' – MarkV 2010-11-22 21:46:46

+0

@MarkV:是的,但我喜欢它。谢谢! – Peterstone 2010-11-24 10:40:27

回答

5

变量是double precision在MATLAB默认,让你创建变量e被限制在一个双精度,大约是16位。即使你输入了更多的数字,double也没有精确度来精确地表示所有这些额外的数字并舍入到它可以表示的最接近的数字。

编辑:如更详细的他的回答this follow-up question我贴解释由Andrew Janke,你选择了e数恰好是二进制值的精确十进制扩展。换句话说,它就是附近的浮点数将四舍五入到的完全可表示的值。然而,在这种情况下,超过小数点后16位以上的数字不被认为是重要的,因为它不能用双精度类型准确表示。因此,像SPRINTF这样的函数将自动忽略这些小值,而是打印0。

+1

您跳过了一个步骤:使用sprintf时,e隐式转换为double。变量是... – Marc 2010-11-19 14:58:42

+1

@Marc:嗯?在这里,e已经是双重因为它由于复制和粘贴而从文字初始化。在Matlab中,所有数字文字都会生成双精度值。你可以用“class(2.7182818284590455348848081484902650117874145507812500)”确认它,它返回'double'。 class(exp(1))也是双倍的。大部分显示的数字都是假的,因为它们超出了双精度的极限; vpa()只是不会像printf()那样将它们归零。 – 2010-11-19 17:16:56

+0

你说得对。我错过了代码。 – Marc 2010-11-19 19:42:35