float型与0的比较
- 格式:doc
- 大小:27.50 KB
- 文档页数:3
float跟0比较c代码在C语言中,float是一种表示浮点数的数据类型。
它可以用来表示带小数部分的数字,比如3.14或2.71828。
而0则是一个整数,表示零这个数值。
在C语言中,我们可以使用比较运算符来进行数值的比较。
常用的比较运算符有等于(==)、大于(>)、小于(<)等。
假设我们有一个float类型的变量x,我们想要判断它是否等于0,我们可以使用以下代码:```cif (x == 0) {printf("x等于0");} else {printf("x不等于0");}```在上述代码中,我们使用了等于运算符(==)来进行判断。
如果x 的值等于0,则会执行if语句块中的代码,输出"x等于0";否则,会执行else语句块中的代码,输出"x不等于0"。
然而,由于浮点数在计算机中的表示方式的特殊性,使用等于运算符(==)来比较浮点数与0是否相等可能会出现问题。
这是因为浮点数在计算机中以二进制形式进行存储,而二进制表示不能精确地表示所有的十进制小数。
例如,我们将0.1赋值给一个float变量x,然后使用等于运算符(==)将x与0进行比较,得到的结果可能是不相等的。
这是由于0.1在二进制表示中是一个无限循环小数,计算机只能对其进行近似表示。
为了避免这个问题,我们通常会使用一个误差范围来判断浮点数与0的比较。
例如,我们可以判断如果x的值在一个非常小的范围内,那么我们认为x与0相等。
下面是一个示例代码:```c#include <math.h>if (fabs(x - 0) < 0.0001) {printf("x接近于0");} else {printf("x不接近于0");}```在上述代码中,我们使用了fabs函数来计算x与0的差的绝对值。
然后,我们将这个差与一个非常小的数0.0001进行比较。
java基本数据类型和引⽤数据类型的区别⼀、基本数据类型:byte:Java中最⼩的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0int:整型,⽤于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0Lfloat:浮点型,在内存中占32位,即4个字节,⽤于存储带⼩数点的数字(与double的区别在于float类型有效⼩数点只有6~7位),默认值0 double:双精度浮点型,⽤于存储带有⼩数点的数字,在内存中占64位,即8个字节,默认值0char:字符型,⽤于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空boolean:布尔类型,占1个字节,⽤于判断真或假(仅有两个值,即true、false),默认值false⼆、Java数据类型基本概念:数据类型在计算机语⾔⾥⾯,是对内存位置的⼀个抽象表达⽅式,可以理解为针对内存的⼀种抽象的表达⽅式。
接触每种语⾔的时候,都会存在数据类型的认识,有复杂的、简单的,各种数据类型都需要在学习初期去了解,Java是强类型语⾔,所以Java对于数据类型的规范会相对严格。
数据类型是语⾔的抽象原⼦概念,可以说是语⾔中最基本的单元定义,在Java⾥⾯,本质上讲将数据类型分为两种:基本类型和引⽤数据类型。
基本类型:简单数据类型是不能简化的、内置的数据类型、由编程语⾔本⾝定义,它表⽰了真实的数字、字符和整数。
引⽤数据类型:Java语⾔本⾝不⽀持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型⼀般都是通过类或接⼝进⾏构造,类提供了捆绑数据和⽅法的⽅式,同时可以针对程序外部进⾏信息隐藏。
C中实数的范围
学习C的过程中,发现书上(以TC为例)对于实数类型(单精度float、双精度double)数据的取值范围说得比较含糊,因此在网上查询,结果主要有以下几种:
1、float 字长为4个字节,数的范围是 3.4E-38~3.4E+38。
double字长为8个字节,数的范围是 1.7E-308~1.7E+308。
2、float在内存中占用4个字节,约7个十进位有效数字,能表示绝对值最接近0的实数约为10
的-38次方,最大的实数约为10的38次方。
double占用8个字节,约15个十进位有效数字,能表示绝对值最接近0的实数约为10的
-308次方,最大的实数约为10的308次方。
3、float型,数的范围±(3.4E-38~3.4E+38),六位精度
double型,数的范围±(1.7E-308~1.7E+308),十六位精度。
其他的也类似,分析一下,第1种显然有问题,没有考虑负数;第2种没有精确说明;第3种范围说得较明白,但精度似乎与大多数结果有些出入。
另外以上3种也有共同点,比如字节数、范围的数字等,综合多种查询结果(多种版本的书),我觉得比较合理的结果是这样的:
float型,4字节,范围-(3.4E-38~3.4E+38)∪+(3.4E-38~3.4E+38),7位精度
double型,8字节,范围-(1.7E-308~1.7E+308)∪+(1.7E-308~1.7E+308),15位精度。
C语言题一、判断题(每题1分,共计10分)1.在C中,调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参。
()2.使用float b定义的外部变量存放在内存中的动态存储区。
()3.如果一个函数位于C程序文件的上部,在该函数体内说明语句后的复合语句中定义了一个变量,则该变量为局部变量,只在该复合语句中有效;。
()4.int (*ptr) (),则ptr是一维数组的名字。
()5.指针在任何情况下都可进行>,<,>=,<=,==运算。
()6.形参是局部变量,函数调用完成即失去意义。
()7.C语言程序总是从main()函数开始执行,C语言程序中的main()函数必须放在程序的开始部分。
()8.在C语言程序中,函数的定义不能嵌套,但函数的调用可以嵌套。
()9.若函数调用时用数组名作为函数参数,实参与其对应的形参共占用同一段存储空间,在调用函数中必须说明数组的大小,但在被调函数中可以使用不定尺寸数组。
()10.局部变量不能和全局变量重名。
()二、(共计10分)1. 以下为Windows NT 下的32 位C程序,请计算sizeof 的值char str[] = “Hello” ;char *p = str ;int n = 10;long d=12;请计算sizeof (str ) =__ (0.5分)sizeof ( p ) =__ (0.5分)sizeof ( n ) =__ (0.5分)sizeof(d)=__(0.5分)2. 请给出如下程序的结果int a = 3;int b = a << 3;a = ____ ,(0.5分)b = ____(0.5分)3.int i=10, j=10, k=3; k*=i+j; k 最后的值是__(1分)4. 1.-1,2,7,28,,126请问28和126中间那个数是__(2分)5.如有定义语句int a[]={1,8,2,8,3,8,4,8,5,8}; ,则数组a的大小是___(1分)6.以下程序:#include<stdio.h>void main(){ int x=10,y=10;printf("%d %d\n",x--,--y);}输出结果为:___(0.5分),___ (0.5分)7.函数调用语句:func((exp1,exp2),(exp3,exp4,exp5));含有实参个数为:___(2分)。
C++ float转换int,四舍五入正常的float 转换为int 的情况是采用去尾巴的方式,也就是说去掉小数点后面的数值。
1. 常规的float 转换为int :例如:9.34 = (int)9 ;9.99 = (int)9 。
#include<stdio.h>int main(){float i = 9.34;float j = 9.99;int a, b;a = (int) i;b = (int) j;printf("a = %d\n",a);printf("b = %d\n",b);}上面的输出结果为:a = 9b = 92. float 转换为int 需要四舍五入提高精度,则基本算法如下:在计算是特别要注意正负数的问题,另外要注意round()函数转换后虽然数值小数点后都变为了零,但此时还是float,还需要转换为int。
#include<stdio.h>int main(){float zer = 0;float i = 9.34;float j = 9.99;float k = -9.34;float m = -9.99;int a, b, c, d, e;int a1, b1, c1, d1, e1;a = (int) (i * 10 + 5) / 10;b = (int) (j * 10 + 5) / 10;c = (int) (k * 10 - 5) / 10;d = (int) (m * 10 - 5) / 10;e = zer;a1 = (int) round(i)b1 = (int) round(j);c1 = (int) round(k);d1 = (int) round(m);e1 = (int) round(zer);printf("a = %d\n",a);printf("b = %d\n",b);printf("c = %d\n",c);printf("d = %d\n",d);printf("e = %d\n",e);printf("round a1 is %f\n", a1);printf("round b1 is %f\n", b1);printf("round c1 is %f\n", c1);printf("round d1 is %f\n", d1);printf("round e1 is %f\n", e1);}上面的输出结果为:a = 9b = 10c = -9d = -10e = 0round a1 is 9round b1 is 10round c1 is -9round d1 is -10round e1 is 0float转int 四舍五入问题2014年02月25日13:14:16 非著名码农阅读数:35207最近碰到一例客户投诉某款产品某个参数显示误差的问题,经检查发现是软件中浮点数(float)转化为整型数(int)时候未四舍五入造成的。
float和double有什么区别?float和double在游戏⾏业肯定是⽤的很多的,虽然这是个很基础的问题,但是⾯试时被问到还是感觉说的不是很好。
所以还是总结⼀下:float 单精度浮点数在机内占 4 个字节,⽤ 32 位⼆进制描述。
double 双精度浮点数在机内占 8 个字节,⽤ 64 位⼆进制描述。
浮点数在机内⽤指数型式表⽰,分解为:数符,尾数,指数符,指数四部分。
数符占 1 位⼆进制,表⽰数的正负。
指数符占 1 位⼆进制,表⽰指数的正负。
尾数表⽰浮点数有效数字,0.xxxxxxx, 但不存开头的 0 和点。
指数存指数的有效数字。
指数占多少位,尾数占多少位,由计算机系统决定。
可能是数符加尾数占 24 位,指数符加指数占 8 位 -- float。
数符加尾数占 48 位,指数符加指数占 16 位 -- double。
知道了这四部分的占位,按⼆进制估计⼤⼩范围,再换算为⼗进制,就是你想知道的数值范围。
对编程⼈员来说,double 和 float 的区别是 double 精度⾼,有效数字 16 位,float 精度 7 位。
但 double 消耗内存是 float 的两倍,double 的运算速度⽐ float 慢得多,C 语⾔中数学函数名称 double 和 float 不同,不要写错,能⽤单精度时不要⽤双精度(以省内存,加快运算速度)。
简单来说,Float 为单精度,内存中占 4 个字节,有效数位是 7 位(因为有正负,所以不是8位),在我的电脑且 VC++6.0 平台中默认显⽰是6位有效数字;double为双精度,占 8 个字节,有效数位是 16 位,但在我的电脑且 VC++6.0 平台中默认显⽰同样是 6 位有效数字例⼦:在 C 和 C++ 中,如下赋值语句:float a=0.1;编译器报错:warning C4305: 'initializing' : truncation from 'const double ' to 'float '原因:在 C/C++ 中(也不知道是不是就在 VC++ 中这样),上述语句等号右边 0.1,我们以为它是个 float,但是编译器却把它认为是个 double(因为⼩数默认是 double),所以要报这个 warning,⼀般改成 0.1f 就没事了。
数据类型:只对I/O类型的变量起作用,定义变量对应的寄存器的数据类型,共有9种数据类型供用户使用,这9种数据类型分别就是: BIT:1位;范围就是:0或1BYTE:8位,1个字节;范围就是:0---255SHORT: 2个字节;范围就是:-32768---32767USHORT:16位,2个字节;范围就是:0---65535BCD:16位,2个字节;范围就是:0---9999LONG:32位,4个字节;范围就是:-2147483648——2147483647 LONGBCD:32位,4个字节;范围就是:0---4294967295FLOAT:32位,4个字节;范围就是:10e-38---10e38,有效位7位STRING:128个字符长度1.内存离散变量、I/O离散变量类似一般程序设计语言中的布尔( BOOL)变量,只有0、1两种取值,用于表示一些开关量。
2.内存实型变量、I/O实型变量类似一般程序设计语言中的浮点型变量,用于表示浮点数据,取值范围为10E-38~10E +38,有效值为7位。
3.内存整数变量、I/O整数变量类似一般程序设计语言中的有符号长整数型变量,用于表示带符号的整型数据,取值范围为-2 147 483 648~2 147 483 647。
4.内存字符串型变量、I/O字符串型变量类似一般程序设计语言中的字符串变量,可用于记录一些有特定含义的字符串,如名称、密码等,该类型变量可以进行比较运算与赋值运算。
特殊变量类型有报警窗口变量、报警组变量、历史趋势曲线变量、时间变量四种。
这几种特殊类型的变量正就是体现了“组态王”系统面向工控软件、自动生成人机接口的特色。
下面就是有关变量基本属性的说明。
变量名:惟一标识一个应用程序中数据变量的名字,同一应用程序中的数据变量不能重名,数据变量名区分大小写,最长不能超过32个字符。
用鼠标单击编辑框的任何位置进入编辑状态,工程人员此时可以输入变量名字,变量名可以就是汉字或英文名字,第一个字符不能就是数字。
前一段时间读了一下林锐博士的《高质量C/C++编程指南》,其中有一个比较经典的问题。
请写出float x与“零值”比较的if语句?当时只知道不能直接用float类型的值与0进行“==”或“!=”比较,但不知道该具体怎么写这个if语句。
看过答案才知道,应该设法转化成“>=”或“<=”,即:const float EPSINON = 0.00001;if((x >= - EPSINON) && (x <= EPSINON))看了答案后觉得很有道理,然后就记了答案,算是取得了“真经”了。
最近,我和项目组同事讨论问题的时候,正好涉及到这个问题。
我马上想到自己的“真经”,炫耀地说出了标准答案,可同事问了句为什么,为什么是0.00001?我马上哑炮了。
终于体会那句话,凡事认真追问起来,都不简单。
事情要知其然,还要知其所以然。
马上编了个小程序验证了一把。
#include<stdio.h>int main(){float f = 1.0;float f1 = f/3; // f1 = 1/3float f2 = f1*3; // f2 = 1;float f_result = f1 - f2/3; // f_result = 0 ???if(0.0f == f_result){printf("f_result == 0/n");}else{printf("f_result != 0/n");}return 0;}通过上述程序,可以明确得到答案,但具体为什么如此,还需要从C语言中float 类型变量的编码格式说起。
浮点数表示形如V=x * 2^y 的有理数进行编码,IEEE标准754仔细制定了浮点数及其运算的标准。
十进制的12.34可以这样表示:1*10^1 + 2*10^0 + 3*10^-1 + 4*10^-2。
同样地,二进制的101.11可以这样表示:1*2^2 + 1*2^0 + 1*2^-1 +1*2^-2 。
float型的表示范围float型数据是一种用于表示浮点数的数据类型,在计算机编程中广泛应用。
float型的表示范围指的是该数据类型能够表示的数值范围。
float型数据在内存中占据4个字节的空间,用于存储单精度浮点数。
其表示范围大约为1.4E-45到3.4E38,可以表示的精度为6到7位小数。
浮点数是用科学计数法表示的,由一个有效数字和一个指数组成。
有效数字的每一位都可以是0到9之间的整数,指数可以是负数、0或正数。
浮点数的表示范围从非常小的数到非常大的数都可以涵盖,例如表示天文学中的天体质量、地球上的温度、物体的速度等。
在程序中,我们可以使用float型数据来进行各种数值计算和表示。
例如,在科学计算中,我们可以使用float型数据来表示粒子的速度、温度的变化等。
在金融领域,我们可以使用float型数据来表示股票的价格、货币的汇率等。
在游戏开发中,我们可以使用float型数据来表示游戏中的角色的位置、速度等。
然而,需要注意的是,float型数据由于精度有限,可能会出现舍入误差。
在进行浮点数的比较时,应该尽量避免直接比较两个浮点数是否相等,而应该使用误差范围进行比较。
另外,由于浮点数的表示范围有限,当超出范围时,可能会出现溢出或下溢的情况,导致结果不准确。
为了更好地使用float型数据,我们可以使用一些技巧和注意事项。
首先,我们应该尽量避免进行过多的浮点数运算,尤其是在循环中。
其次,我们可以使用一些库函数来处理浮点数,例如四舍五入、取整等操作。
此外,我们还可以使用double型数据来提高精度,但需要注意的是,double型数据在内存中占据8个字节的空间,可能会占用更多的内存。
float型数据是一种用于表示浮点数的数据类型,其表示范围有限,但可以满足大多数实际应用的需求。
在使用float型数据时,我们应该注意精度问题,并避免超出表示范围的情况。
另外,我们还可以使用一些技巧和注意事项来更好地处理浮点数。
前一段时间读了一下林锐博士的《高质量C/C++编程指南》,其中有一个比较经典的问题。
请写出float x与“零值”比较的if语句?
当时只知道不能直接用float类型的值与0进行“==”或“!=”比较,但不知道该具体怎么写这个if语句。
看过答案才知道,应该设法转化成“>=”或“<=”,即:
const float EPSINON = 0.00001;
if((x >= - EPSINON) && (x <= EPSINON))
看了答案后觉得很有道理,然后就记了答案,算是取得了“真经”了。
最近,我和项目组同事讨论问题的时候,正好涉及到这个问题。
我马上想到自己的“真经”,炫耀地说出了标准答案,可同事问了句为什么,为什么是0.00001?我马上哑炮了。
终于体会那句话,凡事认真追问起来,都不简单。
事情要知其然,还要知其所以然。
马上编了个小程序验证了一把。
#include<stdio.h>
int main()
{
float f = 1.0;
float f1 = f/3; // f1 = 1/3
float f2 = f1*3; // f2 = 1;
float f_result = f1 - f2/3; // f_result = 0 ???
if(0.0f == f_result)
{
printf("f_result == 0/n");
}
else
{
printf("f_result != 0/n");
}
return 0;
}
通过上述程序,可以明确得到答案,但具体为什么如此,还需要从C语言中float 类型变量的编码格式说起。
浮点数表示形如V=x * 2^y 的有理数进行编码,IEEE标准754仔细制定了浮点数及其运算的标准。
十进制的12.34可以这样表示:1*10^1 + 2*10^0 + 3*10^-1 + 4*10^-2。
同样地,二进制的101.11可以这样表示:1*2^2 + 1*2^0 + 1*2^-1 +1*2^-2 。
注意而今之中形如0.111…1正好是小于1的数。
假定只用有限长度的编码,那么十进制是不能准确表示想1/3、5/7这样的数的,类似的,小数的二进制表示法只能表示那些能够被写成x * 2^y的数,其他的只能用近似数来表示。
IEEE浮点标准用V=(-1)^s * M * 2^E的形式来表示一个数:
(1)符号(sign)s决定数是负数(s=1)还是正数(s=0),而对0的符号位作为特殊情况处理。
(2)有效数(significant)M是一个二进制小数。
(3)指数(exponent)E是2的幂(可能是负数),他的作用是对浮点数的加权。
一个浮点数的位表示按上述情形划分为3个域。
标准C语言中,单精度float浮点格式的符号位=1,有效位=23,指数未=8,产生一个32位的表示。
双精度double浮点格式的符号位=1,有效位=52,指数位=11,产生一个64位的表示。
根据指数位的值,被编码的值可以分为三种不同的情况,即,规格化值、非规格化值、特殊数值。
当指数的为不全为0且不全为1时,属于规格化值;当指数位全为0时,属于非规格化值;当指数位全为1时,属于特殊数值。
下面主要了解一下后两者情况。
非规格化值有两个目的。
首先提供了一种表示数值0的方法当小数位也全为0时,可以根据符号位的不同表示+0.0和-0.0。
另外一个功能是用来表示那些非常接近0.0的数,使用逐渐下溢出(gradual underflow)的方法实现这个属性。
特殊数值当指数位全为1,而小数位全为0时,可以表示正无穷大和负无穷大。
当小数位为非零时,结果值被称为NaN。
因为表示方法限制了浮点数的范围和精度,所以浮点运算只能近似地表示实数运算。
系统需要使用“最接近”匹配值的值保存浮点值,这就是舍入(rounding)运算的任务。
IEEE规定了四种舍入方式,默认的方式是向偶数舍入,也叫向最接近的值舍入。