コンテンツにスキップ

端数処理

出典: フリー百科事典『ウィキペディア(Wikipedia)』
切り上げから転送)
 Compet CS-2122L



101001010.10.01N

丸めの種類

[編集]

凡例

[編集]

1#0.1


切り捨て・切り上げ

[編集]

0010

4

00 (rounding toward zero; RZ) (rounding toward infinity; RI)

 (rounding toward minus infinity; RM) (rounding toward plus infinity; RP)

11使

使








(広義の)最近接丸め

[編集]

2 (round to the nearest)

0.5[0, 1)0.50.5


四捨五入

[編集]

0.50.5JIS Z 8401B[1]45R

0.50210.50.51.51JIS Z 84011.520.5[1]

0.5

五捨五超入

[編集]

0.50.5

0.5

0.5

偶数への丸め(round to even)

[編集]

round to even[2][3]0.50.50.5(+0.5+0.5JIS Z 8401AB[1]

0.5+0.5+0.5

JIS Z 8401 JIS[4]ISO 31-0ISO使 (bankers' rounding)[ 1]50.5[ 2]

奇数への丸め(round to odd)

[編集]

round to odd[2]0.50.50.5

0.5+0.5+0.5

実用上は最近接丸めとなる丸め

[編集]

定義は最近接丸めになっていないが、最近接丸めと等しくなる場合にのみ実用される丸めがいくつかある。

五捨六入

[編集]

56[ 3]

0.40.550使

0.10.10.50.60.90.50.6

0.11001000

使0

四捨六入

[編集]

#

スウェディッシュ・ラウンディング

[編集]

533

15

IEEE丸め

[編集]

IEEE 754で丸めモードとして定められている

  • 最近接丸め(偶数)
  • 0への丸め
  • 正の無限大への丸め
  • 負の無限大への丸め

の4つを「IEEE丸め」と総称する。

特殊な丸め

[編集]

乱数丸め

[編集]

[0,1)



10

00.5

使

フォン・ノイマン丸め

[編集]

常に奇数側へ丸める。

二進法では、切り捨てた後LSBをセットするという、簡単なアルゴリズムで得られる。

この方法の丸め誤差は切り捨て・切り上げと同程度で大きいが、ランダムなデータに対してはバイアスを持たない。

2回以上の丸めの禁止

[編集]

2

122.51  123  122.5  122 

123.49  123  123.5  124 

 + 0.50.50.5 + 0.5[ 4]

[編集]

与えられた数値を上で挙げた端数処理によって置き換えた場合の結果を示す。この例では、丸め幅は0.1である[注 5]

与えられた数値 切り捨て 切り上げ 四捨五入 五捨六入 偶数への丸め
8.05 8.0 8.1 8.1 8.0 8.0
8.051 8.0 8.1 8.1 8.0 8.1
8.15 8.1 8.2 8.2 8.1 8.2
8.25 8.2 8.3 8.3 8.2 8.2
8.263 8.2 8.3 8.3 8.3 8.3
8.347 8.3 8.4 8.3 8.3 8.3
8.35 8.3 8.4 8.4 8.3 8.4
8.45 8.4 8.5 8.5 8.4 8.4

太字の数値は、四捨五入の場合と異なる結果となるものである。

コンピュータでの丸め

[編集]

低レベルの丸め

[編集]

choppingは、あるビット以下を全て0にする。これは最も計算が簡単な丸めで、正の数に対しては切捨てとなる。負数に対する動作は負数の方式によるが、2の補数表現では負の無限大への丸めとなる。

choppingは、下位ビットを明示的に0にするほか、たとえば32ビットレジスタの上位16ビットを16ビットレジスタとして使うなどでも得られる。

choppingのあと、有効桁の中でのLSBをセットすると、フォン・ノイマン丸めとなる。

プログラミング言語の丸め関数

[編集]

FPU

12

RubyPHP 0.1  0.11 1 0.1  0.1 [5]

32

floor, ceiling, truncate

[編集]
floor関数(緑)とceil関数(赤)

0使

 - floor

 - ceilceiling

 - trunctruncatefix

5IEEE3

: ±3.7 1
  • ceil(3.7) = 4, ceil(-3.7) = -3
  • floor(3.7) = 3, floor(-3.7) = -4
  • trunc(3.7) = 3, trunc(-3.7) = -3

round

[編集]

round[ 6]
プログラミング言語 round(0.5) round(-0.5)
C99
C++11

Ruby

1 -1
.NET Framework
Python
0 0
Java 1 0
JavaScript 1 -0

C言語における型変換と端数処理

[編集]
演算子(int)



Cmodf0

§a.b JIS X 3010-1993C89

C§6.2.1.30

C89§7.5floorceil§7.5.6

C99roundfegetround/fesetroundmath.hfenv.h

 (int)(0.6/0.2)  3.0  2.0  0.6  0.2 0.6/0.2  2.9999999999999996 

テーブルメーカーのジレンマ (数表作成者のジレンマ)

[編集]

[ 7]#2[6]



 y^w 21/2ulp1ulp y^w 1/2ulp?...()

IEEE75419851985bit1ULP2008

GelfondSchneiderLindemannWeierstrass



GNU MPFR



IBMlibultim ()

Sun Microsystemslibmcr (4)

Arénaire(LIP, ENS Lyon)CRlibm (4)

determined 42

10^n n420

n10

建設事業における積算の例

[編集]

[7]

1()2[8][9]51[?][10]32 P2823032

[9]  

m3mm m 3cm

3

1便

mm42215226. (6).2)3()

mm2m3t21100

[11]調

[12]44×23×11

脚注

[編集]

注釈

[編集]


(一)^ JISISO

(二)^ 

(三)^ 

(四)^ ...000  0  lexer XXX...XXX.5000000000000000000000001 

(五)^ JIS Z8401:2019, p.2, 2 e) 

(六)^ []MicrosoftC99C++11JavaECMAScript(JavaScript)

(七)^ 

出典

[編集]


(一)^ abcJISZ8401 2019.

(二)^ ab"The Art of Computer Programming" D. E. Knuth (1997, § 4.2.2)The Art of Computer Programming Volume 2 Seminumerical algorithms Third Edition Donald E.Knuth2004ISBN 978-4-7561-4543-7 p.224 §4.2.2 (20041026 )

(三)^ C (UNIX & Information Science)    5 p.12 §1.5

(四)^    1989/4/26 1 6 p.208

(五)^ 210. Island Life. 20161223

(六)^ Jean-Michel Muller. Introduction to the Table Maker's Dilemma. 2019310

(七)^ 
.   (26-02-21). 2019920[] 

.   (H23.10.1). 2019920


(八)^ ().  . 2019920

(九)^ ab.  . 2019920

(十)^ 
3010 .  . 20211202019920

.  . 2019920

.  . 2019920[]


(11)^ .  . 2019919

(12)^  (30-03-20). .  . 20191016

参考文献

[編集]

規格

[編集]

関連項目

[編集]