比较两个浮点数是否相等用什么运算符?

如题所述

暂时使用等于号比较即可。

虽然比较两个数相等要用等于号,但是,由于计算机上的浮点数存储的规则的限制,导致数据的比较上要考虑浮点数的精度问题.

所以, 如果你允许数据的偏差在 0.001的话,那么,你可以if ( a - b < 0.001)  认为a=b。

当然,这个偏差本身是浮点数,所以,按照IEEE754的标准,但精度浮点数有效位最多小数点后7位。而双精度则是最多小数点后15位。因此,你指定的这个偏差要是“合理”的才行。

浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法。

浮点数概念

先澄清一个概念,浮点数并不一定等于小数,定点数也并不一定就是整数。所谓浮点数就是小数点在逻辑上是不固定的,而定点数只能表示小数点固定的数值,具用浮点数或定点数表示某哪一种数要看用户赋予了这个数的意义是什么。

C++中的浮点数有6种,分别是:

float:单精度,32位

unsigned float:单精度无符号,32位

double:双精度,64位

long double:高双精度,80位

然而不同的编译器对它们的支持也略有不同,据我所知,很多编译器都没有按照IEEE规定的标准80位支持后两种浮点数的,大多数编译器将它们视为double,或许还有极个别的编译器将它们视为128位?!对于128位的long double我也仅是听说过,没有求证,哪位高人知道这一细节烦劳告知。

下面我仅以float(带符号,单精度,32位)类型的浮点数说明C++中的浮点数是如何在内存中表示的。先讲一下基础知识,纯小数的二进制表示。(纯小数就是没有整数部分的小数,讲给小学没好好学的人)

纯小数要想用二进制表示,必须先进行规格化,即化为 1.xxxxx * ( 2 ^ n ) 的形式(“^”代表乘方,2 ^ n表示2的n次方)。对于一个纯小数D,求n的公式如下:

n = 1 + log2(D); // 纯小数求得的n必为负数

再用 D / ( 2 ^ n ) 就可以得到规格化后的小数了。接下来就是十进制到二进制的转化问题,为了更好的理解,先来看一下10进制的纯小数是怎么表示的,假设有纯小数D,它小数点后的每一位数字按顺序形成一个数列:

{k1,k2,k3,...,kn}

那么D又可以这样表示:

D = k1 / (10 ^ 1 ) + k2 / (10 ^ 2 ) + k3 / (10 ^ 3 ) + ... + kn / (10 ^ n )

推广到二进制中,纯小数的表示法即为:

D = b1 / (2 ^ 1 ) + b2 / (2 ^ 2 ) + b3 / (2 ^ 3 ) + ... + bn / (2 ^ n )

现在问题就是怎样求得b1,b2,b3,……,bn。算法描述起来比较复杂,还是用数字来说话吧。声明一下,1 / ( 2 ^ n )这个数比较特殊,我称之为位阶值。

温馨提示:答案为网友推荐,仅供参考
相似回答