两个float 怎么比较大小

转自:http://blog.csdn.net/mydriverc2/article/details/49888947

float 类型不能比较相等或不等,但可以比较>,<,>=,<=

用==从语法上说没错,但是本来应该相等的两个浮点数由于计算机内部表示的原因可能略有微小的误差,这时用==就会认为它们不等。应该使用两个浮点数之间的差异的绝对值小于某个可以接受的值来判断判断它们是否相等,比如用

if (fabs(price - p) < 0.000001)

来代替

if (price == p)

很多工程的应用都是采用计算精确度的方式

定义一个精度,用差的绝对值比较,在精度范围内就认为是相等的;大小可以直接比较。

【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float 还是double 类型的变量,都有精度限制。所以一定要
避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON 是允许的误差(即精度)。

计算机表示浮点数(float或double类型)都有一个精度限制,对于超出了精度限制的浮点数,计算机会把它们的精度之外的小数部分截断。因此,本来不相等的两个浮点数在计算机中可能就变成相等的了。例如:

float a=10.222222225,b=10.222222229

数学上a和b是不相等的,但在32位计算机中它们是相等的。

如果两个同符号浮点数之差的绝对值小于或等于某一个可接受的误差(即精度),就认为它们是相等的。

不要直接用“==”或者“!=”对两个浮点数进行比较,但是可以直接用“<”和“>”比较谁大谁小。

test.cpp

****************************************

#include

#include

#define EPSILON 1e-6

int main(void)

{

float a = 0.000003;

float b = 0.000005;

printf("a=%f/n",a);

printf("b=%f/n",b);

printf("abs(a-b)=%f/n",abs(a-b));

printf("fabs(a-b)=%f/n",fabs(a-b));

if ( fabs(a-b) <= EPSILON )  //判断浮点数是否相等

{

printf("a==b/n");

}else

{

printf("a!=b/n");

}

if ( fabs(a) <= EPSILON)  //判断浮点数是否等于0

{

printf("a==0/n");

}else

{

printf("a!=0/n");

}

if (a > b)  //比较两个浮点数的大小,

{

printf("a>b/n");

}else

{

printf("a

}

return 0;

}

时间: 2024-07-29 01:33:48

两个float 怎么比较大小的相关文章

聊聊JVM(三)两种计算Java对象大小的方法

这篇说说如何计算Java对象大小的方法.之前在聊聊高并发(四)Java对象的表示模型和运行时内存表示 这篇中已经说了Java对象的内存表示模型是Oop-Klass模型. 普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐),按照8的倍数对齐 数组对象结构是 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对

shell两个整数的判断大小 思想版

喜欢前几行的思想 逻辑的严谨性 逻辑是学的 代码创作是自己的 #!/bin/bash #判断两个整数的大小 read -p "请输入两个整数a b :" a b #或者使用a=$1 [ -z "$a" ]||[ -z "$b" ]&&{ echo "你输入的数为零" exit 1 } #输入的值是否为0 expr $a + 10 &>/dev/null RETUAL1=$? expr $b + 1

如何比较两个时间字符串的大小

方式一.后台 现在有两个字符串,是从表单读取来的日期性,“2003-10-12”与“2003-10-21”,现在如何判断他们的大小. 如果不想再转为date类型比较 有一种简单的方法 String a="2003-10-12";String b="2003-10-21";int result=a.compareTo(b);if (result==0)out.print("a=b");else if (result < 0 )out.prin

判断两个( float )变量是否相等以及和 0 值比较方法

float 型: 占 4 字节,7 位有效数字 double 型:占 8 字节,15-16 位有效数字 浮点数的表示是不精确的,float 和 double 都不能保证可以把所有实数都准确的保存在计算机中.测试例子如下: #include <stdio.h> int main(int argc, char *argv[]) { float f = 99.9f; printf("f = %f\n", f); return 0; } 运行结果如下: 由于浮点数的表示是不精确的,

Java实现比较两个数值数组的大小

数组大小比较规则: 按照字符串的比较规则: 1.两个数组长度相等:依次比较数组元素,元素大的判定该数组大: 2.两个数组长度不等:依次比较数组元素,元素大的判定该数组大,若数组长度小的所有元素都和数组长度长的比较完相等,则判定数组长的组数大: public static int[] large(int[] a,int[] b){ if (a.length==0&&b.length!=0) return b; if(b.length==0&&a.length!=0) retu

不调用if比较两个int a, b大小

方案一: 所有比较都不用 int min = (a + b - abs(a - b)) / 2;(a与b的和减去a与b的差就等于a与b中较小值的两倍,再除以2即可得到较小值) int max = (a + b + abs(a - b)) / 2; 同上 方案二: int max(int a, b) { switch((unsigned int)(a - b) >> sizeof(int) * 8 - 1) { case 0: return b; case 1:return a; } }

java中两个字符串如何比较大小

使用 String.compareTo 方法: compareTo() 的返回值是int, 它是先比较对应字符的大小(ASCII码顺序)1.如果字符串相等返回值02.如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值)(负值前字符串的值小于后字符串,正值前字符串大于后字符串)3.如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度. 例: String s1 = "

比较两个时间字符串的大小

String a="2003-10-12"; String b="2003-10-21";int result=a.compareTo(b);if (result==0)out.print("a=b");else if (result < 0 )out.print("a<b");else out.print("a>b"); 使用String类中的compareTo()方法比较.如:s1.c

两个精确时间比较大小,Jquery代码

function check_date() { var beginTime=$('#examStartTime').val(); var endTime=$('#examEndTime').val(); var beginTimes = beginTime.substring(0, 10).split('-'); var endTimes = endTime.substring(0, 10).split('-'); beginTime = beginTimes[1] + '-' + beginT