tl;dr MATLAB 中的变量使用双精度。命令行窗口和变量编辑器中的变量使用相同的精度。唯一的区别是显示格式和打印精度的小数位数。
默认情况下,MATLAB 对其变量使用双精度。 MATLAB 中的这些变量存储在工作区中。命令行窗口和变量编辑器都从同一个工作区中提取它们的变量,因此在下面使用相同的精度。
在变量编辑器和命令行窗口中显示变量的默认格式是short 格式。您可以使用
检查命令行窗口
>> get(0, 'format')
ans =
short
对于变量编辑器,请转到 Preferences -> Variables -> Format。 short 格式默认显示变量,精确到小数点后 4 位。
在我看来,您已将变量编辑器中变量的默认显示格式更改为 long 格式。此格式显示精度为小数点后 15 位的双变量。 long 和 short 都格式化了舍入变量,因此 pi 即 3.14159 会舍入为 3.1416,因为当使用 short 格式显示时,9 在小数点后 5 位
>> format short
>> pi
ans =
3.1416
这直接相当于fprintf产生的输出
>> fprintf(1, '%.4f\n', pi);
3.1416
但是,long 格式,我猜,您已将变量编辑器设置为默认值,四舍五入到小数点后 15 位,因此显示
>> format long
>> pi
ans =
3.141592653589793
直接等价于
>> fprintf(1, '%.15f\n', pi);
3.141592653589793
当您使用fprintf(1, '%.16f\n', pi); 时,您将pi 打印到小数点后16 位,而不是 15,如long 格式所指定。这就是为什么你的输出是
>> fprintf(1, '%.16f\n', pi);
3.1415926535897931
注意,1 在此末尾。这就是为什么在变量编辑器中显示时,直接位于其前面的 3 不会四舍五入为 4。
总结
- MATLAB 中的变量默认使用双精度
- MATLAB 变量存储在工作区中
- 命令行窗口和变量编辑器中可用的变量都来自工作区并使用相同的精度
预计算值
在 MATLAB 中,您应该在函数调用或处理其他数值数据时使用变量名称 pi180。这将使用双精度并消除使用fprintf 或变量编辑器中输出的值可能出现的任何复制和粘贴错误。
fprintf怪癖
tl;dr MATLAB 的 short 和 long 格式在 %d、%.f、%.g 和 %.e 说明符之间切换,具体取决于最合适的输入方法.
@horchler 指出%.f 仅直接等效于特定输入的short 和long 格式,这是真的。 fprintf 和 MATLAB 的 short 和 long 格式之间的所有输入没有直接等效。
例如,让我们看看 eps 和 100.5 并尝试完全按照 MATLAB 的 short 和 long 格式打印数字。
>> format short
>> eps
ans =
2.2204e-16
>> 100.5
ans =
100.5000
和
>> format long
>> eps
ans =
2.220446049250313e-16
>> 100.5
ans =
1.005000000000000e+02
现在我们从上面知道fprintf(1, '%.4f\n', pi); 和fprintf(1, '%.15f\n', pi); 直接等效于pi 的short 和long 但它们是eps 和100.5
>> fprintf(1, '%.4f\n', eps);
0.0000
>> fprintf(1, '%.15f\n', eps);
0.000000000000000
>> fprintf(1, '%.4f\n', 100.5);
100.5000
>> fprintf(1, '%.15f\n', 100.5);
100.500000000000000
不它们不是唯一的直接等价物是fprintf(1, '%.4f\n', 100.5);。如果我们尝试使用%.g 会怎样?
>> fprintf(1, '%.4g\n', eps);
2.22e-16
>> fprintf(1, '%.15g\n', eps);
2.22044604925031e-16
>> fprintf(1, '%.4g\n', 100.5);
100.5
>> fprintf(1, '%.15g\n', 100.5);
100.5
现在没有一个fprintf 语句是直接等价的。但是,我们可以使用long 格式生成eps 的直接等价物
>> fprintf(1, '%.16g\n', eps);
2.220446049250313e-16
因为紧跟在%g 格式说明符的. 之后的数字指定了有效位数(包括小数点之前的那些,.),我们需要使用16 和不是15。
要为short 格式的所有这些输入类型生成直接等效项,我们需要混合%.f、%.g 和%.e 说明符并调整@ 987654322@.
>> format short
>> pi
ans =
3.1416
>> eps
ans =
2.2204e-16
>> 100.5
ans =
100.5000
>> fprintf(1, '%.4f\n', pi);
3.1416
>> fprintf(1, '%.5g\n', eps);
2.2204e-16
>> fprintf(1, '%.4f\n', 100.5);
100.5000
一点也不简单。long 格式也可以这样做。
>> format long
>> pi
ans =
3.141592653589793
>> eps
ans =
2.220446049250313e-16
>> 100.5
ans =
1.005000000000000e+02
>> fprintf(1, '%.15f\n', pi);
3.141592653589793
>> fprintf(1, '%.16g\n', eps);
2.220446049250313e-16
>> fprintf(1, '%.15e\n', 100.5);
1.005000000000000e+02
比short 格式还要糟糕。
简而言之,MATLAB 的 short 和 long 格式在 %d、%.f、%.g 和 %.e 说明符之间切换,具体取决于最合适的输入方法。
补充阅读
您可以通过format documentation 找到有关 MATLAB 中可用的不同显示格式的信息。 Display Format for Numeric Values 上还有一个有用的文档。最后,还有关于Variable Editor and its preferences的信息。