浮点数用作数学实数的近似值。它们不代表确切的值。因此,我们将浮点变量的算术结果与最小公差值进行比较。
例子:
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 | . | |||
… | . |
为简化起见,让我们考虑一个名为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值,这对我们来说是一个幻想。