Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 在MATLAB中用sprintf显示变量的小数_Variables_Matlab_Printf_Decimal - Fatal编程技术网

Variables 在MATLAB中用sprintf显示变量的小数

Variables 在MATLAB中用sprintf显示变量的小数,variables,matlab,printf,decimal,Variables,Matlab,Printf,Decimal,我不明白接下来用这个命令会发生什么 为什么sprintf向我显示的是e四舍五入的数字,而不是我保持在第一位的数字?变量在MATLAB中是默认的,因此您创建的变量e的精度限制为双精度,大约为16位。即使您输入了更多的数字,双精度也无法精确表示所有这些额外的数字,并舍入到它所能表示的最接近的数字 编辑:正如他在回答我发布的问题时详细解释的那样,您为e选择的数字恰好是二进制值的精确十进制扩展。换言之,它是附近的浮点数将被四舍五入到的可精确表示的值。然而,在这种情况下,任何超过小数点16位的数字都不被认

我不明白接下来用这个命令会发生什么

为什么
sprintf
向我显示的是
e
四舍五入的数字,而不是我保持在第一位的数字?

变量在MATLAB中是默认的,因此您创建的变量
e
的精度限制为双精度,大约为16位。即使您输入了更多的数字,双精度也无法精确表示所有这些额外的数字,并舍入到它所能表示的最接近的数字


编辑:正如他在回答我发布的问题时详细解释的那样,您为
e
选择的数字恰好是二进制值的精确十进制扩展。换言之,它是附近的浮点数将被四舍五入到的可精确表示的值。然而,在这种情况下,任何超过小数点16位的数字都不被认为是有效的,因为它不能用双精度类型准确地表示。因此,像这样的函数将自动忽略这些小值,而改为打印零。

您跳过了一个步骤:在使用sprintf时,e隐式转换为double。变量是…@Marc:Hm?在这里,e已经是一个double,因为它是通过复制和粘贴从一个文本初始化的。在Matlab中,所有数字文字都会产生双值。您可以使用“类(2.718281828459045534848081484902650117874145507812500)”来确认它,该类返回“double”。类(exp(1))也是双精度的。大多数显示的数字都是假的,因为它们超出了精度的双精度限制;vpa()只是不像printf()那样将它们归零。这可能与你的问题无关,但是如果你想要
e
的真实数字,你应该键入
vpa('exp(1)”,53)
@MarkV:是的,但我喜欢。非常感谢。
>> vpa(exp(1),53)

ans =

2.7182818284590455348848081484902650117874145507812500


>> e = 2.7182818284590455348848081484902650117874145507812500

e =

2.7183

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

ans =

2.71828182845904550000000000000000000000000000000000000