单精度和双精度顾名思义是两种精度的不同划分,单精度float是保证7位有效数字,double是保证16位有效数字。
例:(float)(10%3)
结果是1.000000即七位有效数字,(后面不一定全是0,计算机可随机选择数字,所以整数1不等于float或double的1)
(double)(10%3)
同理结果是:1.XXXXXXXXXX……后面有十五位的有效数字
虽然整数位都是1,但由于有效位数不同,即后面随机派出的小数可能不同,所以二者理论上不同,实际比较不能用==,要用fabs()<1e-6.
单精度和双精度都指浮点数,就是带小数点的数
只不过单精度和双精度是为了区分有效数而已(也就是精确度),它的提法完全符合科学计算中对于数值的观念。
比如:单精度/双精度数值类型从一开始设计的时候,就不是一个准确的数值类型,他只保证在他这个数值类型的精度之内是准确的,精度之外则不保证。
c语言里单精度和双精度都是浮点型数(实数),也就是我们常说的小数(如3.14)。
变量声明:
类型说明符为float 单精度说明符,double 双精度说明符。
实型变量说明的格式和书写规则与整型相同。
例如:
float x,y; // (x,y为单精度实型量)
double a,b,c; // (a,b,c为双精度实型量)
实型常数不分单、双精度,都按双精度double型处理。
单精度浮点数:
通常占用4个字节(32位)存储空间,其数值范围为-3.4E38~3.4E38,单精度浮点数最多有7位十进制有效数字,单精度浮点数的指数用“E”或“e”表示。如果某个数的有效数字位数超过7位,当把它定义为单精度变量时,超出的部分会自动四舍五入。
双精度浮点数:
通常占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308。双精度完全保证的有效数字是15位,16位只是部分数值有保证。
不错,是精确度不一样.因为double是8字节,float是4字节,所以double可以有更多的位数表示尾数,精度要高点.
这个例子举的不好,因为10%3是在一个括号里的,所以double和float转的都是10%3的结果1.
% 是对前后两个整型数取余,返回整型数值。
10 % 3 就返回整型的数值 1 。
一个(double)(整型),一个是(float)(整型),所以两个结果没差别。