前言
相信大家在编程过程中都有使用过浮点数,但是浮点数总是给我带来预期不一样的结果,下面展示了在 C 语言中的精度问题,发现使用浮点数总是会带来精度缺失。在学习和工作当中总能听到不能使用浮点数来表示金钱,会有精度缺失。
#include
int main() {
float a = 0.1 + 0.2;
printf("a = %.20f\n", a); // 0.30000001192092895508
return 0;
}
但是在一些特殊领域,单靠整数是无法满足精度要求,这个时候就需要用到浮点数。这边篇文章来解释浮点数在计算机中是如何表示。
二进制小数
我们先类比一下比较熟悉的十进制数,比如 3.25
可以表示为:
3 * 10^0 + 2 * 10^-1 + 5 * 10^-2 = 3.25
如果我们只用 1 字节二进制来表示,一共 8 位,前 4 位表示整数,后 4 位表示小数,可以表示为0011 0100
:
1 * 2^1 + 1 * 2^0 + 0 * 2^-1 + 1 * 2^-2 = 3.25
这种定点表示不能很有效的表示很大的数,我们一般在计算机中表示小数也不是使用这种方式,而是使用 IEEE 浮点表示方法。
IEEE 浮点数表示
IEEE 二进制浮点数算术标准(IEEE 754)是20世纪80运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式包括负零(-0)与反常值(denormal number),一些特殊数值,比如无穷(Inf)与非数值(NaN),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例