我是否面临浮点问题?

时间:2016-08-14 03:29:01

标签: matlab floating-point

让我们说f(x) = (4x^2-9)/(2x-3)f(x)处未定义函数x=3/2。请注意,可以将函数计算为f(x)=2x+3,但让我们检查第一个等式。在x=1.5时的以下脚本中,函数f(x=1.5)=4.0

clear all
clc

x = 0:0.3:2;

for i = 1:length(x)
if x(i) == 1.5  % this line for some reasons is ignored. 
    y(i) = 6;
else
    y(i) = (4*x(i)^2-9)/(2*x(i)-3);
end
end
x
y

前面脚本的输出是

x = 0         0.3000    0.6000    0.9000    1.2000    1.5000    1.8000
y = 3.0000    3.6000    4.2000    4.8000    5.4000    4.0000    6.6000

y=4.0000时为何x=1.5000?现在让我们运行没有for循环的代码,

clear all
clc
x = 0:0.3:2
y = (4*x.^2-9)/(2*x-3)

上述代码的结果是

x = 0       0.3000    0.6000    0.9000    1.2000    1.5000    1.8000
y = 3.6000

f(x)只有一个值。任何人都可以解释发生了什么吗?

2 个答案:

答案 0 :(得分:2)

关于你的第一个问题,是的,你遇到浮点精度错误。您可以通过检查它应该是1.5和1.5的x值之间的差异来检查这一点。

x(6)-1.5

%ans=
%     -2.2204e-16

特别是在你的情况下,它来自使用0.3来构造向量x,因为该值无法精确保存为二进制,see here for a deeper explanation

以下任何一项都可以解决您的问题

x=0:3:20;      %Create the vector based on values that can be represented
x=x/10;

x=[0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8]; %Directly input the values

abs(x(i)-1.5) < tol  %Instead of directly comparing values, compare the difference to a determined tolerance (very small compared to the values at hand)

至于你的第二个问题@Phill已经给你答案,你正在使用/矩阵除法,你想要./元素明智的划分。

答案 1 :(得分:0)

当我在Octave中使用for循环运行你的第一个例子时,我没有看到x = 1.5 if语句被忽略的问题。也许这是Matlab和Octave之间的微妙差异,尽管我会感到惊讶。

对于数组表示法第二个例子

clear all
clc
x = 0:0.3:2
y = (4*x.^2-9)/(2*x-3)

您选择了matrix division operator /而不是element by element division operator ./