欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中實(shí)現(xiàn)精確的浮點(diǎn)數(shù)運(yùn)算詳解

 更新時(shí)間:2017年11月02日 10:10:28   作者:棲遲於一丘  
計(jì)算機(jī)智能處理可數(shù)集合的運(yùn)算,但是全體實(shí)數(shù)是不可數(shù)的,所以計(jì)算機(jī)只能用一些奇怪的方法來擬合他,于是就產(chǎn)生了浮點(diǎn)數(shù)。下面這篇文章主要給大家介紹了關(guān)于python中實(shí)現(xiàn)精確浮點(diǎn)數(shù)運(yùn)算的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

為什么說浮點(diǎn)數(shù)缺乏精確性?

在開始本文之前,讓我們先來談?wù)劯↑c(diǎn)數(shù)為什么缺乏精確性的問題,其實(shí)這不是Python的問題,而是實(shí)數(shù)的無限精度跟計(jì)算機(jī)的有限內(nèi)存之間的矛盾。

舉個(gè)例子,假如說我只能使用整數(shù)(即只精確到個(gè)位,計(jì)算機(jī)內(nèi)的浮點(diǎn)數(shù)也只有有限精度,以C語言中的雙精度浮點(diǎn)數(shù)double為例,精度為52個(gè)二進(jìn)制位),要表示任意實(shí)數(shù)(無限精度)的時(shí)候我就只能通過舍入(rounding)來近似表示。

比如1.2我會(huì)表示成1,2.4表示成2,3.6表示成4.

所以呢?

在算1.2 - 1.2的時(shí)候,由于計(jì)算機(jī)表示的問題,我算的實(shí)際上是1 - 1,結(jié)果是0,碰巧蒙對(duì)了;

在算1.2 + 1.2 - 2.4的時(shí)候,由于計(jì)算機(jī)表示的問題,我算的實(shí)際上是1 + 1 - 2,結(jié)果是0,再次蒙對(duì)了;

但是在算1.2 + 1.2 + 1.2 - 3.6的時(shí)候,由于計(jì)算機(jī)表示的問題,我算的實(shí)際上是1 + 1 + 1 - 4,結(jié)果是-1,運(yùn)氣沒那么好啦!

這里的1.2, 2.4, 3.6就相當(dāng)于你問題里的0.1, 0.2和0.3,1, 2, 4則是真正在計(jì)算機(jī)內(nèi)部進(jìn)行運(yùn)算的數(shù)值,我說清楚了嗎?

其他請(qǐng)看IEEE 754浮點(diǎn)數(shù)標(biāo)準(zhǔn),比如CSAPP第二章啥的(雖然估計(jì)你沒興趣看)。

另:不僅僅是浮點(diǎn)數(shù)的在計(jì)算機(jī)內(nèi)部的表示有誤差,運(yùn)算本身也可能會(huì)有誤差。比如整數(shù)2可以在計(jì)算機(jī)內(nèi)準(zhǔn)確表示,但是要算根號(hào)2就有誤差了;再比如兩個(gè)浮點(diǎn)數(shù)相除,本來兩個(gè)數(shù)都是精確表示的,但除的結(jié)果精度卻超出了計(jì)算機(jī)內(nèi)實(shí)數(shù)的表示范圍,然后就有誤差了。

好了,下面話不多說了,開始本文的正文:

起步

浮點(diǎn)數(shù)的一個(gè)普遍的問題是它們不能精確的表示十進(jìn)制數(shù)。

>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False
>>>

這是由于底層 CPU 和IEEE 754 標(biāo)準(zhǔn)通過自己的浮點(diǎn)單位去執(zhí)行算術(shù)時(shí)的特征??此朴懈F的小數(shù), 在計(jì)算機(jī)的二進(jìn)制表示里卻是無窮的。

一般情況下,這一點(diǎn)點(diǎn)的小誤差是允許存在的。如果不能容忍這種誤差(比如金融領(lǐng)域),那么就要考慮用一些途徑來解決這個(gè)問題了。

Decimal

使用這個(gè)模塊不會(huì)出現(xiàn)任何小誤差。

>>> from decimal import Decimal
>>> a = Decimal('4.2')
>>> b = Decimal('2.1')
>>> a + b
Decimal('6.3')
>>> print(a + b)
6.3
>>> (a + b) == Decimal('6.3')
True

盡管代碼看起來比較奇怪,使用字符串來表示數(shù)字,但是 Decimal 支持所有常用的數(shù)學(xué)運(yùn)算。 decimal 模塊允許你控制計(jì)算的每一方面,包括數(shù)字位數(shù)和四舍五入。在這樣做之前,需要?jiǎng)?chuàng)建一個(gè)臨時(shí)上下文環(huán)境來改變這種設(shè)定:

>>> from decimal import Decimal, localcontext
>>> a = Decimal('1.3')
>>> b = Decimal('1.7')
>>> print(a / b)
0.7647058823529411764705882353
>>> with localcontext() as ctx:
...  ctx.prec = 3
...  print(a / b)
...
0.765
>>> with localcontext() as ctx:
...  ctx.prec = 50
...  print(a / b)
...
0.76470588235294117647058823529411764705882352941176
>>>

由于 Decimal 的高精度數(shù)字自然也就用字符串來做展示和中轉(zhuǎn)。

總結(jié)

總的來說,當(dāng)涉及金融領(lǐng)域時(shí),哪怕是一點(diǎn)小小的誤差在計(jì)算過程中都是不允許的。因此 decimal 模塊為解決這類問題提供了方法。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Python continue繼續(xù)循環(huán)用法總結(jié)

    Python continue繼續(xù)循環(huán)用法總結(jié)

    本篇文章給大家總結(jié)了關(guān)于Python continue繼續(xù)循環(huán)的相關(guān)知識(shí)點(diǎn)以及用法,有需要的朋友跟著學(xué)習(xí)下吧。
    2018-06-06
  • 淺談Python 責(zé)任鏈模式

    淺談Python 責(zé)任鏈模式

    本文主要介紹了淺談Python 責(zé)任鏈模式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • django多種支付、并發(fā)訂單處理實(shí)例代碼

    django多種支付、并發(fā)訂單處理實(shí)例代碼

    在本篇文章里小編給大家整理的是關(guān)于django多種支付、并發(fā)訂單處理實(shí)例代碼,需要的朋友們可以學(xué)習(xí)下。
    2019-12-12
  • 使用Python刪除PDF文檔頁面的頁邊距的操作代碼

    使用Python刪除PDF文檔頁面的頁邊距的操作代碼

    在處理PDF文檔時(shí),有時(shí)候我們會(huì)遇到PDF文件帶有較大的頁邊距的情況,這樣過大的頁邊距不僅浪費(fèi)了頁面空間,而且在打印或電子閱讀時(shí)也可能影響用戶體驗(yàn),本文使用的方法需要用到Spire.PDF?for?Python,PyPI:pip?install?spire.pdf,需要的朋友可以參考下
    2024-10-10
  • python如何基于redis實(shí)現(xiàn)ip代理池

    python如何基于redis實(shí)現(xiàn)ip代理池

    這篇文章主要介紹了python如何基于redis實(shí)現(xiàn)ip代理池,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Python面向?qū)ο蟮某绦蛟O(shè)計(jì)詳情

    Python面向?qū)ο蟮某绦蛟O(shè)計(jì)詳情

    這篇文章主要介紹了Python面向?qū)ο蟮某绦蛟O(shè)計(jì)詳情,面向?qū)ο蟮某绦蛟O(shè)計(jì)在Python中具有非常重要的地位,熟練的使用面向?qū)ο缶幊棠軌驗(yàn)槲覀兊腜ython編程提供很多的便利之處,希望您閱讀完本文后能夠有所收獲
    2022-01-01
  • 一篇文章搞定Python操作文件與目錄

    一篇文章搞定Python操作文件與目錄

    這篇文章主要給大家介紹了關(guān)于如何通過一篇文章搞定Python操作文件與目錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Python+tkinter編寫一個(gè)最近很火的強(qiáng)制表白神器

    Python+tkinter編寫一個(gè)最近很火的強(qiáng)制表白神器

    這篇文章主要為大家詳細(xì)介紹了Python如何通過tkinter編寫一個(gè)最近很火的強(qiáng)制表白神器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起嘗試一下
    2023-04-04
  • python生成單位陣或?qū)顷嚨娜N方式小結(jié)

    python生成單位陣或?qū)顷嚨娜N方式小結(jié)

    這篇文章主要介紹了python生成單位陣或?qū)顷嚨娜N方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python實(shí)現(xiàn)給PDF添加水印的方法

    Python實(shí)現(xiàn)給PDF添加水印的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)給PDF添加水印的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評(píng)論