日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python浮点数类型与数学_Python3标准库:decimal定点数和浮点数的数学运算

發布時間:2023/12/4 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python浮点数类型与数学_Python3标准库:decimal定点数和浮点数的数学运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. decimal定點數和浮點數的數學運算

decimal模塊實現了定點和浮點算術運算,使用的是大多數人所熟悉的模型,而不是程序員熟悉的模式(即大多數計算機硬件實現的IEEE浮點數運算)。Decimal實例可以準確的表示如何數,對其上火其下取整,還可以限制有效數字的個數。

1.1 Decimal

小數值被表示為Decimal類的實例。構造函數取一個整數或字符串作為參數。在使用浮點數創建Decimal之前,可以先將浮點數轉換為一個字符串,以使調用者能夠顯式的處理值的位數,因為如果使用硬件浮點數表示則可能無法準確的表述。或者,類方法from_float()可以把浮點數轉換為精確的小數表示。

importdecimal

fmt= '{0:<25} {1:<25}'

print(fmt.format('Input', 'Output'))print(fmt.format('-' * 25, '-' * 25))#Integer

print(fmt.format(5, decimal.Decimal(5)))#String

print(fmt.format('3.14', decimal.Decimal('3.14')))#Float

f = 0.1

print(fmt.format(repr(f), decimal.Decimal(str(f))))print('{:<0.23g} {:<25}'.format(

f,

str(decimal.Decimal.from_float(f))[:25])

)

浮點值0.1并沒有被表示為一個精確的二進制值,所以float的表示與Decimal值不同。在這個輸出的最后一行,完整的字符串表示被截斷為25個字符。

Decimal還可以由元組創建,其中包含一個符號標志(0表示正,1表示負)、由數位組成的一個tuple以及一個整數指數。

importdecimal#Tuple

t = (1, (1, 1), -2)print('Input :', t)print('Decimal:', decimal.Decimal(t))

基于元組的表示在創建時不太方便,不過它提供了一種可移植的方式,這樣可以導出小數值而不損失精度。元組形式可以通過網絡傳輸,或者在不支持精確小數值的數據庫中存儲,以后再轉換回Decimal實例。

1.2 格式化

Decimal對應Python的字符串格式化協議,使用與其他數值類型一樣的語法和選項。

importdecimal

d= decimal.Decimal(1.1)print('Precision:')print('{:.1}'.format(d))print('{:.2}'.format(d))print('{:.3}'.format(d))print('{:.18}'.format(d))print('\nWidth and precision combined:')print('{:5.1f} {:5.1g}'.format(d, d))print('{:5.2f} {:5.2g}'.format(d, d))print('{:5.2f} {:5.2g}'.format(d, d))print('\nZero padding:')print('{:05.1}'.format(d))print('{:05.2}'.format(d))print('{:05.3}'.format(d))

格式字符串可以控制輸出的寬度,精度(即有效數字個數),以及其填充值以占滿寬度的方式。

1.3 算術運算

Decimal重載了簡單的算術操作符,所以可以采用與內置數值類型相同的方式來處理Decimal實例。

importdecimal

a= decimal.Decimal('5.1')

b= decimal.Decimal('3.14')

c= 4d= 3.14

print('a =', repr(a))print('b =', repr(b))print('c =', repr(c))print('d =', repr(d))print()print('a + b =', a +b)print('a - b =', a -b)print('a * b =', a *b)print('a / b =', a /b)print()print('a + c =', a +c)print('a - c =', a -c)print('a * c =', a *c)print('a / c =', a /c)print()print('a + d =', end=' ')try:print(a +d)exceptTypeError as e:print(e)

Decimal操作符還接受整數參數,不過,在這些操作符使用浮點值之前必須把浮點值轉換為Decimal實例。

除了基本算術運算,Decimal還包括一些方法來查找以10為底的對數和自然對數。log10()和ln()返回的值都是Decimal實例,所以可以與其他值一樣在公式中直接使用。

1.4 特殊值

除了期望的數字值,Decimal還可以表示很多特殊值,包括正負無窮大值、“不是一個數”(NaN)和0。

importdecimalfor value in ['Infinity', 'NaN', '0']:print(decimal.Decimal(value), decimal.Decimal('-' +value))print()#Math with infinity

print('Infinity + 1:', (decimal.Decimal('Infinity') + 1))print('-Infinity + 1:', (decimal.Decimal('-Infinity') + 1))#Print comparing NaN

print(decimal.Decimal('NaN') == decimal.Decimal('Infinity'))print(decimal.Decimal('NaN') != decimal.Decimal(1))

與無窮大值相加會返回另一個無窮大值。與NaN比較相等性總會返回false,而比較不等性總會返回true。與NaN比較大小來確定排序順序是未定義的,這會導致一個錯誤。

1.5 上下文

到目前為止,前面的所有例子使用的都是decimal模塊的默認行為。還可以使用一個上下文(context)來覆蓋某些設置,如保持的精度、如何完成取整、錯誤處理等。上下文可以應用于一個線程中的所有Decimal實例,或者在一個小代碼區中本地應用。

1.5.1 當前上下文

要獲取當前全局上下文,可以使用getcontext()。

importdecimal

context=decimal.getcontext()print('Emax =', context.Emax)print('Emin =', context.Emin)print('capitals =', context.capitals)print('prec =', context.prec)print('rounding =', context.rounding)print('flags =')for f, v incontext.flags.items():print('{}: {}'.format(f, v))print('traps =')for t, v incontext.traps.items():print('{}: {}'.format(t, v))

這個示例腳本顯示了Context的公共屬性。

1.5.2 精度

上下文的prec屬性控制了作為算術運算結果創建的新值所要保持的精度。字面量值會按這個屬性保持精度。

importdecimal

d= decimal.Decimal('0.123456')for i in range(1, 5):

decimal.getcontext().prec=iprint(i, ':', d, d * 1)

要改變精度,可以直接為這個屬性賦一個1到decimal.MAX_PREC之間的新值。

1.5.3 取整

取整有多種選擇,以保證值在所需的精度范圍內。

ROUND_CEILING:總是趨向無窮大向上取整。

ROUND_DOWN:總是趨向0取整。

ROUND_FLOOR:總是趨向負無窮大向下取整。

ROUND_HALF_DOWN:如果最后一個有效數字大于或大于5則朝0反方向取整;負責,趨向0取整。

ROUND_HALF_EVEN:類似于ROUND_HALF_DOWN,不過,如果最后一個有效數字為5,則會檢查前一位。偶數值會導致結果向下取整,奇數值導致結果向上取整。

ROUND_HALF_UP:類似于ROUND_HALF_DOWN,不過如果最后一位有效數字為5,則值會朝0的反方向取整。

ROUND_UP:朝0的反方向取整。

ROUND_05UP:如果最后一位是0或5,則朝0的反方向取整;否則向0取整。

importdecimal

context=decimal.getcontext()

ROUNDING_MODES=['ROUND_CEILING','ROUND_DOWN','ROUND_FLOOR','ROUND_HALF_DOWN','ROUND_HALF_EVEN','ROUND_HALF_UP','ROUND_UP','ROUND_05UP',

]

header_fmt= '{:10}' + ' '.join(['{:^8}'] * 6)print(header_fmt.format(' ','1/8 (1)', '-1/8 (1)','1/8 (2)', '-1/8 (2)','1/8 (3)', '-1/8 (3)',

))for rounding_mode inROUNDING_MODES:print('{0:10}'.format(rounding_mode.partition('_')[-1]),

end=' ')for precision in [1, 2, 3]:

context.prec=precision

context.rounding=getattr(decimal, rounding_mode)

value= decimal.Decimal(1) / decimal.Decimal(8)print('{0:^8}'.format(value), end=' ')

value= decimal.Decimal(-1) / decimal.Decimal(8)print('{0:^8}'.format(value), end=' ')print()

這個程序顯示了使用不同算法將同一個值取整為不同精度的效果。

1.5.4 本地上下文

可以使用with語句對一個代碼塊應用上下文。

importdecimal

with decimal.localcontext() as c:

c.prec= 2

print('Local precision:', c.prec)print('3.14 / 3 =', (decimal.Decimal('3.14') / 3))print()print('Default precision:', decimal.getcontext().prec)print('3.14 / 3 =', (decimal.Decimal('3.14') / 3))

Context支持with使用的上下文管理器API,所以這個設置只在塊內應用。

1.5.5 各實例的上下文

還可以用上下文構造Decimal實例,然后從這個上下文繼承精度以及轉換的取整參數。

importdecimal#Set up a context with limited precision

c =decimal.getcontext().copy()

c.prec= 3

#Create our constant

pi = c.create_decimal('3.1415')#The constant value is rounded off

print('PI :', pi)#The result of using the constant uses the global context

print('RESULT:', decimal.Decimal('2.01') * pi)

例如,這樣一來,應用就可以選擇與用戶數據精度不同的常用值精度。

1.5.6 線程

“全局”上下文實例上是線程本地上下文,所以完全可以使用不同的值分別配置各個線程。

importdecimalimportthreadingfrom queue importPriorityQueueclassMultiplier(threading.Thread):def __init__(self, a, b, prec, q):

self.a=a

self.b=b

self.prec=prec

self.q=q

threading.Thread.__init__(self)defrun(self):

c=decimal.getcontext().copy()

c.prec=self.prec

decimal.setcontext(c)

self.q.put((self.prec, a*b))

a= decimal.Decimal('3.14')

b= decimal.Decimal('1.234')#A PriorityQueue will return values sorted by precision,#no matter what order the threads finish.

q =PriorityQueue()

threads= [Multiplier(a, b, i, q) for i in range(1, 6)]for t inthreads:

t.start()for t inthreads:

t.join()for i in range(5):

prec, value=q.get()print('{} {}'.format(prec, value))

這個例子使用指定的值來創建一個新的上下文,然后安裝到每個線程中。

總結

以上是生活随笔為你收集整理的python浮点数类型与数学_Python3标准库:decimal定点数和浮点数的数学运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。