https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2014-05-13T10:28:43Z
Ruby Issue Tracking System
Ruby master - Feature #9834: Float#{next_float,prev_float}
https://bugs.ruby-lang.org/issues/9834?journal_id=46711
2014-05-13T10:28:43Z
phasis68 (Heesob Park)
phasis@gmail.com
<ul></ul><p>Here is a pure ruby implementation of <code>Float#{next_float,prev_float}</code> (adopted from <a href="http://golang.org/src/pkg/math/nextafter.go" class="external">http://golang.org/src/pkg/math/nextafter.go</a>)</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">Float</span>
<span class="k">def</span> <span class="nf">dbl2num</span><span class="p">(</span><span class="n">dbl</span><span class="p">)</span>
<span class="p">[</span><span class="n">dbl</span><span class="p">].</span><span class="nf">pack</span><span class="p">(</span><span class="s1">'d'</span><span class="p">).</span><span class="nf">unpack</span><span class="p">(</span><span class="s1">'Q'</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">num2dbl</span><span class="p">(</span><span class="n">num</span><span class="p">)</span>
<span class="p">[</span><span class="n">num</span><span class="p">].</span><span class="nf">pack</span><span class="p">(</span><span class="s1">'Q'</span><span class="p">).</span><span class="nf">unpack</span><span class="p">(</span><span class="s1">'d'</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">nextafter</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">y</span><span class="p">.</span><span class="nf">to_f</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">self</span><span class="p">.</span><span class="nf">nan?</span> <span class="o">||</span> <span class="n">y</span><span class="p">.</span><span class="nf">nan?</span><span class="p">)</span>
<span class="no">Float</span><span class="o">::</span><span class="no">NAN</span>
<span class="k">elsif</span> <span class="nb">self</span> <span class="o">==</span> <span class="n">y</span>
<span class="n">y</span>
<span class="k">elsif</span> <span class="nb">self</span> <span class="o">==</span> <span class="mi">0</span>
<span class="n">num2dbl</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">y</span><span class="o"><=></span><span class="mf">0.0</span><span class="p">)</span>
<span class="k">elsif</span> <span class="p">(</span><span class="n">y</span> <span class="o">></span> <span class="nb">self</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="nb">self</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span>
<span class="n">num2dbl</span><span class="p">(</span><span class="n">dbl2num</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">else</span>
<span class="n">num2dbl</span><span class="p">(</span><span class="n">dbl2num</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">prev_float</span>
<span class="n">nextafter</span><span class="p">(</span><span class="o">-</span><span class="no">Float</span><span class="o">::</span><span class="no">INFINITY</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">next_float</span>
<span class="n">nextafter</span><span class="p">(</span><span class="no">Float</span><span class="o">::</span><span class="no">INFINITY</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
Ruby master - Feature #9834: Float#{next_float,prev_float}
https://bugs.ruby-lang.org/issues/9834?journal_id=46712
2014-05-13T12:27:48Z
akr (Akira Tanaka)
akr@fsij.org
<ul></ul><p>Thank you for an interesting implementation.</p>
<p>Heesob Park wrote:</p>
<blockquote>
<pre><code> if (self==Float::NAN || y==Float::NAN)
</code></pre>
</blockquote>
<p>This doesn't work. Float#nan? should be used.</p>
<blockquote>
<pre><code> elsif self == y
r = self
</code></pre>
</blockquote>
<p>This should be "r = y" to to follow C99's nextafter() behavior.<br>
(It doesn't affect <code>next_float</code> and <code>prev_float</code>, though.)</p>
Ruby master - Feature #9834: Float#{next_float,prev_float}
https://bugs.ruby-lang.org/issues/9834?journal_id=46773
2014-05-17T07:30:56Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul></ul><p>Accepted.</p>
<p>Matz.</p>
Ruby master - Feature #9834: Float#{next_float,prev_float}
https://bugs.ruby-lang.org/issues/9834?journal_id=46775
2014-05-17T12:17:26Z
marcandre (Marc-Andre Lafortune)
marcandre-ruby-core@marc-andre.ca
<ul></ul><p>Float#next or Float#next_float?</p>
<p>Yukihiro Matsumoto wrote:</p>
<blockquote>
<p>Accepted.</p>
<p>Matz.</p>
</blockquote>
Ruby master - Feature #9834: Float#{next_float,prev_float}
https://bugs.ruby-lang.org/issues/9834?journal_id=46776
2014-05-17T12:48:24Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul><li><strong>Assignee</strong> set to <i>akr (Akira Tanaka)</i></li></ul><p>Float#next_float definitely. Float#next is too short and too simple for this method.</p>
<p>Matz.</p>
Ruby master - Feature #9834: Float#{next_float,prev_float}
https://bugs.ruby-lang.org/issues/9834?journal_id=46788
2014-05-18T00:37:18Z
akr (Akira Tanaka)
akr@fsij.org
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li><li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li></ul><p>Applied in changeset r45982.</p>
<hr>
<ul>
<li>
<p>configure.in: Check nextafter() availability.</p>
</li>
<li>
<p>include/ruby/missing.h (nextafter): New optional declaration.</p>
</li>
<li>
<p>missing/nextafter.c: New file.</p>
</li>
<li>
<p>numeric.c: Float#next_float and Float#prev_float implemented.</p>
<p><a href="/issues/9834">[ruby-core:62562]</a> [Feature <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Feature: Float#{next_float,prev_float} (Closed)" href="https://bugs.ruby-lang.org/issues/9834">#9834</a>]</p>
</li>
</ul>