我正在对时域卷积与频域乘法进行一些测试,特别是你可以通过将两个基数为10的数字相乘,将它们视为向量,进行DFT,乘法,然后重新组合它们来获得相同的结果如下:
format long
multiply = 527283*426715
a = [5 2 7 2 8 3];
b = [4 2 6 7 1 5];
len = length(a)+length(b) - 1; % the length of the convolution result
temp = ifft(fft(a,len).*fft(b,len));
% add the numbers for each index up
result = 0;
for i = 1:length(temp)
result = result + temp(i)*10^(length(temp)-i);
end
result
result == multiply
当我运行该代码时,我最后得到0,暗示两个数字不相等。如果我将输入的数量级减少2,那么它会像它应该的那样返回1。这个数值误差来自哪里?是否可以避免?
答案 0 :(得分:1)
如果a
和b
是浮点数,则永远不要使用a == b
来检查是否相等。您应该将它们与abs(a-b) < tol
所在的容差tol
进行比较,例如10e-6
。
由于您将multiply
声明为两个整数的乘积,因此可能会造成混淆,但在Matlab中所有都是双精度,除非明确指定。