亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

解決Python中的modf()函數(shù)取小數(shù)部分不準(zhǔn)確問題

瀏覽:21日期:2022-06-18 09:33:39
使用math.modf()對一個浮點數(shù)進行拆分時經(jīng)常會遇到如下情況

如下

import mathprint(math.modf(2.4)) # 輸出 (0.3999999999999999, 2.0)

我們會發(fā)現(xiàn)對2.4進行拆分得到的小數(shù)并不是0.4,這是因為什么呢?

這是因為計算機采用的是二進制代碼,而二進制代碼由于計算上的誤差無法準(zhǔn)確表示某些十進制數(shù)的小數(shù)部分。

下面我們具體來講一下。

我們知道一個十進制數(shù)轉(zhuǎn)化為二進制數(shù)需要分為兩部分進行計算:整數(shù)部分和小數(shù)部分。

整數(shù)部分采用“除二取余法”。將這個整數(shù)除以2,得到它的余數(shù),然后將商再除以3,直到商為0為止,并將各個得到的余數(shù)按照相反的順序進行排列。

小數(shù)部分采用“乘2取整法”,將這個小數(shù)乘2,將新得到的數(shù)的整數(shù)部分取出,再用2乘余下的小數(shù)部分,如此往復(fù)直到乘積中的小數(shù)部分為0或者達到要求的精度為止。并將取出的整數(shù)部分按照取出的先后順序從前到后排列。

123/2=61...1 61/2=30...1 30/2=15...0 15/2=7...1 7/2=3...1 3/2=1...1 1/2=0...1 (123)10=(1111011)20.4*2=0.8...00.8*2=1.6...10.6*2=1.2...10.2*2=0.4...00.4*2=0.8...00.8*2=1.6...10.6*2=1.2...1(0.4)10=(0.011001100110011001100110...)2(123.4)2=(1111011.011001100110011...)2

十進制的0.4轉(zhuǎn)化為二進制時會出現(xiàn)重復(fù)循環(huán)“0110”的情況,但是目前計算機存儲浮點數(shù)是按照電器和電子工程師協(xié)會的標(biāo)準(zhǔn)(IEEE754浮點數(shù)存儲格式標(biāo)準(zhǔn))來進行存儲的。

IEEE規(guī)定單精度浮點最多存儲32位(4個字節(jié)):

31位是符號位。1表示該數(shù)為負(fù),0為正

30~23是指數(shù)位(-128-127)

22~0是尾數(shù)位,尾數(shù)的編碼一般是源碼和補碼

IEEE標(biāo)準(zhǔn)從邏輯上用三元組{S,E,M}表示一個數(shù),如圖所示:

解決Python中的modf()函數(shù)取小數(shù)部分不準(zhǔn)確問題

也就是說上面將0.4轉(zhuǎn)換出的二進制代碼,我們只能存儲23位,即使數(shù)據(jù)類型為double,也只能存儲52位,這樣大家便能看出問題出現(xiàn)的原因了。23位的數(shù)據(jù)顯然無法完整表示0.4的二進制數(shù)據(jù),于是誤差產(chǎn)生了。

那所有的十進制小數(shù)都無法完整表示嗎?不是的,只要小數(shù)部分乘上2最終小數(shù)部分能夠得到0就不會出現(xiàn)這種問題,比如0.5,0.75。

import mathprint(math.modf(1.5)) # 輸出 (0.5,1.0)

0.5*2=1...1(0.5)10=(0.1)20.75*2=1.5...10.5*2=1...1(0.75)10=(0.11)2

補充:Python中“取整”的各種問題

一、初衷:

有時候我們分頁展示數(shù)據(jù)的時候,需要計算頁數(shù)。一般都是向上取整,例如counts=205 pageCouts=20 ,pages= 11 頁。

一般的除法只是取整數(shù)部分,達不到要求。

二、方法:1、通用除法:

UP(A/B) = int((A+B-1)/B)

