99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀python中實現(xiàn)精確的浮點數(shù)運(yùn)算詳解
python中實現(xiàn)精確的浮點數(shù)運(yùn)算詳解
2018-02-01
收藏

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

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

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

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

比如1.2我會表示成1,2.4表示成2,3.6表示成4.

所以呢?

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

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

但是在算1.2 + 1.2 + 1.2 - 3.6的時候,由于計算機(jī)表示的問題,我算的實際上是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ī)內(nèi)部進(jìn)行運(yùn)算的數(shù)值,我說清楚了嗎?

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

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

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

起步

浮點數(shù)的一個普遍的問題是它們不能精確的表示十進(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)通過自己的浮點單位去執(zhí)行算術(shù)時的特征。看似有窮的小數(shù), 在計算機(jī)的二進(jìn)制表示里卻是無窮的。

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

Decimal

使用這個模塊不會出現(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 模塊允許你控制計算的每一方面,包括數(shù)字位數(shù)和四舍五入。在這樣做之前,需要創(chuàng)建一個臨時上下文環(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)域時,哪怕是一點小小的誤差在計算過程中都是不允許的。因此 decimal 模塊為解決這類問題提供了方法。



數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }