Matlab读取数字具有更高的精度

时间:2017-09-16 17:21:35

标签: matlab

我已经制作了这个脚本来计算给定数据集的频率,但是matlab不够精确,是否有可能使matlab读取更准确的数字而不是切断数字?我希望它使用8位数(0.12345678)而不是现在的4位(0.1234)

fid = fopen('forceCoeffs.dat','rt');
A = textscan(fid, '%f%f%f%f%f%f', 'HeaderLines',9,'Collect', 9);
A = A{1};
fclose(fid);

t = A(:,1);

Fs = 1/(A(1,1));
x = A(:,2)

x = detrend(x,0);
xdft = fft(x);
freq = 0:Fs/length(x):Fs/2;
xdft = xdft(1:length(x)/2+1);
plot(freq,abs(xdft));
[~,I] = max(abs(xdft));
fprintf('Maximum occurs at %d Hz.\n',freq(I)); 

档案:https://drive.google.com/file/d/0B9CEsYCSSZUSb1JmcHRkbFdWYUU/view?usp=sharing

3 个答案:

答案 0 :(得分:2)

感谢您提供mv文件,因为它允许我运行您的代码。以下是您所看到的内容的解释。

首先,我想指出MATLAB并非四舍五入。您可以检查forceCoeffs.dat的数据类型,以确保您具有足够的精度。

A

由于您使用>> class(A) ans = double 读取每个列的文件,因此MATLAB将使用%f类型提供的所有位。好的,现在看一下你文件的内容。第一列最多只有2位小数。

double

由于不再需要MATLAB,因此当您查看变量资源管理器中的变量时,MATLAB只会打印四个小数位。尝试查看其他列之一,看看我在说什么。我注释掉了代码的0.05 -7.013874e-09 1.410717e+02 -6.688450e-02 -3.344226e-02 -3.344224e-02 ... 349.95 -1.189524e-03 1.381022e+00 -2.523909e-01 -1.273850e-01 -1.250059e-01 350 -1.423947e-03 1.380908e+00 -2.471767e-01 -1.250123e-01 -1.221644e-01 部分并查看了第二列。单击数字时,您会看到完整的精度。

enter image description here

答案 1 :(得分:0)

您可以使用长型显示16位

答案 2 :(得分:0)

要获得超过4位数的精度,您可以使用

format long

但是,要准确获得8位数字,您需要对其进行舍入。如果您的号码为a,请使用:

format long
round(1e8*a)*1e-8