浮点数的精确度的探究
- 浮点数的内部十分复杂,因此在运行环境中浮点数的运算结果并不一定完全一致的。这是因为如果只是使用符合 IEEE 754 的格式的精确数值进行运算的,CPU 硬件资源就无法被充分使用,运算会非常耗时,
- 浮点数的在计算机的存放的形式,并不是你所以为的 比如 你认为的 5.0 在计算机中实际存放的数值可能是 4.999997
- 所以一般不要使用浮点数 作为判断基准,而是使用整数
代码1:
public class Study7 {
public static void main (String[] args) {
/*对浮点数的探究*/
float sum = 0.0F; // F 用于区分默认小数 double 的类型
for(float x = 0.0F;x <= 1.0F; x+=0.001F ){
System.out.println("x = "+x);
sum +=x;
}
System.out.println("sum = "+sum);
}
}
结果1:
解析1:
- 上述代码中 我是以 x <=1.0F 为循环结束的基准,理论上 x=1.0 才对;
- 但是;请注意,x 最后的值并不是1.0 , 而是0.9999907。这是因为浮点数**表示时无法保证每一为位都不发生数据的丢失,保证的精度值有限。因此,x 中积累了 1000 个误差的存在;
代码2:
public class Study7 {
public static void main (String[] args) {
/*对浮点数的探究*/
float sum = 1.0F; // F 用于区分默认小数 double 的类型
for(float x = 0.0F;x!= 1.0F;x += 0.001F){
System.out.println("x = "+x);
sum += x;
}
System.out.println("sum = "+sum);
}
}
结果2:
解析2:
- 结果可想而知,进入了无限的循环当中去了,因为 x 永远无法等于 1.0F 的,原因上面已经简述过了,浮点数的存储表达,保证的精度有限。
代码3:
public class Study7 {
/*对浮点数的探究*/
public static void main (String[] args) {
float sum = 0.0F; // F 用于区分默认小数 double 的类型
for(int i = 0; i <= 1000; i++) {
float x = (float)i / 1000;
System.out.println("x = "+x);
sum += x;
}
System.out.println("sum ="+sum);
}
}
结果3:
解析3:
- 在for 语句中,变量 i (int) 的值从 0 递增到 1000 。每次循环时,都会将 i 除以 1000 的值赋给 x.这种写法也无法保证 x 能准确的无误地表示实数值,但由于每次循环时都会重新计算 x 的值,因此不会出现像代码 1 的那种累计误差。得到的合计值也是近似于实际值的;
最后:
由于自身的水平有限,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,感谢大家!后会有期,江湖再见!