0. 前言
本节是“【C++】常见易犯错误之数值类型取值溢出与截断(1)” 的补充,主要探讨浮点型的取值溢出。
1. 相关知识
(1) 浮点型数据取值范围如下:
单精度型 | float | 3.4 * 10^-38 ~ 3.4 * 10^38 |
双精度型 | double | 1.7 * 10^-308 ~ 1.7 * 10^308 |
长双精度型 | long double | 1.7 * 10^-308 ~ 1.7 * 10^308 |
C++并没有统一规定各类数据的精度、数值范围和在内存中所占的字节数,各种C++编译系统根据自己的情况作出安排[1]。在VC6.0中,float、double、long double 分别占4,8,8个字节。
(2) 浮点数转换为二进制
浮点数分为整数部分和小数部分,整数部分按照“除二取余逆序书写”的法则将其转换为二进制写在浮点的左边,小数部分按照“乘二取整正序书写”的法则将其转换为二进制写在浮点的右边[2]。例子如下:
2. 浮点型取值范围溢出
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <iostream>
#include <cstddef>
#include <typeinfo>
int main() {
system("color 3f");
float fTest1 = 3.4e33;
float fTest2 = 3.4e38;
float fTest3 = 3.4e39;
printf("fTest1: %d: Dec: %d; Hex: %x; size: %d\n", fTest1, fTest1, fTest1, sizeof(fTest1));
printf("fTest2: %d: Dec: %d; Hex: %x; size: %d\n", fTest2, fTest2, fTest2, sizeof(fTest2));
printf("fTest3: %d: Dec: %d; Hex: %x; size: %d\n", fTest3, fTest3, fTest3, sizeof(fTest3));
//std::cout << fTest1 << std::endl;
system("pause");
return 0;
}
运行结果:
在这里,出现了两个问题:
(1) fTest2 与 fTest3 出现了溢出;
(2) fTest2 与 fTest3 溢出后,并没有使用多余的位来表示,“【C++】常见易犯错误之数值类型取值溢出与截断(3)”中提到,short 型溢出使用多余位来表示;但这里显然没有出现这种情况。
(2) 尚未解决,标红
参考文献
[1] 谭浩强.C++程序设计[M].北京:清华大学出版社,P18.
[2] 浮点数转二进制与浮点数据在计算机中的表示. https://blog.csdn.net/csdn1829/article/details/79376073.