matlab - 关于浮点精度 : why the iteration numbers are not equal?

标签 matlab floating-point

有两个相似的matlab程序,一个迭代10次,一个迭代11次。

一:

i = 0;
x = 0.0;
h = 0.1;
while x < 1.0
    i = i + 1;
    x = i * h;
    disp([i,x]);
end

另一个:

i = 0;
x = 0.0;
h = 0.1;
while x < 1.0
    i = i + 1;
    x = x + h;
    disp([i,x]);
end

我不明白为什么浮点加运算和乘法运算有区别。

最佳答案

使用浮点计数器进行迭代时,您应该非常小心。作为示例,我将向您展示您的案例中发生了什么(这是一个 Java 程序,但您的案例应该相同):click here to run it yourself

double h = 0.1;
System.out.println(10*h-1.0);
System.out.println(h+h+h+h+h+h+h+h+h+h-1.0);

它只是在进行乘法与单独的加法时将差值打印为 1。

由于 float 的表示不准确,结果如下所示:

0.0
-1.1102230246251565E-16

因此,如果您在后一种情况下将其用作循环条件,则会有一个额外的迭代(尚未达到)。

尝试使用计数器变量i,它是一个整数,你不会遇到这样的问题。

关于matlab - 关于浮点精度 : why the iteration numbers are not equal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6477178/

相关文章:

matlab - 迭代 matlab 单元格

python - 在 python 中重现 Matlab 的 SVD

c - 当除以一个小的负数时,我只得到 0

C++ 十进制数据类型

c++ - STL中的 float 比较,BOOST

c++ - MATLAB "fminunc"的良好 C++ 替代品?

matlab - 如何在Matlab中切割矩阵?

matlab - 通过自动引入时间变量或以任何其他方式简化非常长的符号表达式

java - 将wav音频格式字节数组转换为 float

compression - 为什么我可以将 "fold"范围内的整数变成二分之一大小而不丢失信息?