`
rollstone
  • 浏览: 38867 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

浮点数的比较

阅读更多
一浮点数的知识
1.首先浮点数不用补码表示,只有int型才用补码表示。
2.计算机能精确表示的数值是有限的,离散的,而现实中的实数是连续的,这就必然有精度的要求。二进制的小数更糟糕,能精确表示的更少。
例如:
0.1D,表示成二进制的时候是循环的
0.0 0011 0011 0011......B
根据IEEE标准754:
32位的float类型有效位为23位。前面还有个隐含位。
所以float类型最多的有效位:24位(这个位是bit,是对2进制来说的)。
0.1d
在内存中的表示为:
0  01111011    10011001100110011001101B
第一位为符号位,
接下来8位为指数:实际指数+2^n-1=-4+127=123=01111011
接下来是23位有效位,前面还隐含一个有效位1.

而这个数
0  01111011    10011001100110011001101B
转化为10进制为:
0.100000001D
有0.000000001D的误差。

对于不同的数,误差补一样,可能在第7位,可能在第8位,第9位。但是能保证在小数点后面的六位是准确的。
http://cprogramsjzu.blog.sohu.com/81276949.html。
象fprintf函数输出float类型的时候,一般只输出小数点后面六位。
至于二进制的24位有效位,对应10进制的多少有效位,我不知道怎样计算,我看网上的方法都是错的。


二.浮点数的比较
1.浮点数精确比较
现在我们知道在计算机内浮点数本身是可以精确比较的。但是大部分实数不能精确的转化为计算机内部的浮点数(基本都是近似值)。
浮点数运算还是要用10进制浮点数来避免误差。
1.软件方法,据说java可以。我没用过。
2.硬件。传说IBM会生产进行10进制浮点运算的芯片。

所以根据已经了解到的知识,想把现实中的数,映射到计算机中进行比较,是不可能的,因为可能有N个实数对应于计算机中的一个数。
有意义的比较应该是带单位的数据在误差范围(这个误差根据需要设置)内的比较。
例如:身高,单位为厘米的时候,精确到小数点后面两位:
1.751cm我们认为等于1.75cm。

网上很多地方写浮点数比较的时候,会这样写:
fabs(A-B) < epsilon
一般将epsilon定义为:0.000001D
浮点数跟定点数比较是不对的。除非有现实的意义。
凭什么相差位epsilon就表示相等阿。大量不等的数据,这样判断都相等了。

除非限定输入,例如都是float类型,最小为:
#define FLT_MIN              1.1754943508222875E-38F
f1-f2 <FLT_MIN 则表示相等,这个还象话。

2.有现实意义的误差范围内的比较怎么写?
如果给定一个误差范围,在这个误差范围内则表示这两个数相等,应该怎么写?
我觉得得看需求。

三. 一个有趣的例子
/* -------------a.c------------------ */
#include <stdio.h>
double f(int x)
{
return 1.0 / x ;
}
void main()
{
double a , b;
int i ;
a = f(10) ;
b = f(10) ;
i = a == b ;
printf( "%d\n" , i ) ;
}

/*---------------- b.c ----------------------*/
#include <stdio.h>
double f(int x)
{
return 1.0 / x ;
}
void main()
{
double a , b , c;
int i ;
a = f(10) ;
b = f(10) ;
c = f(10) ;
i = a == b ;
printf( "%d\n" , i ) ;
}
前一个结果为0,后一个为1.


原因看这个:
http://xenyinzen.wikidot.com/reship:080123-28
总结下来就是cpu内的精度比double都高。第一个程序:计算完a,a的值返回内存,被转化为64的double精度丢失。而b计算完之后,不返回内存大概精度80位左右,跟a比较。所以不等。
第二个都返回内存了。


http://www.cnblogs.com/diylab/archive/2011/01/10/1562407.html

http://cprogramsjzu.blog.sohu.com/81276949.html

http://topic.csdn.net/u/20070926/20/dee5a142-af94-4193-8752-3bf1ed12df28.html

http://blog.csdn.net/happy__888/article/details/289373

http://blog.vckbase.com/bruceteen/archive/2006/01/20/17193.html


http://www.cnblogs.com/FlyingBread/archive/2009/02/15/660206.html


http://zh.wikipedia.org/wiki/IEEE_754


http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm


http://blog.vckbase.com/bruceteen/articles/240.html


http://www.cnblogs.com/bossin/archive/2007/04/08/704567.html


http://rangercyh.blog.51cto.com/1444712/405375
分享到:
评论

相关推荐

    S7-200SMART_浮点数比较库文件.rar

    标题中的"S7-200SMART_浮点数比较库文件.rar"暗示了这是一个与西门子S7-200SMART系列PLC相关的程序库,主要用于浮点数的比较操作。S7-200SMART是西门子推出的一款小型PLC,广泛应用于自动化设备控制,具有编程灵活、...

    SMART库_精确浮点数比较real compare.smartlib.rar

    标题 "SMART库_精确浮点数比较real compare.smartlib.rar" 暗示了这是一个针对S7-200 SMART PLC(西门子小型可编程控制器)的智能库,专门用于进行浮点数的精确比较操作。这个库可能包含了一系列的函数块或子程序,...

    浮点数比较错误.vi

    浮点数比较错误

    消除浮点数比较错误.vi

    消除浮点数比较错误

    浮点数比较大小.c

    浮点数比较大小.c

    近似:近似浮点数相等比较和断言

    在编程领域,尤其是在涉及到数值计算和...Rust的`approx`库为此提供了强大的支持,使得在测试和实际代码中进行浮点数比较变得更加可靠和简单。通过理解和运用这些工具,开发者可以编写出更加健壮和精准的数值处理代码。

    Shell脚本处理浮点数的运算和比较实例

    3. 浮点数比较:`awk`可以直接在条件语句中进行浮点数比较,如`if($1&gt;$2) {...}`,这使得在`awk`内部进行比较变得简单。 结合`bc`和`awk`,我们可以处理各种复杂的浮点数运算和比较任务。例如,计算三角函数、进制...

    三菱PLC浮点数运算指令

    1. 二进制浮点数比较指令ECMP(FNC110)和DECMP(P) 这一类指令用于比较两个32位浮点数,并将比较结果放置在目标操作数中。源操作数可以是K、H和D(分别代表常数、高位字、低位字),而目标操作数则可以是Y、M和S...

    php 浮点数比较方法详解

    在PHP编程中,浮点数比较是一个常见的挑战,因为浮点数运算存在精度问题。这是因为计算机内部使用二进制表示浮点数,而某些十进制小数在转换为二进制时无法精确表示,导致计算后可能出现微小的误差。这种误差在比较...

    4.15实验-浮点数的表示及运算

    此外,浮点数比较也不总是准确的,因为两个看似相等的浮点数在二进制下可能有所不同,因此比较时需注意精度问题。 四、浮点数运算的性能优化 在实际应用中,理解和优化浮点数运算的性能至关重要。处理器通常具有...

    浮点数的数据结构.pdf

    在进行浮点数比较或运算时,开发者需要考虑精度问题,并可能需要使用特定的方法(如`Math.abs()`或自定义比较函数)来处理潜在的不精确性。此外,了解浮点数的二进制转换规则有助于调试和理解浮点运算的底层机制。

    golang如何比较浮点数的大小

    Golang浮点数比较和运算会出现误差。 浮点数储存至内存中时,2的-1、-2……-n次方不能精确的表示小数部分,所以再把这个数从地址中取出来进行计算就出现了偏差。 package main import ( errors fmt github....

    浮点数十六进制表示转换工具

    在计算机科学和编程领域,理解和操作浮点数的十六进制表示对于理解数值计算的底层机制以及进行精确的浮点数比较和调试至关重要。 浮点数是一种用于表示实数的数据类型,它由两部分组成:指数部分和尾数部分。在IEEE...

    基于C++浮点数(float、double)类型数据比较与转换的详解

    在C++编程语言中,浮点数类型包括`float`和`double`,它们用于表示非整数值。本文主要探讨的是这两...对于浮点数比较,使用适当的容差值是比较通用且稳健的方法。理解这些细节对于编写高精度和鲁棒的C++代码至关重要。

    float浮点数二进制表示转换[源代码]

    学习这部分内容不仅有助于理解底层计算原理,还有助于在编程时更有效地处理浮点数,例如在进行高精度计算、浮点数比较或优化性能时。 总的来说,理解浮点数的二进制表示是计算机科学中的基础概念,对于程序员和硬件...

    在C语言中双精度浮点数线性化相等比较的研究.pdf

    线性化是通过一些变换,将非线性的浮点数比较问题转化为更易于处理的线性问题,从而提高比较的准确性和效率。 总结来说,双精度浮点数的相等比较问题在计算机编程中非常重要,尤其是在需要精确计算的科学和工程领域...

    浮点数运算,三菱浮点数运算,C,C++源码.zip

    在进行浮点数比较时,需要特别注意这一点,通常使用`epsilon`值来判断两个浮点数是否接近,而非直接比较是否相等。 C++扩展了C语言的功能,提供了更多的模板类和函数来处理浮点数。例如,`std::numeric_limits`模板...

    iOS 解决floatValue,doubleValue等计算不精确问题,一句话解决精确计算,精确比较

    例如,`float`和`double`类型的值在进行加减乘除运算后,结果可能与预期不符,尤其是在比较两个浮点数是否相等时,直接使用`==`可能会得到错误的结果。 为了解决这个问题,我们可以采用以下策略: 1. **避免直接...

    IEEE浮点数表示法.docx

    **IEEE浮点数表示法详解** 在计算机科学中,浮点数的表示是至关重要的,尤其是在数值计算和科学计算领域。...在编程中,尤其是在涉及到浮点数比较、精度控制和效率优化时,理解这一表示法显得尤为重要。

Global site tag (gtag.js) - Google Analytics