IEEE 754标准规定浮点数(32位)使用23位作为尾数,这允许存储每个实数的所有数字,大约为10⁷。对于诸如cos()
或sin()
的三角函数,最低有效位非常重要。因此,可以预期浮点变量的sin()和cos()的结果在10⁷之后是错误的,因为尾数的一部分在编码期间丢失。
for (int i = 0; i <= 15; i++) {
System.out.println("for 10^" + i);
System.out.println(Math.sin((float) Math.pow(10, i)));
System.out.println(Math.sin(Math.pow(10, i)));
}
此代码显示浮点变量的sin()
和cos()
精确到10 10 ,这是一个我不明白的行为...... cos()
和sin()
可以处理确切的值,因为参数本身缺乏精确度吗?
答案 0 :(得分:1)
IEEE浮点数在尾数中具有24位精度(23个明确存储,加1个“隐藏”位)。您看到的行为的关键是当10 10 以二进制写入时,它是34位长,但最后10位都是“0”。因此,单精度表示对于此特定数字是精确的。