為什麼 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+ 瀏覽次數

開啟您的 職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.