📜  为什么浮点值不代表精确值

📅  最后修改于: 2021-05-31 16:46:50             🧑  作者: Mango

浮点数用作数学实数的近似值。它们不代表确切的值。因此,我们将浮点变量的算术结果与最小公差值进行比较。
例子:

C++
// C++ program to illustrate the
// floating point values
#include 
using namespace std;
 
// Driver Code
int main()
{
    double num1 = 10000.29;
    double num2 = 10000.2;
 
    // Output should be 0.0900000000
    cout << std::setprecision(15)
         << (num1 - num2);
    return 0;
}


Java
// Java program to illustrate the
// floating point values
import java.text.DecimalFormat;
 
class GFG{
 
// Driver Code
public static void main(String[] args)
{
    double num1 = 10000.29;
    double num2 = 10000.2;
 
    // Output should be 0.0900000000
    DecimalFormat df = new DecimalFormat(
        "#.################");
         
    System.out.println(df.format(num1 - num2));
}
}
 
// This code is contributed by 29AjayKumar


Python3
# Python3 program to illustrate
# the floating povalues
# Driver Code
if __name__ == '__main__':
    num1 = 10000.29;
    num2 = 10000.2;
 
    # Output should be 0.0900000000
    print ("{0:.10f}".format(num1 - num2));
 
# This code is contributed by Rajput-Ji


C#
// C# program to illustrate the
// floating point values
using System;
 
class GFG{
 
// Driver Code
public static void Main(String[] args)
{
    double num1 = 10000.29;
    double num2 = 10000.2;
 
    // Output should be 0.0900000000
    Console.WriteLine(
        string.Format("{0:F15}",
        Decimal.Parse((num1 - num2).ToString())));
}
}
 
// This code is contributed by 29AjayKumar


输出:
0.0900000000001455


解释:
预期输出为0.09。但是,输出不是0.09。要了解这一点,您首先必须知道计算机如何使用浮点值。初始化float变量后,计算机将其视为指数值,并分配4个字节(32位)的内存,其中尾数部分占24位指数部分占7位,其余的1位用于表示符号。
对于double类型,与float类型相比,计算机执行相同的操作,但分配的内存更大。在十进制系统中,小数部分中从(左到右)的每个位置都是其左侧位置的十分之一。如果我们从右移到左,则每个位置都是其右侧位置的10倍。
在二进制系统中,因子为两个,如表所示:

16 8 4 2 1 . \frac{1}{2} \frac{1}{4} \frac{1}{8}
2^4 2^3 2^2 2^1 2^0 . 2^{-1} 2^{-2} 2^{-3}

为简化起见,让我们考虑一个名为small float的神话类型(请参见上图),该类型仅由5位组成-与float和double相比非常小。小浮点类型的前三位将代表尾数,后两位将代表指数部分。为了简单起见,我们不考虑标志。因此,尾数部分只能有8个可能值,而指数部分只能有4个可能值。请参阅下表:

bit pattern binary value decimal value
000 (0.000)2 0.000
001 (0.001)2 0.125
010 (0.010)2 0.250
011 (0.011)2 0.375
100 (0.100)2 0.500
101 (0.101)2 0.625
110 (0.110)2 0.750
111 (0.111)2 0.875
Binary pattern Binary value Decimal value
00 (00)2 1
01 (01)2 2
10 (10)2 4
11 (11)2 8

因此,尾数和指数部分的一种组合可以是11100,其中最左边的两位代表指数部分,其余三位代表尾数部分。该值的计算公式为:

从这两个表中,我们可以很容易地说一个小浮点数只能包含32个数字,并且神话类型的范围是0到7。该范围不是同样密集。如果仔细查看下图,您将看到大多数值都在0到1之间。从右到左移动的次数越多,数字将越稀疏。

小浮点数不能代表1.3、2.4、5.6等。在这种情况下,小浮点数近似于它们。它不能表示大于7的数字。此外,许多组合表示相同的值。例如: 00000、00001、00010、00011代表相同的十进制值,即(0.000)。 32个组合中的12个是多余的。
如果增加分配给小浮点数的位数,则较密集的部分将增加。由于浮点值保留32位,因此与较小的浮点数相比,浮点值可以表示更多的数字。但是浮点值和双精度值会出现一些问题。没有办法克服这个问题。具有无限内存和快速预处理器的计算机只能计算精确的float或double值,这对我们来说是一个幻想。

想要从精选的最佳视频中学习并解决问题,请查看有关从基础到高级C++的C++基础课程以及有关语言和STL的C++ STL课程。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”