Iteration gnuplot 4.6和gnuplot 5.0之间迭代中的无法解释的差异

Iteration gnuplot 4.6和gnuplot 5.0之间迭代中的无法解释的差异,iteration,gnuplot,Iteration,Gnuplot,在试图回答一个涉及迭代日期的gnuplot问题时,我被告知我的解决方案不适用于gnuplot4.6。在调查原因时,我注意到gnuplot 4.6和gnuplot 5.0处理相同迭代构造的方式有一个奇怪的差异 考虑这两个迭代表达式 do for [i=396835200:397094400:86400] {print i} do for [i=396835200:397008000:86400] {print i} 在gnuplot 5.0中,第一个生成 396835200 396921600

在试图回答一个涉及迭代日期的gnuplot问题时,我被告知我的解决方案不适用于gnuplot4.6。在调查原因时,我注意到gnuplot 4.6和gnuplot 5.0处理相同迭代构造的方式有一个奇怪的差异

考虑这两个迭代表达式

do for [i=396835200:397094400:86400] {print i}
do for [i=396835200:397008000:86400] {print i}
在gnuplot 5.0中,第一个生成

396835200
396921600
397008000
397094400
第二种是生产

396835200
396921600
397008000
但是在gnuplot 4.6中,第一个只产生前两个数字,第二个产生一个额外的数字(397094400)

为什么会这样?根据gnuplot中迭代的定义,gnuplot5.0行为是正确的。gnuplot 5.0中是否修复了一个bug

我曾怀疑这可能与整数溢出有关,但我不认为这些数字太大,足以触发这种情况(它们都很容易放入32位有符号整数中)


我还怀疑迭代中可能发生了变化,因此使用<4.6版中的检查了上限,看起来我自己找到了答案。这显然是gnuplot中出现的一个bug,在版本5.0中得到了修复

实际的bug在gnuplot bug reports中报告为bug编号,描述与我的大致相同,并在中对修复进行了更详细的解释

这在版本5.0rc1和版本4.6 patchlevel 6中已修复


我不会在这里重复源代码,因为我不知道许可证限制,但在下一次迭代中的parse.c文件中有一个更改,其中添加了一个补丁,以防止两个大数字相乘导致溢出(显然,至少在另一个地方需要一个类似的补丁).

谢谢你@Christoph。通过你的链接,我现在正试图决定是否删除这个问题,因为它与那个问题非常相似。这是同一个bug,但我认为这个问题对于那些像我一样遇到不同版本的人来说仍然是有价值的。我不确定他们是否有必要找到那个问题(我没有),这是一个类似但不同于那个问题的问题。我欢迎任何人的意见,如果我应该留下这个作为有价值的本身,或者如果它应该删除由于相似性。我会留下你的问题,并接受答案。我只能找到另一个问题,因为我知道它存在。这是另一个相关错误: