程序員必知之浮點數運算原理詳解

導讀:浮點數運算是一個非常有技術含量的話題,不太容易掌握。許多程序員都不清楚使用==操作符比較float/double類型的話到底出現什么問題。 許多人使用float/double進行貨幣計算時經常會犯錯。這篇文章是這一系列中的精華,所有的軟件開發人員都應該讀一下。

  隨著你經驗的增長,你肯定 想去深入了解一些常見的東西的細節,浮點數運算就是其中之一。

1. 什么是浮點數?

  在計算機系統的發展過程中,曾經提出過多種方法表達實數。

  【1】典型的比如相對于浮點數的定點數(Fixed Point Number)。在這種表達方式中,小數點固定的位于實數所有數字中間的某個位置。貨幣的表達就可以使用這種方式,比如 99.00 或者 00.99 可以用于表達具有四位精度(Precision),小數點后有兩位的貨幣值。由于小數點位置固定,所以可以直接用四位數值來表達相應的數值。SQL 中的 NUMBER 數據類型就是利用定點數來定義的。

  【2】還有一種提議的表達方式為有理數表達方式,即用兩個整數的比值來表達實數。

  定點數表達法的缺點在于其形式過于僵硬,固定的小數點位置決定了固定位數的整數部分和小數部分,不利于同時表達特別大的數或者特別小的數。最終,絕大多數現代的計算機系統采納了所謂的浮點數表達方式。

  【3】浮點數表達方式, 這種表達方式利用科學計數法來表達實數,即用一個尾數(Mantissa ),一個基數(Base),一個指數(Exponent)以及一個表示正負的符號來表達實數。比如 123.45 用十進制科學計數法可以表達為 1.2345 × 102 ,其中 1.2345 為尾數,10 為基數,2 為指數。浮點數利用指數達到了浮動小數點的效果,從而可以靈活地表達更大范圍的實數。提示: 尾數有時也稱為有效數字(Significand)。尾數實際上是有效數字的非正式說法。

  同樣的數值可以有多種浮點數表達方式,比如上面例子中的 123.45 可以表達為 12.345 × 101,0.12345 × 103 或者 1.2345 × 102。因為這種多樣性,有必要對其加以規范化以達到統一表達的目標。規范的(Normalized)浮點數表達方式具有如下形式:

  d.dd...d × βe?, (0 ≤ di?< β)

  其中?d.dd...d 即尾數,β 為基數,e 為指數。尾數中數字的個數稱為精度,在本文中用 p(presion) 來表示。每個數字 d 介于 0 和基數β之間,包括 0。小數點左側的數字不為 0。