取臨界值,計算下A+B-1的范圍就OK.

2 、Python除法:

首先要說的是python中的除法運算,

當(dāng)使用x/y形式進行除法運算時,那么會進行所謂的true除法,比如2.0/3的結(jié)果是 0.66666666666666663。

另外一種除法是采用x//y的形式(向下取整),那么這里采用的是所謂floor除法,即得到不大于結(jié)果的最大整數(shù)值,這個運算時與操作數(shù)無關(guān)的。比如2//3的結(jié)果是0,-2//3的結(jié)果是-1,-2.0//3的結(jié)果是-1.0。

在python 3.0中,x/y將只執(zhí)行true除法,而與操作數(shù)無關(guān);x//y則執(zhí)行floor除法。

Python運算向上取整方法:(A+B-1)/B

3、Python match.ceil函數(shù) np.ceil函數(shù)

ceil(x)函數(shù)是向上取整,即取大于等于x的最接近整數(shù)。

import math math.ceil(float(205)/20) import numpy as npnp.ceil(float(205)/20)Python 向上取整的算法1、一般使用floor除法 (np.floor()或者math.floor())

import numpy as np n = np.array([-1.7, -2.5, -0.2, 0.6, 1.2, 2.7, 11]) floor = np.floor(n)print(floor) # [ -2. -3. -1. 0. 1. 2. 11.]2、一般除法/

A=100B=16c=100//16(c=6)3、round()四舍五入函數(shù)。

np.around 返回四舍五入后的值,可指定精度。

around(a, decimals=0, out=None)

a 輸入數(shù)組

decimals 要舍入的小數(shù)位數(shù)。 默認(rèn)值為0。 如果為負(fù),整數(shù)將四舍五入到小數(shù)點左側(cè)的位置

import numpy as np n = np.array([-0.746, 4.6, 9.4, 7.447, 10.455, 11.555]) around1 = np.around(n)print(around1) # [ -1. 5. 9. 7. 10. 12.] around2 = np.around(n, decimals=1)print(around2) # [ -0.7 4.6 9.4 7.4 10.5 11.6] around3 = np.around(n, decimals=-1)print(around3) # [ -0. 0. 10. 10. 10. 10.]Python 分別取整的算法

math模塊中的 modf()方法

將整數(shù)部分和小數(shù)部分分別取出,可以使用math模塊中的 modf()方法

例如:

>>> math.modf(4.25)(0.25, 4.0)>>> math.modf(4.33)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 成年视频xxxxx免费播放软件 | 青青操视频在线免费观看 | 欧美成人r级在线播放 | 国产高清视频在线观看不卡v | 亚洲欧美精品久久 | 久久这里只有精品首页 | 午夜国产片 | 成人免费视频一区二区 | 精品国产高清a毛片无毒不卡 | 午夜精品一区二区三区在线视 | 亚洲免费三级 | 一级特黄a大片免费 | 色九九视频| 九九99 | 久热re在线视频精品免费 | 日韩亚洲人成在线 | 薰衣草视频高清在线观看免费 | 欧美特级毛片a够爽天狼影院 | 成人亚洲网 | 国产欧美在线亚洲一区刘亦菲 | 黄色一级在线 | 中文字幕国产亚洲 | 亚洲欧美精品中字久久99 | 国产河南妇女毛片精品久久 | 色婷婷狠狠五月综合天色拍 | 伊人9999| 成人免费黄色 | 亚洲欧美色综合大色 | 亚洲青青青网伊人精品 | 一区二区不卡在线观看 | 22eee在线播放成人免费视频 | 三亚美女一级毛片 | 在线高清一级欧美精品 | 欧美在线一级精品 | 国产黄色a级 | 欧美成人一区二区三区在线电影 | 成人一级片 | 香港三级毛片 | 国产福利微拍精品一区二区 | 国产精品人人视频 | 欧美日韩免费看 |