<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
					xmlns:atom="http://www.w3.org/2005/Atom"
				  >
<channel>
<atom:link rel="self"  type="application/rss+xml"  href="http://rulinux.net/rss_from_sect_4_subsect_6_thread_42561"  />
<title>rulinux.net - Форум - Development - [C] Как справиться с float?</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Форум - Development - [C] Как справиться с float?</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>Re:[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216452</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216452</guid>
<pubDate>Fri, 01 Jul 2016 11:48:53 +0300</pubDate>
<description><![CDATA[<p>Мне нужно isequal(), isgreater() и так можно простым сравнением понять, тем более это просто макросы:<br><br><fieldset><legend>c</legend><div class="highlight c"><br />
<span class="co2"># &nbsp;define isgreater(x, y) \<br />
&nbsp; (__extension__ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\<br />
&nbsp; &nbsp;({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \<br />
&nbsp; &nbsp; &nbsp; !isunordered (__x, __y) &amp;&amp; __x &gt; __y; }))</span><br />
&nbsp;</div></fieldset></p>]]></description>
</item>
<item>
<title>Re:[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216451</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216451</guid>
<pubDate>Fri, 01 Jul 2016 10:45:35 +0300</pubDate>
<description><![CDATA[<p>Да ладно, банально подключаешь заголовочный файл math.h и банально пользуешься функцией <a href="http://en.cppreference.com/w/c/numeric/math/isgreater">isgreater()</a>... Хотя не уверен, что она сравнивает с учётом Эпсилона (если числа различаются не больше чем на эпсилон, то они должны считаться равными ИМХО).</p>]]></description>
</item>
<item>
<title>Re:[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216450</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216450</guid>
<pubDate>Fri, 01 Jul 2016 07:29:07 +0300</pubDate>
<description><![CDATA[<p>Вот за такие фокусы я и ненавижу все эти флоаты с даблами. Даже банально сравнить два числа нельзя, хотя везде 0,1.</p>]]></description>
</item>
<item>
<title>Re:[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216449</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216449</guid>
<pubDate>Thu, 30 Jun 2016 18:01:07 +0300</pubDate>
<description><![CDATA[<p>&gt; тут наверное преобразование типов происходит в принтфе из флота в инт с укругленем
<br><br>
Укруглень там своеобразный:
<br><br>
<fieldset><legend>c</legend><div class="highlight c"><br />
<span class="co2">#include &lt;stdio.h&gt;</span><br />
<br />
<span class="kw4">int</span> main <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%.33f<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> 1.0<span class="sy0">/</span>10.0<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// double is used by default</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> n<span class="sy0">=</span>1.0<span class="sy0">/</span><span class="nu16">10.0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%.33f<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> n<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">double</span> m<span class="sy0">=</span>1.0<span class="sy0">/</span><span class="nu16">10.0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%.33f<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> m<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div></fieldset>

<fieldset><legend>text</legend><div class="highlight text"><br />
0.100000000000000005551115123125783<br />
0.100000001490116119384765625000000<br />
0.100000000000000005551115123125783<br />
&nbsp;</div></fieldset></p>]]></description>
</item>
<item>
<title>Re:[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216448</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216448</guid>
<pubDate>Thu, 30 Jun 2016 17:54:28 +0300</pubDate>
<description><![CDATA[<p>Кстати, нашёл минимальную разницу между 10000319 и 10000320:

<fieldset><legend>c</legend><div class="highlight c"><br />
<span class="co2">#include &lt;stdio.h&gt;</span><br />
<br />
<span class="kw4">int</span> main <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> a <span class="sy0">=</span> <span class="nu16">10000319.499999999068677425384521484375</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> b <span class="sy0">=</span> <span class="nu16">10000319.499999999068677425384521484374</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%f %f<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> a<span class="sy0">,</span> b<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div></fieldset>

<fieldset><legend>text</legend><div class="highlight text"><br />
10000320.000000 10000319.000000<br />
&nbsp;</div></fieldset></p>]]></description>
</item>
<item>
<title>Re:[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216446</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216446</guid>
<pubDate>Thu, 30 Jun 2016 17:35:22 +0300</pubDate>
<description><![CDATA[<p>не. там 8 знаков, надо определения смотреть размерности типов и какой тип принт может печатать, а вообще на такой затык наткнешься - не поймешь даже </p>]]></description>
</item>
<item>
<title>Re:[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216445</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216445</guid>
<pubDate>Thu, 30 Jun 2016 17:34:06 +0300</pubDate>
<description><![CDATA[<p>Семь знаков передано без искажений?</p>]]></description>
</item>
<item>
<title>Re:[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216444</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216444</guid>
<pubDate>Thu, 30 Jun 2016 17:28:34 +0300</pubDate>
<description><![CDATA[<p>хотя тут наверное преобразование типов происходит в принтфе из флота в инт с укругленем</p>]]></description>
</item>
<item>
<title>Re:[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216443</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216443</guid>
<pubDate>Thu, 30 Jun 2016 17:18:22 +0300</pubDate>
<description><![CDATA[<p><fieldset><legend>c</legend><div class="highlight c"><br />
<br />
<span class="co2">#include &lt;stdio.h&gt;</span><br />
<br />
<span class="kw4">int</span> main <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> x <span class="sy0">=</span> <span class="nu16">10000319.870806</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> y <span class="sy0">=</span> <span class="nu16">10000207.611958</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%f %f<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> x<span class="sy0">,</span> y<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<br />
<span class="br0">&#91;</span>vilfred@localhost ~<span class="br0">&#93;</span>$ cc y.<span class="me1">c</span><br />
<span class="br0">&#91;</span>vilfred@localhost ~<span class="br0">&#93;</span>$ .<span class="sy0">/</span>a.<span class="me1">out</span> <br />
<span class="nu16">10000320.000000</span> <span class="nu16">10000208.000000</span><br />
<span class="br0">&#91;</span>vilfred@localhost ~<span class="br0">&#93;</span>$ <span class="sy0">^</span>C<br />
<span class="br0">&#91;</span>vilfred@localhost ~<span class="br0">&#93;</span>$ <br />
<span class="br0">&#91;</span>vilfred@localhost ~<span class="br0">&#93;</span>$ cc <span class="sy0">-</span>v<br />
Используются внутренние спецификации.<br />
<span class="me1">COLLECT_GCC</span><span class="sy0">=/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span>cc<br />
COLLECT_LTO_WRAPPER<span class="sy0">=/</span>usr<span class="sy0">/</span>libexec<span class="sy0">/</span>gcc<span class="sy0">/</span>x86_64<span class="sy0">-</span>redhat<span class="sy0">-</span>linux<span class="sy0">/</span>5.3.1<span class="sy0">/</span>lto<span class="sy0">-</span>wrapper<br />
Целевая архитектура<span class="sy0">:</span> x86_64<span class="sy0">-</span>redhat<span class="sy0">-</span>linux<br />
Параметры конфигурации<span class="sy0">:</span> ..<span class="sy0">/</span>configure <span class="sy0">--</span>enable<span class="sy0">-</span>bootstrap <span class="sy0">--</span>enable<span class="sy0">-</span>languages<span class="sy0">=</span>c<span class="sy0">,</span>c<span class="sy0">++,</span>objc<span class="sy0">,</span>obj<span class="sy0">-</span>c<span class="sy0">++,</span>fortran<span class="sy0">,</span>ada<span class="sy0">,</span>go<span class="sy0">,</span>lto <span class="sy0">--</span>prefix<span class="sy0">=/</span>usr <span class="sy0">--</span>mandir<span class="sy0">=/</span>usr<span class="sy0">/</span>share<span class="sy0">/</span>man <span class="sy0">--</span>infodir<span class="sy0">=/</span>usr<span class="sy0">/</span>share<span class="sy0">/</span>info <span class="sy0">--</span>with<span class="sy0">-</span>bugurl<span class="sy0">=</span>http<span class="sy0">:</span><span class="co1">//bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --disable-libgcj --with-isl --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux</span><br />
Модель многопоточности<span class="sy0">:</span> posix<br />
gcc версия 5.3.1 <span class="nu0">20160406</span> <span class="br0">&#40;</span>Red Hat 5.3.1<span class="sy0">-</span><span class="nu0">6</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>GCC<span class="br0">&#41;</span> <br />
<span class="br0">&#91;</span>vilfred@localhost ~<span class="br0">&#93;</span>$ <br />
<br />
&nbsp;</div></fieldset><br><br>чо за бред</p>]]></description>
</item>
<item>
<title>Re:[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216442</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216442</guid>
<pubDate>Thu, 30 Jun 2016 17:14:50 +0300</pubDate>
<description><![CDATA[<p>фигассе, а потом самолеты падают ....</p>]]></description>
</item>
<item>
<title>Re:[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216441</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216441</guid>
<pubDate>Thu, 30 Jun 2016 16:25:49 +0300</pubDate>
<description><![CDATA[<p>А там не важно сколько знаков после запятой, важно сколько знаков в числе всего (исключая любые ведущие нули, даже если они после точки). Насколько я понимаю <a href="https://en.wikipedia.org/wiki/Machine_epsilon">это</a>, float примерно до седьмого знака должен соответствовать исходному числу (1.19e-07). </p>]]></description>
</item>
<item>
<title>Re:[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216440</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216440</guid>
<pubDate>Thu, 30 Jun 2016 15:25:49 +0300</pubDate>
<description><![CDATA[<p>Мне казалось, что раз диапазон флоата <a href="https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%BE%D0%B4%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8">заявлен</a> как 1.175494351 × 10<sup>−38</sup>...3.4028234 × 10<sup>38</sup>, то число с 6-ю знаками после запятой легко в него поместяться. Если это не так, зачем вводить людей в заблуждения такими гиганскими цифрами?</p>]]></description>
</item>
<item>
<title>Re:[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216438</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216438</guid>
<pubDate>Thu, 30 Jun 2016 15:03:54 +0300</pubDate>
<description><![CDATA[<p>Хмм, непростой случай, надо отметить. Тут такое дело - если в программе слово &quot;float&quot; заменить словом &quot;double&quot;, то на какое-то время тебя попустит. Но это скользкий путь, ведь потом ты придёшь снова за новой дозой и на этот раз знаков в твоих числах уже будет значительно больше.
Раз и навсегда избавиться от твоей проблемы помогут только <a href="https://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic">очень тяжёлые вещества</a>, обычно прописываемые в подобной ситуации.
</p>]]></description>
</item>
<item>
<title>[C] Как справиться с float?</title>
<link>https://rulinux.net/message.php?newsid=42561&amp;page=1#216437</link>
<guid>https://rulinux.net/message.php?newsid=42561&amp;page=1#216437</guid>
<pubDate>Thu, 30 Jun 2016 14:35:04 +0300</pubDate>
<description><![CDATA[<p>Дано:<br><br><fieldset><legend>c</legend><div class="highlight c"><br />
<span class="co2">#include &lt;stdio.h&gt;</span><br />
<br />
<span class="kw4">int</span> main <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> x <span class="sy0">=</span> <span class="nu16">319.870806</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> y <span class="sy0">=</span> <span class="nu16">207.611958</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%f %f<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> x<span class="sy0">,</span> y<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span> &nbsp; &nbsp; &nbsp; <br />
&nbsp;</div></fieldset><br><br>На выходе имеем:<br><br><fieldset><legend>text</legend><div class="highlight text"><br />
&gt;./a.out <br />
319.870819 207.611954<br />
&nbsp;</div></fieldset><br><br>Обратите внимание на последние цифры: было ...806, стало ...819; было ... 958, стало ...954. Какого, простите, №%#$?!! Как с таким поведением бороться?</p>]]></description>
</item>
</channel>
</rss>