C++算术运算与类型转换机器值问题:a*(1/a)是否恒≥1.0?
关于
(double)a * (1.0/(double)a)结果的疑问解答 结论很明确:对于任何非零的int类型变量a,(double)a * (1.0/(double)a)的结果永远是精确的1.0(double类型),既不会出现略小于1的情况,也不会大于1。
原因可以拆成两点说:
- 首先,int转double不会丢精度。int的取值范围是-2147483648到2147483647,而double用53位二进制尾数存储整数,能精确表示所有这个范围内的整数——毕竟253比231大得多,所以
(double)a就是a的精确浮点数版本。 - 其次,就算
1.0/(double)a无法精确表示(比如a=3、7这类非2的幂的数,它们的倒数是无限循环的二进制小数),这个近似值和真实倒数的误差极小。当你用这个近似值乘以精确的(double)a时,得到的结果和1.0的差距不会超过double类型中1.0附近最小可分辨间隔的一半。按照浮点数默认的舍入规则,这个微小偏差会被直接舍入回1.0。
对你的场景来说,既然结果始终是精确的1.0,转换成int类型后肯定得到1,完全不用担心出现0的情况。
内容的提问来源于stack exchange,提问作者p d
相关产品推荐
相关产品推荐

