首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我正面临浮点数问题吗?

我正面临浮点数问题吗?
EN

Stack Overflow用户
提问于 2016-08-14 03:29:01
回答 2查看 61关注 0票数 0

比方说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

代码语言:javascript
运行
复制
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

前面的脚本的输出是

代码语言:javascript
运行
复制
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循环的情况下运行代码,

代码语言:javascript
运行
复制
clear all
clc
x = 0:0.3:2
y = (4*x.^2-9)/(2*x-3)

以上代码的结果是

代码语言:javascript
运行
复制
x = 0       0.3000    0.6000    0.9000    1.2000    1.5000    1.8000
y = 3.6000

f(x)只有一个值。有人能解释一下发生了什么事吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-14 06:09:17

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

代码语言:javascript
运行
复制
x(6)-1.5

%ans=
%     -2.2204e-16

特别是在您的例子中,它来自于使用0.3构造向量x,因为该值不能精确地保存到二进制文件请看这里有更深入的解释。中。

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

代码语言:javascript
运行
复制
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已经给出了答案,您使用的是/矩阵除法,您需要./元素明智的除法。

票数 2
EN

Stack Overflow用户

发布于 2016-08-14 03:55:43

当我在Octave中使用for循环运行您的第一个示例时,我不认为x=1.5 if语句会被忽略。也许这是Matlab和Octave之间的细微差别,尽管我会感到惊讶。

数组表示法的第二个示例

代码语言:javascript
运行
复制
clear all
clc
x = 0:0.3:2
y = (4*x.^2-9)/(2*x-3)

您选择了矩阵除法算子 /而不是元素除法算子 ./

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38938876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档