https://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112020-02-06T19:47:30ZRuby Issue Tracking SystemRuby master - Bug #16612: Enumerator::ArithmeticSequence#last with float range produces incorrect valuehttps://redmine.ruby-lang.org/issues/16612?journal_id=841832020-02-06T19:47:30ZEregon (Benoit Daloze)
<ul></ul><p>I'm unsure if the bug is in <code>last</code> or in <code>each</code>.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="c1"># last seems correct</span>
<span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">></span> <span class="p">(</span><span class="mf">0.24901079128550474</span><span class="n">r</span> <span class="o">+</span> <span class="mf">34.00010700985213</span><span class="n">r</span> <span class="o">*</span> <span class="mi">10</span><span class="p">).</span><span class="nf">to_f</span>
<span class="o">=></span> <span class="mf">340.2500808898068</span>
<span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">></span> <span class="mf">340.25008088980684</span>
<span class="o">=></span> <span class="mf">340.25008088980684</span>
<span class="c1"># Computing with 10 += seems correct too</span>
<span class="p">[</span><span class="mi">18</span><span class="p">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">></span> <span class="n">n</span><span class="o">=</span><span class="mf">0.24901079128550474</span><span class="p">;</span>
<span class="p">[</span><span class="mi">19</span><span class="p">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">></span> <span class="mi">10</span><span class="p">.</span><span class="nf">times</span> <span class="p">{</span><span class="nb">p</span> <span class="n">n</span><span class="o">+=</span><span class="mf">34.00010700985213</span><span class="p">}</span>
<span class="mf">34.249117801137636</span>
<span class="mf">68.24922481098977</span>
<span class="mf">102.2493318208419</span>
<span class="mf">136.24943883069403</span>
<span class="mf">170.24954584054615</span>
<span class="mf">204.24965285039826</span>
<span class="mf">238.24975986025038</span>
<span class="mf">272.2498668701025</span>
<span class="mf">306.2499738799546</span>
<span class="mf">340.2500808898067</span>
<span class="o">=></span> <span class="mi">10</span>
<span class="p">[</span><span class="mi">20</span><span class="p">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">></span> <span class="mf">340.2500808898067</span> <span class="o"><</span> <span class="mf">340.25008088980684</span>
<span class="o">=></span> <span class="kp">true</span>
<span class="c1"># But each/to_a gives different results:</span>
<span class="p">[</span><span class="mi">17</span><span class="p">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">></span> <span class="p">((</span><span class="mf">0.24901079128550474</span><span class="p">)</span><span class="o">...</span><span class="p">(</span><span class="mf">340.25008088980684</span><span class="p">)).</span><span class="nf">step</span><span class="p">(</span><span class="mf">34.00010700985213</span><span class="p">).</span><span class="nf">to_a</span>
<span class="o">=></span> <span class="p">[</span><span class="mf">0.24901079128550474</span><span class="p">,</span>
<span class="mf">34.249117801137636</span><span class="p">,</span>
<span class="mf">68.24922481098976</span><span class="p">,</span>
<span class="mf">102.24933182084189</span><span class="p">,</span>
<span class="mf">136.24943883069403</span><span class="p">,</span>
<span class="mf">170.24954584054615</span><span class="p">,</span>
<span class="mf">204.2496528503983</span><span class="p">,</span>
<span class="mf">238.24975986025044</span><span class="p">,</span>
<span class="mf">272.24986687010255</span><span class="p">,</span>
<span class="mf">306.24997387995467</span><span class="p">]</span>
</code></pre>
<p>So I think <code>last</code> is correct, and <code>each</code> misses to yield the last element, probably due to accumulated errors.</p> Ruby master - Bug #16612: Enumerator::ArithmeticSequence#last with float range produces incorrect valuehttps://redmine.ruby-lang.org/issues/16612?journal_id=841922020-02-07T08:57:09Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul></ul><p><code>err</code> in <code>ruby_float_step_size</code> seems too big in this case.</p> Ruby master - Bug #16612: Enumerator::ArithmeticSequence#last with float range produces incorrect valuehttps://redmine.ruby-lang.org/issues/16612?journal_id=841932020-02-07T08:58:57Zmrkn (Kenta Murata)muraken@gmail.com
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Assigned</i></li><li><strong>Assignee</strong> set to <i>mrkn (Kenta Murata)</i></li></ul> Ruby master - Bug #16612: Enumerator::ArithmeticSequence#last with float range produces incorrect valuehttps://redmine.ruby-lang.org/issues/16612?journal_id=842062020-02-08T22:53:35ZAnonymous
<ul></ul><p>Since past few days/weeks, the Redmine threading is broken. Can somebody<br>
please look into this?</p>
<p>Thx.</p>
<p>Vít</p>
<p>Dne 07. 02. 20 v 9:58 <a href="mailto:muraken@gmail.com" class="email">muraken@gmail.com</a> napsal(a):</p>
<blockquote>
<p>Issue <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Enumerator::ArithmeticSequence#last with float range produces incorrect value (Closed)" href="https://redmine.ruby-lang.org/issues/16612">#16612</a> has been updated by mrkn (Kenta Murata).</p>
<p>Assignee set to mrkn (Kenta Murata)<br>
Status changed from Open to Assigned</p>
<hr>
<p>Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Enumerator::ArithmeticSequence#last with float range produces incorrect value (Closed)" href="https://redmine.ruby-lang.org/issues/16612">#16612</a>: Enumerator::ArithmeticSequence#last with float range produces incorrect value<br>
<a href="https://bugs.ruby-lang.org/issues/16612#change-84193" class="external">https://bugs.ruby-lang.org/issues/16612#change-84193</a></p>
<ul>
<li>Author: bjfish (Brandon Fish)</li>
<li>Status: Assigned</li>
<li>Priority: Normal</li>
<li>Assignee: mrkn (Kenta Murata)</li>
<li>ruby -v: 2.7.0</li>
<li>Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN</li>
</ul>
<hr>
<p><strong>Steps to reproduce</strong></p>
<pre><code class="shell syntaxhl" data-language="shell">% ruby <span class="nt">-e</span> <span class="s1">'p ((0.24901079128550474)...(340.25008088980684)).step(34.00010700985213).last'</span>
340.2500808898068
</code></pre>
<p><strong>Expected result</strong></p>
<p>Last value should match the value produced by the following:</p>
<pre><code class="shell syntaxhl" data-language="shell">ruby <span class="nt">-e</span> <span class="s1">'p ((0.24901079128550474)...(340.25008088980684)).step(34.00010700985213).to_a[-1]'</span>
306.24997387995467
</code></pre>
<p><strong>Environment</strong><br>
This was observed in versions <code>2.7.0</code> and <code>2.6.5</code>.</p>
</blockquote> Ruby master - Bug #16612: Enumerator::ArithmeticSequence#last with float range produces incorrect valuehttps://redmine.ruby-lang.org/issues/16612?journal_id=917622021-04-29T22:22:58Zjeremyevans0 (Jeremy Evans)merch-redmine@jeremyevans.net
<ul></ul><p>I've traced this to an off-by-one in <code>ruby_float_step_size</code>. I've submitted a pull request to fix this: <a href="https://github.com/ruby/ruby/pull/4434" class="external">https://github.com/ruby/ruby/pull/4434</a></p>
<p><a class="user active user-mention" href="https://redmine.ruby-lang.org/users/772">@Eregon (Benoit Daloze)</a> Unfortunately, you can't get <code>#each</code> to work like repeated edition without breaking backwards compatibility. It can change terminating loops into infinite loops in pathologic cases, and such pathological cases are part of the test suite. I tried that approach first (<a href="https://github.com/jeremyevans/ruby/commit/962edf65affe8ab1fc18b9a46317c543ef31bec8" class="external">https://github.com/jeremyevans/ruby/commit/962edf65affe8ab1fc18b9a46317c543ef31bec8</a>).</p> Ruby master - Bug #16612: Enumerator::ArithmeticSequence#last with float range produces incorrect valuehttps://redmine.ruby-lang.org/issues/16612?journal_id=922722021-05-29T15:56:46Zjeremyevans (Jeremy Evans)code@jeremyevans.net
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Closed</i></li></ul><p>Applied in changeset <a class="changeset" title="Fix Enumerator::ArithmeticSequence handling of float ranges Depending on the float range, there ..." href="https://redmine.ruby-lang.org/projects/ruby-master/repository/git/revisions/f516379853f36d143d820c55d5eeaa9fc410ef52">git|f516379853f36d143d820c55d5eeaa9fc410ef52</a>.</p>
<hr>
<p>Fix Enumerator::ArithmeticSequence handling of float ranges</p>
<p>Depending on the float range, there could be an off-by-one error,<br>
where the last result that should be in the range was missed. Fix<br>
this by checking if the computed value for the expected value<br>
outside the range is still inside the range, and if so, increment<br>
the step size.</p>
<p>Fixes [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Enumerator::ArithmeticSequence#last with float range produces incorrect value (Closed)" href="https://redmine.ruby-lang.org/issues/16612">#16612</a>]</p>