嵌套的do和if语句错过了地块

时间:2015-12-01 15:02:34

标签: gnuplot

我正在使用

  

G N U P L O T
      版本4.6补丁级别4最后修改2013-10-02
      构建系统:Linux x86_64

我想用它来绘制一个粗略设置的文件中的数据

  

0.0 a1 b1
  0.0 a2 b2
  ...
  0.1 a1 b1 *
  0.1 a2 b2 *
  ......

对于第一列中的每个唯一值,我想在a上绘制b。为此,我创建了一个包含条件绘图的do循环

  

做[t = 0:34] {
  打印0.2000 * t
  情节' twopi5101 / profile.dat'你($ 1 == 0.2000 * t?($ 3-7.5):1/0):8 notitle w l lt 1 lc 1,\
   ' twopi5101 / profile.dat'你($ 1 == 0.2000 * t?($ 3-7.5):1/0):9 notitle w l lt 1 lc 2
  }

不幸的是,这个循环(以及其他文件的类似循环)将始终错过一些情节

  

0.0
  0.2
  0.4
  0.6
        警告:跳过没有有效点的数据文件
        警告:跳过没有有效点的数据文件
  更> ;打印0.2000 * t;情节' twopi5101 / profile.dat'你($ 1 == 0.2000 * t?($ 3-7.5):1/0):8 notitle w l lt 1 lc 1,' twopi5101 / profile.dat'你($ 1 == 0.2000 * t?($ 3-7.5):1/0):9 notitle w l lt 1 lc 2;
                                                                                                                                                                                                      ^
        x范围无效

然而,如果我手动输入0.6,那么根本没有问题

  

的gnuplot>情节' twopi5101 / profile.dat'你($ 1 == 0.6?($ 3-7.5):1/0):8 notitle w l lt 1 lc 1,\       ' twopi5101 / profile.dat'你($ 1 == 0.6?($ 3-7.5):1/0):9 notitle w l lt 1 lc 2
  gnuplot的>

对于为什么会发生这种情况似乎没有合理的解释,甚至是错过点数的模式 区间[0.0:6.0] gnuplot跳过:
0.6,1.2,1.4,2.4,2.8,3.4,3.8,4.6,4.8,5.6,5.8
并且每次运行循环时都会如此运行,即使我只运行了一段时间(例如从0.6运行到2.0将再次超过0.6,1.2和1.4)。

我在许多其他情况下遇到相同的行为,因为间隔更大/更多的情节。我不知道什么会导致这样的事情或者我的循环格式中有一些错误来解释它 (我使用的终端是' wxt'或后记增强版)

1 个答案:

答案 0 :(得分:1)

这是因为在相等性上测试浮点值通常不是一个好主意。让我们考虑一下:

gnuplot> print 0.6==0.6
1
gnuplot> print 0.6==3*0.2
0

这是因为0.2之类的数字并未准确表示。

我建议首先将数据中的第一列转换为整数值,例如

floor(($1 + 0.05)*10)

这里假设有问题的列只包含0.1的倍数。系数0.05用于确保可能的不准确输入(如0.10000010.09999991转换为plot

此转换后的值可用于plot 'twopi5101/profile.dat' u (floor(($1+0.05)*10)==2*t?($3-7.5):1/0):8 命令中的过滤,例如

$1==0.2000*t

或者,可以用abs($1 - 0.2000*t)<5E-2

之类的内容替换条件{{1}}