types - 为什么 IEEE754 单精度 float 只有 7 位精度?

标签 types floating-point precision ieee-754 single-precision

为什么单精度 float 具有 7 位精度(或 double 15-16 位精度)?

谁能解释一下我们是如何根据分配给 float(Sign(32) Exponent(30-23), Fraction (22-0)) 的 32 位得出的结果?

最佳答案

有效数的 23 个小数位 (22-0) 出现在内存格式中,但总精度实际上是 24 位,因为我们假设有一个前导 1。这相当于 log10(2^24) ≈ 7.225 十进制数。

double float 有 52 位小数,加上前导 1 是 53。因此 double 可以容纳 log10(2^53) ≈ 15.955 十进制数字,而不是 16。

注意:前面的 1 不是符号位。它实际上是 (-1)^sign * 1.ffffffff * 2^(eeee-constant) 但我们不需要在分数中存储前导 1。符号位仍必须存储


有些数不能表示为2的幂之和,比如1/9:

>>>> double d = 0.111111111111111;
>>>> System.out.println(d + "\n" + d*10);
0.111111111111111
1.1111111111111098

如果财务程序在没有 self 纠正的情况下一遍又一遍地进行此计算,最终会出现差异。

>>>> double d = 0.111111111111111;
>>>> double sum = 0;
>>>> for(int i=0; i<1000000000; i++) {sum+=d;}
>>>> System.out.println(sum);
111111108.91914201

经过 10 亿次求和后,我们丢失了超过 2 美元。

关于types - 为什么 IEEE754 单精度 float 只有 7 位精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19130396/

相关文章:

java - 通用 OR 而不是 AND <T extends Number |字符序列>

C 中的纸牌游戏。数据类型四舍五入会给出不正确的结果

haskell - 为什么 ghci 对类型列表和类型族进行脱糖?可以选择性地禁用它吗?

c++ - 我能保证 C++ 编译器不会重新排序我的计算吗?

matlab - 在 Matlab 中,如何使用 formatSpec 格式化运算符指定指数中的位数?

C# int 存储在 double "=="精度问题

c# - 使用 Type 变量转换对象

c# - Asp.net C#变量及值计算

Swift:将符合 FloatingPoint 的值转换为 Double

c# - 为什么在 C# 中添加多个 double 时顺序会影响舍入