Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么IEEE754单精度浮点只有7位精度?_C#_Java_.net_Variables_Types - Fatal编程技术网

C# 为什么IEEE754单精度浮点只有7位精度?

C# 为什么IEEE754单精度浮点只有7位精度?,c#,java,.net,variables,types,C#,Java,.net,Variables,Types,为什么单精度浮点数有7位精度(或双15-16位精度) 有谁能解释一下,我们是如何根据为浮点分配的32位(符号(32)指数(30-23),分数(22-0))得出这一结果的?有效位的23位分数(22-0)以内存格式显示,但总精度实际上是24位,因为我们假设有一个前导1。这相当于log10(2^24)≈ 7.225十进制数字 双精度浮点有52位小数,加上前导1是53位。因此,双精度计数器可以容纳log10(2^53)≈ 15.955十进制数字,不完全是16 注意:前导1不是符号位。它实际上是(-1)^

为什么单精度浮点数有7位精度(或双15-16位精度)

有谁能解释一下,我们是如何根据为浮点分配的32位(符号(32)指数(30-23),分数(22-0))得出这一结果的?

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

双精度浮点有52位小数,加上前导1是53位。因此,双精度计数器可以容纳
log10(2^53)≈ 15.955
十进制数字,不完全是16


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


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

>>>> double d = 0.111111111111111;
>>>> System.out.println(d + "\n" + d*10);
0.111111111111111
1.1111111111111098
如果一个金融程序在不进行自我修正的情况下一遍又一遍地进行这种计算,最终会出现差异

>>>> double d = 0.111111111111111;
>>>> double sum = 0;
>>>> for(int i=0; i<1000000000; i++) {sum+=d;}
>>>> System.out.println(sum);
111111108.91914201
>>>双d=0.111111;
>>>>双和=0;
>>>>对于(int i=0;i>>>System.out.println(总和);
111111108.91914201

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

32浮点有23位,所以最小的单位是

2^(-23) = 0.00000011920928955078125
其他数字仅大于0.00000011920928955078125。不可能小于0.00000011920928955078125。其他数字由0.00000011920928955078125组成

0.00000011920928955078125 * n
因此,我们可以很容易地表示0.00000x[1-9]。float32 can肯定有6位精度。不要考虑舍入,我们可以计算7位数字,如下所示:

0.00000011920928955078125 * 1 = 0.0000001
0.00000011920928955078125 * 2 = 0.0000002
0.00000011920928955078125 * 3 = 0.0000003
0.00000011920928955078125 * 4 = 0.0000004
0.00000011920928955078125 * 5 = 0.0000005
0.00000011920928955078125 * 6 = 0.0000007
0.00000011920928955078125 * 7 = 0.0000008
0.00000011920928955078125 * 8 = 0.0000009
0.00000011920928955078125 * 9 = 0.000001

它不能表示0.0000006。这是float32具有6~7位精度的结果,我们在互联网上随处可见。

前导1不是符号位。它实际上是
(-1)^sign*1.ffffffff*2^(eeee常量)
但我们不需要将前导1存储在分数中。符号位必须仍然被存储。我在一些地方见过他们提到浮点精度(15-16).Ever 15.955将是16?@jb_2519如Ron所示,双精度浮点的精度为15.955个小数位数。这意味着您可以很好地依赖前15个小数位数的精度,后面的任何数字最多只能部分表示。就我个人而言,我不会依赖第14位之后的任何数字(或单精度中的第6位)十进制数字是精确的。@RonE为什么我们用对数基数10来计算十进制数字的数量?你能解释一下这个概念吗?@PankajMahato这就是你计算它的方式。例如,如果我们想表示基数10中的数字2^24,它是16777216。因为log10(2^24)=7.225,我们可以看到这应该是一个前导数字,后跟7个以上的数字。相反,如果我们想知道十进制中有8个以下数字的最小二进制数是多少,我们计算如下:log2(10^8)=26.58。因此,我们需要一个27位的二进制数来得到前导数字后跟8个以上的十进制数(总共9位)。请记住,10^8是1后跟8个零,总共9位。