(1)  基于規范表達的浮點數對應的具體值可由下面的表達式計算而得:(p是精度個數)

  ±(d0 + d1β-1 + ... + dp-1β-(p-1)e , (0 ≤ di < β)

  對于十進制的浮點數,即基數 β 等于 10 的浮點數而言,上面的表達式非常容易理解,也很直白。計算機內部的數值表達是基于二進制的。從上面的表達式,我們可以知道,二進制數同樣可以有小數點,也 同樣具有類似于十進制的表達方式。只是此時 β 等于 2,而每個數字 d 只能在 0 和 1 之間取值。

(2)  比如二進制數 1001.101 相當于:精度為7

   1 × 2?3?+ 0 × 22?+ 0 × 21?+ 1 × 20?+ 1 × 2-1?+ 0 × 2-2?+ 1 × 2-3,對應于十進制的 9.625。

  其規范浮點數表達為 1.001101 × 23

(3)  IEEE (美國電氣和電子工程師學會)浮點數

  計算機中是用有限的連續字節保存浮點數的。

  IEEE定義了多種浮點格式,但最常見的是三種類型:單精度、雙精度、擴展雙精度,分別適用于不同的計算要求。一般而言,單精度適合一般計算,雙精度適合科學計算,擴展雙精度適合高精度計算。一個遵循IEEE 754標準的系統必須支持單精度類型(強制類型)、最好也支持雙精度類型(推薦類型),至于擴展雙精度類型可以隨意。單精度(Single Precision)浮點數是32位(即4字節)的,雙精度(Double Precision)浮點數是64位(即8字節)的。

  保存這些浮點數當然必須有特定的格式,Java 平臺上的浮點數類型 float 和 double 采納了 IEEE 754 標準中所定義的單精度 32 位浮點數和雙精度 64 位浮點數的格式。注意:?Java 平臺還支持該標準定義的兩種擴展格式,即 float-extended-exponent 和 double-extended-exponent 擴展格式。這里將不作介紹,有興趣的讀者可以參考相應的參考資料。

  在 IEEE 標準中,浮點數是將特定長度的連續字節的所有二進制位分割為特定寬度的符號域,指數域和尾數域三個域,其中保存的值分別用于表示給定二進制浮點數中的符號,指數和尾數。這樣,通過尾數和可以調節的指數(所以稱為"浮點")就可以表達給定的數值了。

  具體的格式參見下面的表格:

  

  需要特別注意的是,擴展雙精度類型沒有隱含位,因此它的有效位數與尾數位數一致,而單精度類型和雙精度類型均有一個隱含位,因此它的有效位數比位數位數多一個。


?

  IEEE754標準規定一個實數V可以用:  V=(-1)s×M×2^E的形式表示,說明如下:
  (1)符號s(sign)決定實數是正數(s=0)還是負數(s=1),對數值0的符號位特殊處理。
  (2)有效數字M是二進制小數,M的取值范圍在1≤M<2或0≤M<1。
  (3)指數E(exponent)是2的冪,它的作用是對浮點數加權。


?  為了強制定義一些特殊值,IEEE標準通過指數將表示空間劃分成了三大塊:

  【1】最小值指數(所有位全置0)用于定義0和弱規范數

  【2】最大指數(所有位全值1)用于定義±∞和NaN(Not a Number)

  【3】其他指數用于表示常規的數。

  這樣一來,最大(指絕對值)常規數的指數不是全1的,最小常規數的指數也不是0,而是1。

  

?

  S:符號位,    Exponent:指數域    Fraction:尾數域

  注意:尾數有時也稱為有效數字(Significand),

   一般如1.001001*2EValue,即一個尾數(Mantissa ),一個基數(底數Base),一個指數Evalue表示

  即: M * BE?=?尾數 * 底數指數

  通常情況,IEEE標準寫法,尾數的1,省略,Fraction= 0.001001,因為標準寫法,前面的1總是省略?Fraction = 尾數 - 1?;(IEEE規定小數點左側的 1 是隱藏的

  如果指數值:加上相應的浮點數偏執后的值:即?Exponent = EValue + Bias

  所以上述的值: X = (-1)S? X ( 1 + Fraction)?(Exponent - Bias), 也就不足為奇了


?

  在上面的圖例中:

  ①  第一個域:為符號域。其中?0 表示數值為正數,而 1 則表示負數

  ②  第二個域為指數域,對應于我們之前介紹的二進制科學計數法中的指數部分。

  指數閾:通常使用移碼表示:

  移碼和補碼只有符號位相反,其余都一樣。對于正數而言,原碼、反碼和補碼都一樣;對于負數而言,補碼就是其絕對值的原碼全部取反,然后加1(不包括符號位))。

  其中單精度數為 8 位,雙精度數為 11 位。以單精度數為例,8 位的指數為可以表達 0 到 255 之間的 255 個指數值

  但是,指數可以為正數,也可以為負數。為了處理負指數的情況,實際的指數值按要求需要加上一個偏差(Bias)值作為保存在指數域中的值,單精度數的偏差值為 127(0-111 1111)(8位),而雙精度數的偏差值為 1023(0-1 1111 1111)(10位)。比如,單精度的實際指數值 0?在指數域中將保存為 127;而保存在指數域中的 64 則表示實際的指數值 -63偏差的引入使得對于單精度數,實際可以表達的指數值的范圍就變成 -127 到 128 之間(包含兩端)[-127, 128]

  我們不久還將看到:

  實際的指數值 -127(保存為 全 0),即: 首先-127原碼1-111 1111,的補碼1-000 0001,然后加上單精度偏執: 0-111 111 ,即結果:0-000 0000,全0.  所以0-000 0000 指數位表示:-127,即e-127

  以及 +128(保存為全 1), 即:首先+128原碼‘1’-000 0000,的補碼, ‘1’-000 0000,然后加上單精度偏執:0-111 111 ,, 即結果:‘1’-111 1111,全1。?  即全1 指數位表示:+128,即e+128

  這些特殊值,保留用作特殊值的處理。這樣,實際可以表達的有效指數范圍就在 -127 和 127 之間。在本文中,最小指數和最大指數分別用 emin 和 emax 來表達。


?

  計算機中的符號數有三種表示方法,即原碼、反碼和補碼。

  如補碼的求取:
    ①  正數(符號位為0的數)補碼與原碼相同.
    ②  負數(符號位為1的數)變為補碼時符號位不變,其余各項取反,最后在末尾+1;即求負數的反碼不包括符號位。
  例如:正數  原碼01100110,補碼為:01100110
     負數  原碼11100110,先變反碼:10011001,再加1變為補碼:10011010
  計算機中的符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位,三種表示方法各不相同。
  在計算機系統中,數值一律用補碼來表示和存儲。原因在于:①使用補碼,可以將符號位和數值域統一處理;②同時,加法和減法也可以統一處理。此外,③補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬件電路。
  特性
  ①  一個負整數(或原碼)與其補數(或補碼)相加,和為模。eg:原碼11100110, 補碼:10011010 和:
  ②  對一個整數的補碼再求補碼,等于該整數自身。
  ③  補碼的正零與負零表示方法相同。即 0-0000000, 1-0000000取反加1, 0-0000000


?

  ③  圖例中的第三個域為尾數域,其中單精度數為 23 位長,雙精度數為 52 位長。除了我們將要講到的某些特殊值外,IEEE 標準要求浮點數必須是規范的。這意味著尾數的小數點左側必須為 1,因此我們在保存尾數的時候,可以省略小數點前面這個 1,從而騰出一個二進制位來保存更多的尾數。這樣我們實際上用 23 位長的尾數域表達了 24 位的尾數。比如對于單精度數而言,二進制的 1001.101(對應于十進制的 9.625)可以表達為 1.001101 × 23,所以實際保存在尾數域中的值為 00110100000000000000000,即去掉小數點左側的 1,并用 0 在右側補齊。

?  根據IEEE(美國電氣和電子工程師學會)754標準要求,無法精確保存的值必須向最接近的可保存的值進行舍入。這有點像我們熟悉的十進制的四舍五入,即不足一半則舍,一半以上(包括一半)則進。不過對于二進制浮 點數而言,還多一條規矩,就是當需要舍入的值剛好是一半時,不是簡單地進,而是在前后兩個等距接近的可保存的值中,取其中最后一位有效數字為零者。從上面 的示例中可以看出,奇數都被舍入為偶數,且有舍有進。我們可以將這種舍入誤差理解為"半位"的誤差。所以,為了避免 7.22 對很多人造成的困惑,有些文章經常以 7.5 位來說明單精度浮點數的精度問題。

  據以上分析,IEEE 754標準中定義浮點數的表示范圍為:

  單精度浮點數  二進制:± (2-2^-23) × 2127    對應十進制:  ~ ± 10^38.53

  雙精度浮點數  ? 二進制:± (2-2^-52) × 21023

  浮點數的表示有一定的范圍,超出范圍時會產生溢出(Flow),一般稱大于絕對值最大的數據為上溢(Overflow),小于絕對值最小的數據為下溢(Underflow)。

?

2.?浮點數的表示約定

  單精度浮點數和雙精度浮點數都是用IEEE 754標準定義的,其中有一些特殊約定,例如:

  (1)  當P=0,M=0時,表示0。
  (2)  當P=255,M=0時,表示無窮大,用符號位來確定是正無窮大還是負無窮大。
  (3)  當P=255,M≠0時,表示NaN(Not a Number,不是一個數)。

?

3.?特殊值

 通過前面的介紹,你應該已經了解的浮點數的基本知識,這些知識對于一個不接觸浮點數應用的人應該足夠了。不過,如果你興趣正濃,或者面對著一個棘手的浮點數應用,可以通過本節了解到關于浮點數的一些值得注意的特殊之處。

  我們已經知道,單精度浮點數指數域實際可以表達的指數值的范圍為 -127 到 128 之間(包含兩端)。其中,值 -127(保存為全0)以及 +128(保存為全1)保留用作特殊值的處理。本節將詳細 IEEE 標準中所定義的這些特殊值。

  浮點數中的特殊值主要用于特殊情況或者錯誤的處理。比如在程序對一個負數進行開平方時,一個特殊的返回值將用于標記這種錯誤,該值為 NaN(Not a Number)。沒有這樣的特殊值,對于此類錯誤只能粗暴地終止計算。除了 NaN 之外,IEEE 標準還定義了 ±0,±∞ 以及非規范化數(Denormalized Number)。

  對于單精度浮點數,所有這些特殊值都由保留的特殊指數值 -127 和 128 來編碼。如果我們分別用?emin?和?emax?來表達其它常規指數值范圍的邊界,即 -126 和 127,則保留的特殊指數值可以分別表達為?emin?- 1 和?emax?+ 1; 。基于這個表達方式,IEEE 標準的特殊值如下所示:

  

  其中?f?表示尾數中的小數點右側的(Fraction)部分,即標準記法中的有效部分-1

  第一行即我們之前介紹的普通的規范化浮點數。隨后我們將分別對余下的特殊值加以介紹。

  第2,3,4,5行,是特殊值。

(1)NaN

  NaN 用于處理計算中出現的錯誤情況,比如 0.0 除以 0.0 或者求負數的平方根。

  由上面的表中可以看出,對于單精度浮點數,NaN 表示為指數為?emax?+ 1 =?128(指數域全為 1),且尾數域不等于零的浮點數。IEEE 標準沒有要求具體的尾數域,所以?NaN 實際上不是一個,而是一族

  不同的實現可以自由選擇尾數域的值來表達 NaN,比如 Java 中的常量 Float.NaN 的浮點數可能表達為 0-11111111-10000000000000000000000,其中尾數域的第一位為 1,其余均為 0(不計隱藏的一位),但這取決系統的硬件架構。Java 中甚至允許程序員自己構造具有特定位模式的 NaN 值(通過 Float.intBitsToFloat() 方法)。比如,程序員可以利用這種定制的 NaN 值中的特定位模式來表達某些診斷信息。定制的 NaN 值,可以通過 Float.isNaN() 方法判定其為 NaN,但是它和 Float.NaN 常量卻不相等。

  實際上,所有的 NaN 值都是無序的。數值比較操作符 <,<=,> 和 >= 在任一操作數為 NaN 時均返回 false。等于操作符 == 在任一操作數為 NaN 時均返回 false,即使是兩個具有相同位模式的 NaN 也一樣。而操作符 != 則當任一操作數為 NaN 時返回 true。

  這個規則的一個有趣的結果是 x!=x 當 x 為 NaN 時竟然為真

  NaN

  此外,任何有 NaN 作為操作數的操作也將產生 NaN。用特殊的 NaN 來表達上述運算錯誤的意義在于避免了因這些錯誤而導致運算的不必要的終止。比如,如果一個被循環調用的浮點運算方法,可能由于輸入的參數問題而導致發生這些錯誤,NaN 使得 即使某次循環發生了這樣的錯誤,也可以簡單地繼續執行循環以進行那些沒有錯誤的運算。你可能想到,既然 Java 有異常處理機制,也許可以通過捕獲并忽略異常達到相同的效果。但是,要知道,IEEE 標準不是僅僅為 Java 而制定的,各種語言處理異常的機制不盡相同,這將使得代碼的遷移變得更加困難。何況,不是所有語言都有類似的異常或者信號(Signal)處理機制。

(2)無窮

  和 NaN 一樣,特殊值無窮(Infinity)的指數部分同樣為 emax + 1 = 128,不過無窮的尾數域必須為零。無窮用于表達計算中產生的上溢(Overflow)問題。比如兩個極大的數相乘時,盡管兩個操作數本身可以用保存為浮點數,但其結果可能大到無法保存為浮點數,而必須進行舍入。根據 IEEE 標準,此時不是將結果舍入為可以保存的最大的浮點數(因為這個數可能離實際的結果相差太遠而毫無意義),而是將其舍入為無窮。對于負數結果也是如此,只不過此時舍入為負無窮,也就是說符號域為 1 的無窮。有了 NaN 的經驗我們不難理解,特殊值無窮使得計算中發生的上溢錯誤不必以終止運算為結果。

  無窮和除 NaN 以外的其它浮點數一樣是有序的,從小到大依次為負無窮,負的有窮非零值,正負零(隨后介紹),正的有窮非零值以及正無窮。除 NaN 以外的任何非零值除以零,結果都將是無窮,而符號則由作為除數的零的符號決定。  

  回顧我們對 NaN 的介紹,當零除以零時得到的結果不是無窮而是 NaN 。原因不難理解,當除數和被除數都逼近于零時,其商可能為任何值,所以 IEEE 標準決定此時用 NaN 作為商比較合適。

(3)有符號的零

  因為 IEEE 標準的浮點數格式中,小數點左側的 1 是隱藏的,而零顯然需要尾數必須是零。所以,零也就無法直接用這種格式表達而只能特殊處理。實際上,零保存為尾數域為全為 0,指數域為 emin - 1 = -127,也就是說指數域也全為 0。考慮到符號域的作用,所以存在著兩個零,即 +0 和 -0。不同于正負無窮之間是有序的,IEEE 標準規定正負零是相等的。

 零有正負之分,的確非常容易讓人困惑。這一點是基于數值分析的多種考慮,經利弊權衡后形成的結果。有符號的零可以避免運算中,特別是涉及無窮的運算中,符號信息的丟失。舉例而言,如果零無符號,則等式 1/(1/x) = x 當x = ±∞ 時不再成立。原因是如果零無符號,1 和正負無窮的比值為同一個零,然后 1 與 0 的比值為正無窮,符號沒有了。解決這個問題,除非無窮也沒有符號。但是無窮的符號表達了上溢發生在數軸的哪一側,這個信息顯然是不能不要的。零有符號也造成了其它問題,比如當 x=y 時,等式1/x = 1/y 在 x 和 y 分別為 +0 和 -0 時,兩端分別為正無窮和負無窮而不再成立。當然,解決這個問題的另一個思路是和無窮一樣,規定零也是有序的。但是,如果零是有序的,則即使 if (x==0) 這樣簡單的判斷也由于 x 可能是 ±0 而變得不確定了。兩害取其輕者,零還是無序的好。

(4)非規范化數

  我們來考察浮點數的一個特殊情況。選擇兩個絕對值極小的浮點數,以單精度的二進制浮點數為例,比如 1.001 × 2-125 和 1.0001 × 2-125 這兩個數(分別對應于十進制的 2.6448623 × 10-38 和 2.4979255 × 10-38)。顯然,他們都是普通的浮點數(指數為 -125,大于允許的最小值 -126;尾數更沒問題),按照 IEEE 754 可以分別保存為 00000001000100000000000000000000(0x1100000)和 00000001000010000000000000000000(0x1080000)。
  
現在我們看看這兩個浮點數的差值。不難得出,該差值為 0.0001 × 2-125,表達為規范浮點數則為 1.0 × 2-129。問題在于其指數大于允許的最小指數值,所以無法保存為規范浮點數。最終,只能近似為零(Flush to Zero)。這中特殊情況意味著下面本來十分可靠的代碼也可能出現問題:

if (x != y) {z = 1 / (x -y);}

  正如我們精心選擇的兩個浮點數展現的問題一樣,即使?x 不等于 y,x 和 y 的差值仍然可能絕對值過小,而近似為零,導致除以 0 的情況發生。

  為了解決此類問題,IEEE 標準中引入了非規范(Denormalized)浮點數。規定當浮點數的指數為允許的最小指數值,即 emin 時,尾數不必是規范化的。比如上面例子中的差值可以表達為非規范的浮點數 0.001 × 2-126,其中指數 -126 等于 emin。注意,這里規定的是"不必",這也就意味著"可以"。當浮點數實際的指數為 emin,且指數域也為 emin 時,該浮點數仍是規范的,也就是說,保存時隱含著一個隱藏的尾數位。為了保存非規范浮點數,IEEE 標準采用了類似處理特殊值零時所采用的辦法,即用特殊的指數域值 emin - 1?加以標記,當然,此時的尾數域不能為零。這樣,例子中的差值可以保存為 00000000000100000000000000000000(0x100000),沒有隱含的尾數位。
  有了非規范浮點數,去掉了隱含的尾數位的制約,可以保存絕對值更小的浮點數。而且,也由于不再受到隱含尾數域的制約,上述關于極小差值的問題也不存在了,因為所有可以保存的浮點數之間的差值同樣可以保存。

4.?范圍和精度

 很多小數根本無法在二進制計算機中精確表示(比如最簡單的 0.1)由于浮點數尾數域的位數是有限的,為此,浮點數的處理辦法是持續該過程直到由此得到的尾數足以填滿尾數域,之后對多余的位進行舍入。

  換句話說,除了我們之前講到的精度問題之外,十進制到二進制的變換也并不能保證總是精確的,而只能是近似值

  事實上,只有很少一部分十進制小數具有精確的二進制浮點數表達。再加上浮點數運算過程中的誤差累積,結果是很多我們看來非常簡單的十進制運算在計算機上卻往往出人意料。這就是最常見的浮點運算的"不準確"問題。

  參見下面的 Java 示例:

System.out.print("34.6-34.0=" + (34.6f-34.0f));

  這段代碼的輸出結果如下:

34.6-34.0=0.5999985

  產生這個誤差的原因是?34.6 無法精確的表達為相應的浮點數,而只能保存為經過舍入的近似值。這個近似值與 34.0 之間的運算自然無法產生精確的結果。

  存儲格式的范圍和精度如下表所示:

5. 舍入

  值得注意的是,對于單精度數,由于我們只有?24 位的尾數(其中一位隱藏),所以可以表達的最大指數為 224?- 1 = 16,777,215。

  特別的,16,777,216 是偶數,所以我們可以通過將它除以 2 并相應地調整指數來保存這個數,這樣 16,777,216 同樣可以被精確的保存。相反,數值      16,777,217 則無法被精確的保存。由此,我們可以看到單精度的浮點數可以表達的十進制數值中,真正有效的數字不高于 8 位

  事實上,對相對誤差的數值分析結果顯示有效的精度大約為 7.22 位。

  實例如下所示:

  

  根 據標準要求,無法精確保存的值必須向最接近的可保存的值進行舍入。這有點像我們熟悉的十進制的四舍五入,即不足一半則舍,一半以上(包括一半)則進。不過 對于二進制浮點數而言,還多一條規矩,就是當需要舍入的值剛好是一半時,不是簡單地進,而是在前后兩個等距接近的可保存的值中,取其中最后一位有效數字為 零者。從上面的示例中可以看出,奇數都被舍入為偶數,且有舍有進。我們可以將這種舍入誤差理解為"半位"的誤差。所以,為了避免 7.22 對很多人造成的困惑,有些文章經常以 7.5 位來說明單精度浮點數的精度問題。

  提示:?這里采用的浮點數舍入規則有時被稱為舍入到偶數(Round to Even)。相比簡單地逢一半則進的舍入規則,舍入到偶數有助于從某些角度減小計算中產生的舍入誤差累積問題。因此為 IEEE 標準所采用

轉載于:https://www.cnblogs.com/jikexianfeng/p/6407017.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393810.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

axure選中后橫線切換_3、開關狀態切換 —— Axure實用交互

寫在開頭:開關的制作在幾乎所有原型設計中都會用到&#xff0c;所以美觀自然的交互開關可以給你的原型設計加分不少。本次開關設計主要用到的是邏輯為&#xff1a;選中狀態的切換首先&#xff0c;來看一下演示動畫開始原型設計一、創建元件首先需要打開Axure軟件&#xff0c;并…

Django框架——模型(數據庫操作)

-- models.py-- ORM(object-relation mapping) 實現數據模型與數據庫的解耦&#xff1b;# 對象&#xff0c;關系&#xff0c;映射&#xff1b;1.根 據對象的類型生成表結構&#xff1b;2.將對象、列表的操作&#xff0c;轉換為sql語句&#xff1b;3.將sql查詢到的結果轉換為對象…

leetcode140. 單詞拆分 II(回溯+記憶化)

給定一個非空字符串 s 和一個包含非空單詞列表的字典 wordDict&#xff0c;在字符串中增加空格來構建一個句子&#xff0c;使得句子中所有的單詞都在詞典中。返回所有這些可能的句子。 說明&#xff1a; 分隔時可以重復使用字典中的單詞。 你可以假設字典中沒有重復的單詞。 …

#loj 3058 [HNOI2019] 白兔之舞

單位根反演思博題 模數是亂給的記得整個任意模數ntt k為p-1的約數意味著一定存在k次單位根&#xff0c;設g是p的原根則\(w_{k}^{1}g^{\frac{k-1}{p}}\) 既然k次單位根存在自然考慮單位根反演了 設\(f(i)\)表示跳了i步并且停在了第二維為y的頂點的方案數 設\(st\)表示初始向量而…

標桿徐2018 Linux自動化運維實戰,標桿徐2018 Linux自動化運維系列⑦: SaltStack自動化配置管理實戰...

結合企業自動化集群場景講解&#xff0c;輕松玩轉SaltStack自動化配置管理工具第1章 SaltStack基礎應用SaltStack安裝SaltStack認證Saltstack遠程執行SaltStack配置管理第2章 SaltStack數據系統SaltStack數據系統-Grains 客戶端向服務端發送狀態SaltStack數據系統-paiil 服務…

JS 對象引用問題

var a {n:1}; var b a; a {n:2}; a.x a ;console.log(a.x);console.log(b.x); var a {n:1}; var b a; a.x a {n:2}; console.log(a.x);console.log(b.x); 這兩個問題主要理解兩點就很簡單了。 對象是引用類型&#xff0c;改變賦值只是改變指針的引用。運算符相當于改變…

工程代碼_Egret開發筆記(二)基礎工程代碼閱讀

代碼目錄結構在Egret Wing中打開上一節中我們創建的項目工程&#xff0c;查看代碼目錄結構&#xff0c;Forward在如下圖中標記了各個目錄的及關鍵文件的用途。代碼閱讀理解接下來我們從web入口一步一步閱讀初始代碼。首先打開index.html文件&#xff0c;我們看到index文件內容如…

知曉云助力小程序開發

小程序開發遇到瓶頸雖然騰訊提供了小程序解決方案&#xff0c;https://cloud.tencent.com/solution/la。但是對于普通開發者或者小企業的開發人員來說&#xff0c;購買域名&#xff0c;網站備案、部署SSL證書&#xff0c;安裝會話服務器。業務邏輯上要使用數據庫&#xff0c;緩…

leetcode131. 分割回文串(回溯)

給定一個字符串 s&#xff0c;將 s 分割成一些子串&#xff0c;使每個子串都是回文串。 返回 s 所有可能的分割方案。 示例: 輸入: “aab” 輸出: [ [“aa”,“b”], [“a”,“a”,“b”] ] 代碼 class Solution {List<List<String>> stringListnew ArrayList…

Cracer滲透-windows基礎(系統目錄,服務,端口,注冊表)

系統目錄C:\Windows\system32\config\SAM (保存系統密碼) 無法正常修改&#xff0c;可以進入PE系統進行修改&#xff08;先備份在清空&#xff09;利用結束后&#xff0c;再將之前備份的恢復C:\Windows\System32\drivers\hosts&#xff08;域名解析文件&#xff09;hosts欺騙&a…

java--xml文件讀取(SAX)

SAX解析原理&#xff1a; 使用Handler去逐個分析遇到的每一個節點 SAX方式解析步奏&#xff1a; 創建xml解析需要的handler&#xff08;parser.parse(file,handler)&#xff09; package com.imooc_xml.sax.handler;import java.util.ArrayList;import org.xml.sax.Attributes…

算法訓練營 重編碼_編碼訓練營之后該做什么-以及如何獲得成功

算法訓練營 重編碼by Anthony Morris安東尼莫里斯(Anthony Morris) 編碼訓練營之后該做什么-以及如何獲得成功 (What to do — and how to find success — after a coding bootcamp) It’s almost been two years since I graduated from the Lighthouse Labs Web Developmen…

leetcode860. 檸檬水找零(貪心)

在檸檬水攤上&#xff0c;每一杯檸檬水的售價為 5 美元。 顧客排隊購買你的產品&#xff0c;&#xff08;按賬單 bills 支付的順序&#xff09;一次購買一杯。 每位顧客只買一杯檸檬水&#xff0c;然后向你付 5 美元、10 美元或 20 美元。你必須給每個顧客正確找零&#xff0…

linux防火墻開啟某端口命令行,linux上防火墻 開啟某個端口

linux下防火墻 開啟某個端口直接在/etc/sysconfig/iptables中增加一行&#xff1a;-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 8080 -j ACCEPT注意添加位置:-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT-A RH-Fi…

imp命令導入指定表_Sqoop 使用shell命令的各種參數的配置及使用方法

點擊上方藍色字體&#xff0c;選擇“設為星標”回復”資源“獲取更多資源本文作者&#xff1a;Sheep Sun本文鏈接&#xff1a;https://www.cnblogs.com/yangxusun9/p/12558683.html大數據技術與架構點擊右側關注&#xff0c;大數據開發領域最強公眾號&#xff01;暴走大數據點擊…

黑客頻繁來襲 關注云計算的安全與保障

本文講的是 : 黑客頻繁來襲 關注云計算的安全與保障 , 【IT168 資訊】日前&#xff0c;虎嗅網遭受網絡攻擊的事件&#xff0c;引起業內關注。2月27日晚&#xff0c;虎嗅網中斷訪問&#xff0c;虎嗅網新浪官方微博隨即發表聲明&#xff0c;表示網站受到惡意攻擊&#xff0c;隨…

51nod 1100:斜率最大

題目鏈接 斜率最大點對橫坐標必相鄰 #include <bits/stdc.h> using namespace std; const int maxn 1e4 100;struct point {int x, y, pos;bool operator < (const point& rhs)const{return x<rhs.x;} } a[maxn]; double xielv(point a, point b) {return (a…

ik分詞和jieba分詞哪個好_Pubseg:一種單雙字串的BiLSTM中文分詞工具

中文分詞是中文自然語言處理中的重要的步驟&#xff0c;有一個更高精度的中文分詞模型會顯著提升文檔分類、情感預測、社交媒體處理等任務的效果[1]。Pubseg是基于BiLSTM中文分詞工具&#xff0c;基于ICWS2005PKU語料訓練集訓練而成&#xff0c;其優點在于在ICWS2005-PKU語料下…

freecodecamp_freeCodeCamp.org隱私權政策:問題與解答

freecodecampWe take your privacy seriously. And we give you full control over your data.我們把你的隱私當回事。 而且&#xff0c;我們可以完全控制您的數據。 freeCodeCamp doesnt show you ads or sell your data to anyone. Our nonprofit is instead supported by t…

leetcode1029. 兩地調度(貪心算法)

公司計劃面試 2N 人。第 i 人飛往 A 市的費用為 costs[i][0]&#xff0c;飛往 B 市的費用為 costs[i][1]。 返回將每個人都飛到某座城市的最低費用&#xff0c;要求每個城市都有 N 人抵達。 示例&#xff1a; 輸入&#xff1a;[[10,20],[30,200],[400,50],[30,20]] 輸出&…