為什麼 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
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP