Dev-C++下关于float/double类型的实验
2005-03-11 21:47
621 查看
kingwei 2005.3.11
实验环境: Dev-C++ 4.9.6.0 (gcc/mingw32), 使用-Wall编译选项
#include <stdio.h>
int main()
{
float v_float;
double v_double;
long double v_long_double;
printf("sizeof(float) = %u/n", sizeof(float));
printf("sizeof(double) = %u/n", sizeof(double));
printf("sizeof(long double) = %u/n", sizeof(long double));
/* -3.40282e+038 ~ +3.40282e+038 */
scanf("%f", &v_float);
printf("%f/n", v_float);
printf("%e/n", v_float);
/* -1.79769e+308 ~ +1.79769e+308 */
scanf("%lf", &v_double);
printf("%f/n", v_double);
printf("%e/n", v_double);
/* -1.79769e+308 ~ +1.79769e+308 */
scanf("%Lf", &v_long_double);
printf("%Lf/n", v_long_double);
printf("%Le/n", v_long_double);
return 0;
}
1. float,double,long double长度分别为:
sizeof(float) = 4
sizeof(double) = 8
sizeof(long double) = 12
2. 数值范围测试
float +/- 3.40282e+038
double +/- 1.79769e+308
long double +/- 1.79769e+308
----- Test case #1 正向极值-----
3.40282e+038
1.79769e+308
1.79769e+308
output:
340282001837565600000000000000000000000.000000
3.402820e+038
179769000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
1.797690e+308
179769000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
1.797690e+308
----- Test case #2 负向极值-----
-3.40282e+038
-1.79769e+308
-1.79769e+308
output:
-340282001837565600000000000000000000000.000000
-3.402820e+038
-179769000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
-1.797690e+308
-179769000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
-1.797690e+308
----- Test case #3 正向溢出-----
3.40283e+038
1.79770e+308
1.79770e+308
output:
1.#INF00
1.#INF00e+000
1.#INF00
1.#INF00e+000
1.#INF00
1.#INF00e+000
----- Test case #4 负向溢出-----
-3.40283e+038
-1.79770e+308
-1.79770e+308
output:
-1.#INF00
-1.#INF00e+000
-1.#INF00
-1.#INF00e+000
-1.#INF00
-1.#INF00e+000
可见,虽然long double比double长4个字节,但是表示的数值范围却是一样的.
long double类型的长度,精度及表示范围与所使用的编译器,操作系统等有关.
VC++6.0下使用IEEE标准浮点数,long double为80位长度, 范围约为 +/- 1.2e+4932,
printf格式符为: %lf, %le, %lg. (未验证)
3. 浮点参数压栈的规则: float(4 字节)类型扩展成double(8 字节)入栈.
所以在输入时,需要区分float(%f)与double(%lf),而在输出时,用%f即可,
printf函数将按照double型的规则对压入堆栈的float(已扩展成double)和double型数据进行输出.
如果在输出时指定%lf格式符,gcc编译器将给出一个警告.
4. gcc编译器可以选择float的长度,是否与double一致.
实验环境: Dev-C++ 4.9.6.0 (gcc/mingw32), 使用-Wall编译选项
#include <stdio.h>
int main()
{
float v_float;
double v_double;
long double v_long_double;
printf("sizeof(float) = %u/n", sizeof(float));
printf("sizeof(double) = %u/n", sizeof(double));
printf("sizeof(long double) = %u/n", sizeof(long double));
/* -3.40282e+038 ~ +3.40282e+038 */
scanf("%f", &v_float);
printf("%f/n", v_float);
printf("%e/n", v_float);
/* -1.79769e+308 ~ +1.79769e+308 */
scanf("%lf", &v_double);
printf("%f/n", v_double);
printf("%e/n", v_double);
/* -1.79769e+308 ~ +1.79769e+308 */
scanf("%Lf", &v_long_double);
printf("%Lf/n", v_long_double);
printf("%Le/n", v_long_double);
return 0;
}
1. float,double,long double长度分别为:
sizeof(float) = 4
sizeof(double) = 8
sizeof(long double) = 12
2. 数值范围测试
float +/- 3.40282e+038
double +/- 1.79769e+308
long double +/- 1.79769e+308
----- Test case #1 正向极值-----
3.40282e+038
1.79769e+308
1.79769e+308
output:
340282001837565600000000000000000000000.000000
3.402820e+038
179769000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
1.797690e+308
179769000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
1.797690e+308
----- Test case #2 负向极值-----
-3.40282e+038
-1.79769e+308
-1.79769e+308
output:
-340282001837565600000000000000000000000.000000
-3.402820e+038
-179769000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
-1.797690e+308
-179769000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
-1.797690e+308
----- Test case #3 正向溢出-----
3.40283e+038
1.79770e+308
1.79770e+308
output:
1.#INF00
1.#INF00e+000
1.#INF00
1.#INF00e+000
1.#INF00
1.#INF00e+000
----- Test case #4 负向溢出-----
-3.40283e+038
-1.79770e+308
-1.79770e+308
output:
-1.#INF00
-1.#INF00e+000
-1.#INF00
-1.#INF00e+000
-1.#INF00
-1.#INF00e+000
可见,虽然long double比double长4个字节,但是表示的数值范围却是一样的.
long double类型的长度,精度及表示范围与所使用的编译器,操作系统等有关.
VC++6.0下使用IEEE标准浮点数,long double为80位长度, 范围约为 +/- 1.2e+4932,
printf格式符为: %lf, %le, %lg. (未验证)
3. 浮点参数压栈的规则: float(4 字节)类型扩展成double(8 字节)入栈.
所以在输入时,需要区分float(%f)与double(%lf),而在输出时,用%f即可,
printf函数将按照double型的规则对压入堆栈的float(已扩展成double)和double型数据进行输出.
如果在输出时指定%lf格式符,gcc编译器将给出一个警告.
4. gcc编译器可以选择float的长度,是否与double一致.
相关文章推荐
- Dev-C++下关于几种int类型格式符的实验
- 关于C和C++中的基本数据类型int、long、long long、float、double、char、string的大小及表示范围
- Dev-C++下关于char类型的实验
- C/C++ 关于float和double类型与二进制的转换实现。。
- 关于C和C++中的基本数据类型int、long、long long、float、double、char、string的大小及表示范围
- 关于C++中string对象向int、float、double类型的转换的方法汇总
- Dev-C++下关于long long类型的实验
- C++中int、double、float。string等常见类型转换
- C++中将string类型转换为int, float, double互转
- C++、C中有关double、float类型转换成int型,及取整,丢失精度问题。
- C++浮点数(float、double)类型数据比较、转换分析总结
- C++中将string类型转换为int, float, double
- C/C++语言中计算int,float,double,char四种数据类型所能表示的数据范围
- 准确详解:C/C++ float、double数据类型的表示范围及精度
- 关于float和double类型数据的输入输出
- C/C++中int/long/float/double数值类型与字符串互相转换[总结]
- 关于java的double类型和float类型
- C++中将string类型转换为int, float, double类型
- 关于float double的数据类型的细节,在处理转换问题的时候非常有用
- 深入理解C++浮点数(float、double)类型数据比较、相等判断