为什么 C++ 需要高精度计算?这个问题对于 C++ 来说,是一个比较尴尬的问题。因为 Java 和 Python 是不需要高精度计算的,因为这两个语言直接支持高精度数据。
从 C++ 的角度回答这个问题,我们首先要从 C++ 的基础知识来看,也就是 C++ 的数据类型可以表示的范围。下表是 C++ 常用的数据类型的字节大小和数值范围。我们针对 G++ 来说明这个问题,因为在不同类型的编译器里,相同数据类型的大小是不一样的。
C++ 数据类型 | 含义 | 长度(Byte) | 可以表示数值范围 | |
bool | 布尔类型 | 1B | true 或者 false | |
short | 有符号短整型 | 2B | -2^15 ~ 2^15-1 | -32,768 ~ 32,767 |
unsigned short | 无符号短整型 | 2B | 0 ~ 2^16-1 | 0 ~ 65,535 |
int | 有符号整型 | 4B | ~2^31 ~ 2^31-1 | -2,147,483,648 ~ 2,147,483,647 |
unsigned int | 无符号整型 | 4B | 0 ~ 2^32-1 | 0 ~ 4,294,967,295 |
long long | 有符号长整型 | 8B | -2^63 ~ 2^63-1 | –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
unsigned long long | 无符号长整型 | 8B | 0 ~ 2^64-1 | 0 ~ 18,446,744,073,709,551,615 |
char | 有符号字符型 | 1B | -2^7 ~ 2^7-1 | -128 ~ 127 |
unsigned char | 无符号字符型 | 1B | 0 ~ 2^8-1 | 0 ~ 255 |
float | 单精度浮点数 | 4B | -3.4E-38 ~ 3.4E+38 6 ~ 7位有效数据 | |
double | 双精度浮点数 | 8B | -1.7E-308 ~ 1.7E+308 15 ~ 16位有效数据 | |
long double | 长精度浮点数 | 16B | -1.2E-4932 ~ 1.2E4932 18 ~ 19位有效数据 |
从上表,我们可以清楚的看到,当进行整数计算的时候, 数据超过 18,446,744,073,709,551,615,也就是超过 8Byte 后,C++就没有对应的数据类型就行表达。这就是为什么 C++ 需要高精度计算。