<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[C++11 isnan]]></title><description><![CDATA[<p>ich habe gerade <a href="http://en.cppreference.com/w/cpp/numeric/math/isnan" rel="nofollow">http://en.cppreference.com/w/cpp/numeric/math/isnan</a> gefunden und wundere mich ein wenig über ein paar dinge:</p>
<p>1. wieso kein template, was spezialisiert wird? wie bei swap?</p>
<pre><code class="language-cpp">class my_number
{
  /* ... */
};

int isnan(const my_number&amp; val)
{
  /* ... */

  return false;
}

template &lt;typename T&gt;
T my_save_div(T lhs, const T&amp; rhs)
{
  using std::isnan;

  if( isnan(lhs) || isnan(rhs) )
    throw &quot;asd1&quot;;

  if( rhs == T(0) )
    throw &quot;asd2&quot;;

  return lhs /= rhs;
}

int main()
{
  std::cout &lt;&lt; my_save_div(my_number(3), my_number(2)) &lt;&lt; std::endl;
  std::cout &lt;&lt; my_save_div(3, 2) &lt;&lt; std::endl;
  std::cout &lt;&lt; my_save_div(3.f, 2.f) &lt;&lt; std::endl;
//usw.
}
</code></pre>
<p>geht jetzt ja nicht so wirklich.</p>
<p>2. wieso int statt bool als rückgabewert? vermutlich, um einfache bit-operationen mit den zukünftigen makros FP_... (siehe <a href="http://en.cppreference.com/w/cpp/numeric/math/FP_categories" rel="nofollow">http://en.cppreference.com/w/cpp/numeric/math/FP_categories</a> ) zu ermöglichen, aber einen wirklichen Vorteil sehe ich dadurch auch nicht.</p>
<p>bb</p>
<p>PS: Wieso eigentlich makros für FP_... und keine konstanten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/297443/c-11-isnan</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 11:03:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297443.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Dec 2011 19:39:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++11 isnan on Wed, 28 Dec 2011 19:39:41 GMT]]></title><description><![CDATA[<p>ich habe gerade <a href="http://en.cppreference.com/w/cpp/numeric/math/isnan" rel="nofollow">http://en.cppreference.com/w/cpp/numeric/math/isnan</a> gefunden und wundere mich ein wenig über ein paar dinge:</p>
<p>1. wieso kein template, was spezialisiert wird? wie bei swap?</p>
<pre><code class="language-cpp">class my_number
{
  /* ... */
};

int isnan(const my_number&amp; val)
{
  /* ... */

  return false;
}

template &lt;typename T&gt;
T my_save_div(T lhs, const T&amp; rhs)
{
  using std::isnan;

  if( isnan(lhs) || isnan(rhs) )
    throw &quot;asd1&quot;;

  if( rhs == T(0) )
    throw &quot;asd2&quot;;

  return lhs /= rhs;
}

int main()
{
  std::cout &lt;&lt; my_save_div(my_number(3), my_number(2)) &lt;&lt; std::endl;
  std::cout &lt;&lt; my_save_div(3, 2) &lt;&lt; std::endl;
  std::cout &lt;&lt; my_save_div(3.f, 2.f) &lt;&lt; std::endl;
//usw.
}
</code></pre>
<p>geht jetzt ja nicht so wirklich.</p>
<p>2. wieso int statt bool als rückgabewert? vermutlich, um einfache bit-operationen mit den zukünftigen makros FP_... (siehe <a href="http://en.cppreference.com/w/cpp/numeric/math/FP_categories" rel="nofollow">http://en.cppreference.com/w/cpp/numeric/math/FP_categories</a> ) zu ermöglichen, aber einen wirklichen Vorteil sehe ich dadurch auch nicht.</p>
<p>bb</p>
<p>PS: Wieso eigentlich makros für FP_... und keine konstanten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161610</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 28 Dec 2011 19:39:41 GMT</pubDate></item><item><title><![CDATA[Reply to C++11 isnan on Wed, 28 Dec 2011 19:44:27 GMT]]></title><description><![CDATA[<p>C</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161613</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 28 Dec 2011 19:44:27 GMT</pubDate></item><item><title><![CDATA[Reply to C++11 isnan on Wed, 28 Dec 2011 19:56:44 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>C</p>
</blockquote>
<p>das argument ist ein wenig schwach. im prinzip so gar gar keins. alle, die bisher funktionen aus dem c-standard genommen haben, haben keine nachteile davon und mit nem ifdef im math-header könnte man auch weiterhin noch die implementierung von cmath und math.h in den gleichen header schreiben - wie das ja bis jetzt (zumindest bei ms) gemacht wird.</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161614</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 28 Dec 2011 19:56:44 GMT</pubDate></item><item><title><![CDATA[Reply to C++11 isnan on Wed, 28 Dec 2011 20:16:55 GMT]]></title><description><![CDATA[<p>Wieso kein Template: Es gibt drei, und zwar genau drei, Datentypen bei denen isnan Verwendung finden kann. Daher: Überladung. swap kann für alle Datentypen in Betracht kommen, die == können, also auch benutzerdefinierte Typen. Daher Template.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161625</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 28 Dec 2011 20:16:55 GMT</pubDate></item><item><title><![CDATA[Reply to C++11 isnan on Wed, 28 Dec 2011 20:22:15 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Wieso kein Template: Es gibt drei, und zwar genau drei, Datentypen bei denen isnan Verwendung finden kann. Daher: Überladung. swap kann für alle Datentypen in Betracht kommen, die == können, also auch benutzerdefinierte Typen. Daher Template.</p>
</blockquote>
<p>vorteil: ein paar wenige ms compilezeit gespart<br />
nachteil: und man muss seine eigenen templates dann für alle anderen typen spezialisieren</p>
<p>find ich nicht sonderlich toll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161628</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 28 Dec 2011 20:22:15 GMT</pubDate></item><item><title><![CDATA[Reply to C++11 isnan on Wed, 28 Dec 2011 21:17:46 GMT]]></title><description><![CDATA[<p>Was für einen Sinn soll ein Template fur isnan machen? Wie soll ein universeller Code zum Feststellen des Konzepts von NaN aussehen?</p>
<pre><code class="language-cpp">template&lt;typename T&gt; bool isnan(T var)
{
    volatile T d = var;
    return d != d;
}
</code></pre>
<p>So? Mit welchen Typen soll das sinnvoll gehen? Wenn du deine eigene Fließkommaklasse schreibst, dann überlad eben die Funktion. Für 99.9999999 % aller Klassen die den Operator= und Operator!= kennen ist diese Funktion nutzlos. Höchstwahrscheinlich wäre deine eigene Implementierung auch viel besser, weil sie die interne Repräsentation benutzen kann.</p>
<p>Überladung ist ein tolles Sprachmittel und hier total angesagt. Du würdest ja auch nicht sin() als Template implementieren, um eigene arithmetische Datentypen benutzen zu können. Oder? Falls doch (bitte nicht!), wo sähest du den Vorteil?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161646</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 28 Dec 2011 21:17:46 GMT</pubDate></item><item><title><![CDATA[Reply to C++11 isnan on Wed, 28 Dec 2011 21:22:48 GMT]]></title><description><![CDATA[<p>Die Referenz ist an dieser Stelle fehlerhaft. Aus C++11:</p>
<blockquote>
<p>The classification/comparison functions behave the same as the C macros with the corresponding names defined in 7.12.3, Classification macros, and 7.12.14, Comparison macros in the C Standard. Each function is overloaded for the three floating-point types, as follows:</p>
<p>(...)</p>
<p>bool isnan(float x);</p>
<p>(...)</p>
<p>bool isnan(double x);</p>
<p>(...)</p>
<p>bool isnan(long double x);</p>
</blockquote>
<p>Die Funktionen isinf, isfinite, isnormal und signbit sowie die Funktionsfamilie isgreater, isless etc. geben ebenfalls bool zurück.</p>
<p>Ansonsten ist mir unklar, wie sinnvolle Funktionsvorlagen hier arbeiten sollten. Welche wohldefinierte Eigenschaft von NaN willst du denn ausnutzen? Wie erkennt man ohne genaueres Wissen über den konkreten Datentypen Unendlich? Ich sehe auch nicht, welche Nachteile sich durch überladene Funktionen ergeben; der Code, den du oben als fehlerhaft bezeichnest, ist (wenn man die fehlenden Funktionen hinzufügt) gültig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161651</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Wed, 28 Dec 2011 21:22:48 GMT</pubDate></item><item><title><![CDATA[Reply to C++11 isnan on Thu, 29 Dec 2011 07:47:12 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>1. wieso kein template, was spezialisiert wird? wie bei swap?</p>
</blockquote>
<p>Wozu denn?</p>
<p>unskilled schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class my_number
{
  /* ... */
};

int isnan(const my_number&amp; val)
{
  /* ... */

  return false;
}

template &lt;typename T&gt;
T my_save_div(T lhs, const T&amp; rhs)
{
  using std::isnan;

  if( isnan(lhs) || isnan(rhs) )
    throw &quot;asd1&quot;;

  if( rhs == T(0) )
    throw &quot;asd2&quot;;

  return lhs /= rhs;
}

int main()
{
  std::cout &lt;&lt; my_save_div(my_number(3), my_number(2)) &lt;&lt; std::endl;
  std::cout &lt;&lt; my_save_div(3, 2) &lt;&lt; std::endl;
  std::cout &lt;&lt; my_save_div(3.f, 2.f) &lt;&lt; std::endl;
//usw.
}
</code></pre>
<p>geht jetzt ja nicht so wirklich.</p>
</blockquote>
<p>Was &quot;geht jetzt ja nicht so wirklich&quot; ?! Es sieht doch gut aus. Deine Verwendung von isnan ist unqualifiziert. Von daher ist ADL für Deinen benutzerdefinierten Typ aktiv.</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>2. wieso int statt bool als rückgabewert?</p>
</blockquote>
<p>C99 Kompatibilität, würde ich mal raten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161695</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 29 Dec 2011 07:47:12 GMT</pubDate></item><item><title><![CDATA[Reply to C++11 isnan on Thu, 29 Dec 2011 14:56:32 GMT]]></title><description><![CDATA[<p><code>std::cout &lt;&lt; my_save_div(3, 2) &lt;&lt; std::endl;</code><br />
in my_save_div wird dann aber keine überladung für isnan(int) gefunden.</p>
<blockquote>
<p>Wie soll ein universeller Code zum Feststellen des Konzepts von NaN aussehen?</p>
</blockquote>
<p>das template gibt einfach false zurück und wird für float, double und long double spezialisiert. und für eigene datentypen falls sinnvoll (brüche, ...).</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161834</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 29 Dec 2011 14:56:32 GMT</pubDate></item><item><title><![CDATA[Reply to C++11 isnan on Thu, 29 Dec 2011 15:07:06 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>das template gibt einfach false zurück und wird für float, double und long double spezialisiert. und für eigene datentypen falls sinnvoll (brüche, ...).</p>
</blockquote>
<p>Du beschreibst Überladung. Und zwar schlechte, denn sie gibt keinen Compilerfehler im Falle eines Logikfehlers (falscher Typ) zurück, stattdessen ein schwachsinniges Ergebnis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161836</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 29 Dec 2011 15:07:06 GMT</pubDate></item><item><title><![CDATA[Reply to C++11 isnan on Thu, 29 Dec 2011 15:54:58 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Du beschreibst Überladung. Und zwar schlechte, denn sie gibt keinen Compilerfehler im Falle eines Logikfehlers (falscher Typ) zurück, stattdessen ein schwachsinniges Ergebnis.</p>
</blockquote>
<p>meiner meinung nach kann es für so etwas keinen falschen typen geben.<br />
wenn das objekt kein NaN darstellen kann, gibt die funktion eben stumpf false zurück - hat für mich wenig mit einem logikfehler zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161853</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 29 Dec 2011 15:54:58 GMT</pubDate></item><item><title><![CDATA[Reply to C++11 isnan on Thu, 29 Dec 2011 16:10:40 GMT]]></title><description><![CDATA[<p>Und wieso ist es false? Ein Auto ist ganz klar keine Zahl. Wieso gibt isnan für meine Klasse Auto dann false zurück (Übrigens selbst bei meinem obigen Beispielcode, was nur zeigt, dass das Konzept sich nicht allgemein fassen lässt)? Aber der int ist ganz eindeutig eine Zahl, egal welchen Wert er hat. Und auch meine eigene Quaternionenklasse kann nur Zahlen darstellen. Soll ich die jetzt alle spezialisieren für nix? Oder doch lieber alle nicht-arithmetischen Klassen?</p>
<p>Außerdem habe ich bestimmt nicht gemeint, isnan auf ein Auto oder ein Quaternion anzuwenden, denn ich kenne das Ergebnis schon. Habe also einen Programmierfehler. Ich merke es aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161863</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 29 Dec 2011 16:10:40 GMT</pubDate></item><item><title><![CDATA[Reply to C++11 isnan on Thu, 29 Dec 2011 16:27:00 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Außerdem habe ich bestimmt nicht gemeint, isnan auf ein Auto oder ein Quaternion anzuwenden, denn ich kenne das Ergebnis schon. Habe also einen Programmierfehler. Ich merke es aber nicht.</p>
</blockquote>
<p>stimmt - an nicht-arithmetische-typen hab ich gar nicht gedacht...^^ ok, dann leuchtet es fast ein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>also läufts schlussendlich im kostruierten bsp doch auf ein</p>
<pre><code class="language-cpp">namespace detail
{
  bool isnan(int)
  {
    return false;
  }
//bool isnan(short) etc.
}

template &lt;typename T&gt;
T my_save_div(T lhs, const T&amp; rhs)
{
  using std::isnan;
  using detail:isnan;

  if( isnan(lhs) || isnan(rhs) )
    throw &quot;asd1&quot;;

  if( rhs == T(0) )
    throw &quot;asd2&quot;;

  return lhs /= rhs;
}

int main()
{
  my_save_div(4,2);
  my_save_div(3,0);
}
</code></pre>
<p>vermutlich kann man da auch mit enable_if und ner numeric-trait-klasse was schöneres bauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161869</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 29 Dec 2011 16:27:00 GMT</pubDate></item><item><title><![CDATA[Reply to C++11 isnan on Thu, 29 Dec 2011 17:49:55 GMT]]></title><description><![CDATA[<p>Mit traits sieht es evtl. so aus:</p>
<pre><code class="language-cpp">#include &lt;cmath&gt;
#include &lt;limits&gt;
#include &lt;utility&gt;

template &lt;typename T, typename = typename std::enable_if&lt;std::numeric_limits&lt;T&gt;::is_specialized &amp;&amp; std::numeric_limits&lt;T&gt;::has_quiet_NaN&gt;::type&gt;
bool my_isnan(const T&amp; v)
{
    using std::isnan;
    return isnan( v );
}

template &lt;typename T, bool hack = true, typename = typename std::enable_if&lt;std::numeric_limits&lt;T&gt;::is_specialized &amp;&amp; !std::numeric_limits&lt;T&gt;::has_quiet_NaN&gt;::type&gt;
constexpr bool my_isnan(const T&amp;)
{
    return true;
}

template &lt;typename T, typename = typename std::enable_if&lt;std::numeric_limits&lt;T&gt;::is_specialized &amp;&amp; std::numeric_limits&lt;T&gt;::has_infinity&gt;::type&gt;
bool my_isinf(const T&amp; v)
{
    using std::isinf;
    return isinf( v );
}

template &lt;typename T, bool hack = true, typename = typename std::enable_if&lt;std::numeric_limits&lt;T&gt;::is_specialized &amp;&amp; !std::numeric_limits&lt;T&gt;::has_infinity&gt;::type&gt;
constexpr bool my_isinf(const T&amp;)
{
    return false;
}

template &lt;typename T, typename = typename std::enable_if&lt;std::numeric_limits&lt;T&gt;::is_specialized&gt;::type&gt;
constexpr bool my_iszero(const T&amp; v)
{
    return v == T();
}

template &lt;typename T, typename U&gt;
auto my_save_div(T&amp;&amp; lhs, U&amp;&amp; rhs) -&gt; decltype( lhs / rhs )
{
  return my_isnan(lhs) || my_isnan(rhs) ? throw &quot;NaN&quot;
      : my_isinf(lhs) &amp;&amp; my_isinf(rhs) ? throw &quot;inf//inf&quot;
      : my_iszero(rhs) ? throw &quot;//0&quot;
      : std::forward&lt;T&gt;( lhs ) / std::forward&lt;U&gt;( rhs );
}
</code></pre>
<p>(hack dient nur dazu, die Überladungen für die ODR auseinanderzuhalten, weil Defaultargumente nicht Teil der Signatur sind.)<br />
Ob das dann Sinn macht ist eine anderer Frage und hängt davon ab, was man als &quot;safe&quot; betrachtet. Schließlich kann es auch hier passieren, dass plötzlich Unendlichkeiten (und dann in Folgeberechnungen NaNs) entstehen, weil das Ergebnis zu groß für eine endliche Darstellung ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161906</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 29 Dec 2011 17:49:55 GMT</pubDate></item></channel></rss>