0.  前言

本节是“【C++】常见易犯错误之数值类型取值溢出与截断(1)” 的补充,主要探讨浮点型的取值溢出。

1. 相关知识

(1) 浮点型数据取值范围如下:

单精度型float3.4 * 10^-38  ~  3.4 * 10^38
双精度型double1.7 * 10^-308  ~  1.7 * 10^308
长双精度型long double1.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.

12-29 11:27