﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-零度天空-随笔分类-C++</title><link>http://www.cppblog.com/netdigger/category/3813.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 15 Mar 2010 02:39:11 GMT</lastBuildDate><pubDate>Mon, 15 Mar 2010 02:39:11 GMT</pubDate><ttl>60</ttl><item><title>如何精确判断两个浮点数相等</title><link>http://www.cppblog.com/netdigger/archive/2010/03/12/109520.html</link><dc:creator>绝对零度</dc:creator><author>绝对零度</author><pubDate>Fri, 12 Mar 2010 05:00:00 GMT</pubDate><guid>http://www.cppblog.com/netdigger/archive/2010/03/12/109520.html</guid><wfw:comment>http://www.cppblog.com/netdigger/comments/109520.html</wfw:comment><comments>http://www.cppblog.com/netdigger/archive/2010/03/12/109520.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/netdigger/comments/commentRss/109520.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/netdigger/services/trackbacks/109520.html</trackback:ping><description><![CDATA[<p>怎么样判断两个浮点数精确相等？一般来说是两个数差的绝对值和一个极小值比较，如果小于这个极小就，就认为是相等。<br></p>
<p>前两天在LinuxSir上看到一个贴子，讨论这个问题，发现可以精确比较相等。<br></p>
<p>代码如下：</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdlib.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br><img id="Codehighlighter1_51_424_Open_Image" onclick="this.style.display='none'; codehighlighter1_51_424_open_text.style.display="'none';" codehighlighter1_51_424_closed_image.style.display="'inline';" codehighlighter1_51_424_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_51_424_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_51_424_closed_text.style.display="'none';" codehighlighter1_51_424_open_image.style.display="'inline';" codehighlighter1_51_424_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_51_424_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_51_424_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;a,&nbsp;b;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">please&nbsp;enter&nbsp;a&nbsp;number:</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%lf</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">a);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">please&nbsp;enter&nbsp;b&nbsp;number:</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%lf</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">b);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Input&nbsp;number&nbsp;is&nbsp;a=%f,&nbsp;b=%f\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;a,&nbsp;b);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"></span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img id="Codehighlighter1_351_377_Open_Image" onclick="this.style.display='none'; codehighlighter1_351_377_open_text.style.display="'none';" codehighlighter1_351_377_closed_image.style.display="'inline';" codehighlighter1_351_377_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_351_377_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_351_377_closed_text.style.display="'none';" codehighlighter1_351_377_open_image.style.display="'inline';" codehighlighter1_351_377_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">(</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">a&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">(</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">b)&nbsp;</span><span id="Codehighlighter1_351_377_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"></span><span id="Codehighlighter1_351_377_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">a&nbsp;==&nbsp;b\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><img id="Codehighlighter1_384_410_Open_Image" onclick="this.style.display='none'; codehighlighter1_384_410_open_text.style.display="'none';" codehighlighter1_384_410_closed_image.style.display="'inline';" codehighlighter1_384_410_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_384_410_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_384_410_closed_text.style.display="'none';" codehighlighter1_384_410_open_image.style.display="'inline';" codehighlighter1_384_410_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_384_410_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"></span><span id="Codehighlighter1_384_410_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">a&nbsp;!=&nbsp;b\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span></div>
<p><br>&nbsp;发现用这种方法在Ubuntu8.04，GCC4.24的情况下通过。不过这种方法个人感觉只能用来比较一个程序内部生成的浮点数的运算。</p>
<p>如果两个浮点数是由两台不同平台的机器运行的程序生成，或者不同编译器生成的程序运行产生，则可能根据无法得到相等的结果。</p>
<p>因现在只有x86的机器，谁手上有ARM平台之类的，请帮忙测试一下。谢谢<br></p>
<p><br></p>
<p>当直接用==比较两个浮点数时，随着整数部分增加，精度急剧下降</p>
<p>当比较0.000...001和0.000.。0011时，到65个零都没有问题，能得到正确结果<br>
当比较1.000..001和0.000.00011时，小数点后14个零时，就不能得到正确结果。</p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/netdigger/aggbug/109520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/netdigger/" target="_blank">绝对零度</a> 2010-03-12 13:00 <a href="http://www.cppblog.com/netdigger/archive/2010/03/12/109520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下用msys+minGW编译GDB和GDBServer</title><link>http://www.cppblog.com/netdigger/archive/2007/08/24/30773.html</link><dc:creator>绝对零度</dc:creator><author>绝对零度</author><pubDate>Fri, 24 Aug 2007 09:32:00 GMT</pubDate><guid>http://www.cppblog.com/netdigger/archive/2007/08/24/30773.html</guid><wfw:comment>http://www.cppblog.com/netdigger/comments/30773.html</wfw:comment><comments>http://www.cppblog.com/netdigger/archive/2007/08/24/30773.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/netdigger/comments/commentRss/30773.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/netdigger/services/trackbacks/30773.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt;">
<p class="MsoNormal"><span style="font-family: 宋体;">环境：</span><span lang="EN-US">mingw5.1.3
+ msys1.0.10+ msysDTK-1.0.1</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">这些软件都可以从</span><span lang="EN-US">mingw</span><span style="font-family: 宋体;">的官方网站上下载。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">从</span><span lang="EN-US">mingw</span><span style="font-family: 宋体;">官方网站上下载</span><span lang="EN-US">gdb-6.6-mingw-src.tar.bz2</span><span style="font-family: 宋体;">和</span><span lang="EN-US">mingw-gdb.6.6.patch.tar.bz2</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">进入</span><span lang="EN-US">msys.</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">解压缩两个包</span></p>
<p class="MsoNormal"><span lang="EN-US">Cd gdb-6.6-mngw</span></p>
<p class="MsoNormal"><span lang="EN-US">patch &#8211;Np1 &#8211;I ../mingw-gdb-path.</span></p>
<p class="MsoNormal"><span lang="EN-US">./configure &#8211;target=arm-linux &#8211;prefix=/usr/local/arm-gdb</span></p>
<p class="MsoNormal"><span lang="EN-US">make</span></p>
<p class="MsoNormal"><span lang="EN-US">make install</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;官方网站上提供的gdb-5.2.1-1的源代码包，我没有编译成功，不知道有人编译成功了吗?</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Gdbserver</span><span style="font-family: 宋体;">编译：</span></p>
<p class="MsoNormal"><span lang="EN-US">cd gdb/gdbserver</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">网上一般教程都是：</span></p>
<p class="MsoNormal"><span lang="EN-US">./configure &#8211;target=arm-linux &#8211;host=arm-linux</span></p>
<p class="MsoNormal"><span lang="EN-US">Make CC=arm-linux-gcc(</span><span style="font-family: 宋体;">交叉编译工具</span><span lang="EN-US">)</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">但在</span><span lang="EN-US">某些交叉编译工具可能会</span><span style="font-family: 宋体;">不行。如我用的就是,花了大半天时间才找到方法。方法如下：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">假设交叉编译工具名字叫arm-linux-gnueabi-gcc.</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">先执行：arm-linux-gnueabi-gcc -v</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">找到一行，指出target的。假设是arm-linux-gnueabi.</span></p>
接着：
<p class="MsoNormal"><span lang="EN-US">./configure &#8211;target=arm-linux-gnueabi &#8211;host=arm-linux-gnueabi
CC=arm-linux-gnueabi-gcc</span></p>
<p class="MsoNormal"><span lang="EN-US">make</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">才能编译成功</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<span style="font-size: 10.5pt; font-family: 宋体;">所以最好在</span><span style="font-size: 10.5pt; font-family: &quot;times new roman&quot;;" lang="EN-US">configure</span><span style="font-size: 10.5pt; font-family: 宋体;">时就指定交叉编译工具。<br><br><br><br></span> </span><img src ="http://www.cppblog.com/netdigger/aggbug/30773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/netdigger/" target="_blank">绝对零度</a> 2007-08-24 17:32 <a href="http://www.cppblog.com/netdigger/archive/2007/08/24/30773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>