为什么 Python 中的浮点运算不准确?


什么是浮点数?

浮点数,也称为浮点,它们表示实数,并用小数点分隔整数部分和小数部分。浮点数也可以使用科学计数法表示,用 E 或 e 表示 10 的次方(2.5e2 = 2.5 x 102 = 250)。

为什么浮点计算不准确?

浮点计算不准确,主要是因为有理数近似值无法在 2 进制中有限表示,而且通常它们近似值为在任何进制中都无法用有限位数表示的数字。

示例

假设我们有一个分数 -

5/3

我们可以将上述内容以 10 进制表示为 -

1.666...
1.666
1.667

如上所示,即使第一个表示 1.666… 在数学上实际上等于该分数,我们仍会将 1.666 和 1.667 与分数 5/3 联系起来并加以考虑。

第二个和第三个表示 1.666 和 1.667 的误差都在 0.001 左右,这比比如 9.2 和 9.1999999999999993 之间的误差更有问题。第二个表示甚至没有正确舍入!

由于我们对 0.666 表示数字 2/3 没有问题,因此我们实际上不应该对 9.2 的近似方式有任何问题。

注意 - 有无数多个实数和无数个有理数。浮点表示是有限的,因此不可避免地有很多数字无法表示。确切地说,64 位仅允许你在 18,446,744,073,709,551,616 个不同值中进行区分。

让我们看看一些转换及其结果。这将帮助我们更深入地了解浮点数系统。

将浮点数转换为二进制(基数 2 数制)

我们将看到如何将 floating-point 值转换为二进制。二进制使用两个数字,0 和 1。也称为基数 2 数制,二进制数中的每个位置表示基数 (2) 的 0 次方。二进制数中的最后位置表示基数 (2) 的 x 次方。

首先,我们从 floating-point 值中取出整数部分并将其转换为二进制,然后取出小数部分并将其转换为二进制形式,最后将两者组合起来 -

示例

def floatoctal_convert(my_number, places = 3): my_whole, my_dec = str(my_number).split(".") my_whole = int(my_whole) my_dec = int (my_dec) res = bin(my_whole).lstrip("0b") + "." for x in range(places): my_whole, my_dec = str((my_decimal_converter(my_dec)) * 8).split(".") my_dec = int(my_dec) res += my_whole return res def my_decimal_converter(num): while num > 1: num /= 10 return num # Driver Code n = input("Enter floating point value : \n") p = int(input("Enter the number of decimal places of the result : \n")) print(floatoctal_convert(n, places = p))

输出

Enter floating point value :2.34
Enter the number of decimal places of the result :3
10.256

将浮点数转换为八进制(基数 8 数制)

八进制数使用八个数字,0、1、2、3、4、5、6、7。也称为基数 8 数制。八进制数中的每个位置表示基数 (8) 的 0 次方。八进制数中的最后位置表示基数 (8) 的 x 次方。

十进制数制以 10 为基数,因为它使用 0 到 9 的 10 个数字。在十进制数制中,小数点左边的连续位置表示个位、十位、百位、千位等等。

示例

给定浮点十进制值并输入小数位数,我们的任务是将其转换为八进制形式 -

def float_convert_octal(my_number, places = 3): my_whole, my_dec = str(my_number).split(".") my_whole = int(my_whole) my_dec = int (my_dec) res = oct(my_whole).lstrip("0o") + "." for x in range(places): my_whole, my_dec = str((decimal_converter(my_dec)) * 8).split(".") my_dec = int(my_dec) res += my_whole return res def decimal_converter(num): while num > 1: num /= 10 return num n = input("Enter the floating point value : \n") p = int(input("Enter the number of decimal places of the result : \n")) print(float_convert_octal(n, places = p))

输出

Enter the floating point value :
6.89
Enter the number of decimal places of the result :
12
6.707534121727

更新于: 16-9-2022

1K+ 浏览次数

开启您的 职业生涯

完成课程获得认证

开始
广告