{"id":4459,"date":"2019-07-04T09:22:34","date_gmt":"2019-07-04T08:22:34","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=4459"},"modified":"2019-07-04T09:34:59","modified_gmt":"2019-07-04T08:34:59","slug":"c-guns-fingerubung-can-convert-double-to-int","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=4459","title":{"rendered":"C++ Guns: Finger\u00fcbung: can convert double to int?"},"content":{"rendered":"<p>Wir bekommen \u00f6fter mal gro\u00dfe integer Zahlen als double gespeichert in den Daten. Beim konvertieren nach Text (andere story) mit 6 signifikanten Ziffern und wissenschaftlicher Darstellung fallen Ziffern weg. Obwohl die wissenschaftliche Darstellung mit einem Exponent bei ganzen Zahlen nicht n\u00f6tig w\u00e4re.<\/p>\n<p>Finger\u00fcbung: Schreibe eine Funktion die true zur\u00fcck gibt, wenn die \u00fcbergebene double Zahl in ein 32bit signed integer, ohne Verluste, passt.<\/p>\n<p>Da es UB ist, eine zu gro\u00dfe double Zahl einem int zuzuweisen (mit constexpr \u00fcberpr\u00fcft), ist die Aufgabe nicht ganz so trivial.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nconstexpr int xxx = std::numeric_limits&lt;int&gt;::max()+1.0; \/\/ error: overflow in constant expression\r\n<\/pre>\n<p>Noch dazu kann ein Integer mehr negative Zahlen als positive Speichern (Die Null z\u00e4hl mit). Und es gibt nat\u00fcrlich noch Inf und Nan.<br \/>\nNach drei Versuchen sieht der Code nun wie folgt aus. constexpr Test inklusive.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;limits&gt;\r\n#include &lt;cmath&gt;\r\n\r\nconstexpr inline bool canConvertToInt(double d) {\r\n  if(std::isnan(d) or std::isinf(d)) return false;\r\n  if(d &gt; 0) {\r\n    return d &lt;= std::numeric_limits&lt;int&gt;::max() and d-int(d)==0;\r\n  } else {\r\n    return d &gt;= std::numeric_limits&lt;int&gt;::min() and d-int(d)==0;\r\n  }\r\n}\r\n\r\n  static_assert(canConvertToInt(std::numeric_limits&lt;int&gt;::max()-1));\r\n  static_assert(not canConvertToInt(std::numeric_limits&lt;int&gt;::max()-1 + 0.5));\r\n  static_assert(canConvertToInt(std::numeric_limits&lt;int&gt;::max()));\r\n  static_assert(not canConvertToInt(std::numeric_limits&lt;int&gt;::max()+0.5));\r\n\r\n  static_assert(canConvertToInt(std::numeric_limits&lt;int&gt;::min()+1));\r\n  static_assert(not canConvertToInt(std::numeric_limits&lt;int&gt;::min()+1-0.5));\r\n  static_assert(canConvertToInt(std::numeric_limits&lt;int&gt;::min()));\r\n  static_assert(not canConvertToInt(std::numeric_limits&lt;int&gt;::min()-0.5));\r\n\r\n  static_assert(not canConvertToInt(std::numeric_limits&lt;double&gt;::infinity()));\r\n  static_assert(not canConvertToInt(std::numeric_limits&lt;double&gt;::quiet_NaN()));\r\n  static_assert(not canConvertToInt(std::numeric_limits&lt;double&gt;::signaling_NaN()));\r\n  static_assert(not canConvertToInt(std::numeric_limits&lt;double&gt;::denorm_min()));\r\n<\/pre>\n<p>Der Praxistest kann beginnen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wir bekommen \u00f6fter mal gro\u00dfe integer Zahlen als double gespeichert in den Daten. Beim konvertieren nach Text (andere story) mit 6 signifikanten Ziffern und wissenschaftlicher Darstellung fallen Ziffern weg. Obwohl die wissenschaftliche Darstellung mit einem Exponent bei ganzen Zahlen nicht n\u00f6tig w\u00e4re. Finger\u00fcbung: Schreibe eine Funktion die true zur\u00fcck gibt, wenn die \u00fcbergebene double Zahl [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-4459","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4459","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4459"}],"version-history":[{"count":4,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4459\/revisions"}],"predecessor-version":[{"id":4463,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4459\/revisions\/4463"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4459"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}