誤差のない音律データを求めて。
音律計算やその他について、気になった事をまったりと書いていこうと思います。
(元ブログ(goo)からの引越し。電波度を減らそうと試みた事もあるがちょっと難しそうだ。)

4点を通る球面(3次元空間内)その2

エクセル等の表計算ソフトの逆行列関数を使って4点を通る球面を求める。(3次元空間内)

 

「3点を通る円(2次元平面内)その2」と同じく標準形の方程式を元にする。

球の中心のx座標=a、y座標=b、z座標=c、球の半径=rとすると球の式は

 (x-a)^2+(y-b)^2+(z-c)^2=r^2 (標準形)

となる。展開して

 x^2-2ax+a^2+y^2-2by+b^2+z^2-2cz+c^2=r^2

左辺に変数(a,b,c,rを含む項)を、右辺に定数(a,b,c,rを含まない項)を配置して

(変数と定数の区別がややこしい)

 2a*x+2b*y+2c*z+r^2-a^2-b^2-c^2=x^2+y^2+z^2

となる。4点を

 p1(x1,y1,z1)、p2(x2,y2,z2)、p3(x3,y3,z3)、p4(x4,y4,z4)

とすると

 2a*x1+2b*y1+2c*z1+r^2-a^2-b^2-c^2=x1^2+y1^2+z1^2

 2a*x2+2b*y2+2c*z2+r^2-a^2-b^2-c^2=x2^2+y2^2+z2^2

 2a*x3+2b*y3+2c*z3+r^2-a^2-b^2-c^2=x3^2+y3^2+z3^2

 2a*x4+2b*y4+2c*z4+r^2-a^2-b^2-c^2=x4^2+y4^2+z4^2

となる。行列の式で書けば (libreofficecalcでmathを使用)

となり、逆行列を使えば簡単に答えが出る。

 

リブレオフィスで計算してみる。

逆行列と配列定数を使用して2a,2b,2c,r^2-a^2-b^2-c^2を求める。配列定数を使って前半は4行3列の行列に4列目を追加して4列目を1とした。後半は2乗して横方向の和。

 D9:D12= {=MMULT(MINVERSE(MMULT(D4:F7,{1,0,0,0;0,1,0,0;0,0,1,0})+{0,0,0,1;0,0,0,1;0,0,0,1;0,0,0,1}),MMULT(D4:F7^2,{1;1;1}) )} (配列数式)

 

r070609追加 上の数式をlibreofficeのmathで数式化

 

次に中心座標と半径を求める。

 D14= =D9/2

 D15= =D10/2

 D16= =D11/2

 D17= =SQRT(D12+D9^2/4+D10^2/4+D11^2/4)

 

例によってzを固定した輪切りグラフ複数個で状況確認。

z=-0.5

 F32= =IFERROR( D$15-SQRT(D$17^2-(D32-D$14)^2-(D$26-D$16)^2),"")

 G32= =IFERROR( D$15+SQRT(D$17^2-(D32-D$14)^2-(D$26-D$16)^2),"")

 以下略

 

z=1

 

z=3

 

z=4.5

 

余談1 r070614

 標準形と一般形、どっちがどっちなのか覚えられないので冒頭の式に追記した。





 

 

3点を通る円(2次元平面内)その2

エクセル等の表計算ソフトの逆行列関数を使って3点を通る円を求める。(2次元平面内)

 

3点を通る円(2次元平面内)の余談2の設定でリベンジ。

円の中心のx座標=a、円の中心のy座標=b、円の半径=rとすると円の式は

 (x-a)^2+(y-b)^2=r^2 (標準形)

となる。展開して

 x^2-2ax+a^2+y^2-2by+b^2=r^2

左辺に変数(a,b,rを含む項)を、右辺に定数(a,b,rを含まない項)を配置して

(変数と定数の区別がややこしい)

 2a*x+2b*y+r^2-a^2-b^2=x^2+y^2

となる。3点を

 p1(x1,y1)、p2(x2,y2)、p3(x3,y3)

とすると

 2a*x1+2b*y1+r^2-a^2-b^2=x1^2+y1^2

 2a*x2+2b*y2+r^2-a^2-b^2=x2^2+y2^2

 2a*x3+2b*y3+r^2-a^2-b^2=x3^2+y3^2

となる。行列の式で書けば (libreofficecalcでmathを使用)

となり、逆行列を使えば簡単に答えが出る。

 

リブレオフィスで計算してみる。

逆行列と配列定数を使用して2a,2b,r^2-a^2-b^2を求める。配列定数を使って前半は3行2列の行列に3列目を追加して3列目を1とした。後半は2乗して横方向の和。

 D8:D10= {=MMULT(MINVERSE(MMULT(D4:E6,{1,0,0;0,1,0})+{0,0,1;0,0,1;0,0,1}),MMULT(D4:E6^2,{1;1}) )} (配列数式)

 

r070609追加 上の数式をlibreofficeのmathで数式化

 

次に中心座標と半径を求める。

 D12= =D8/2

 D13= =D9/2

 D14= =SQRT(D10+D8^2/4+D9^2/4)

 

グラフ用のデータを作る。

 F31= =IFERROR( D$13-SQRT(D$14^2-(D31-D$12)^2),"")

 G31= =IFERROR( D$13+SQRT(D$14^2-(D31-D$12)^2),"")

 以下略

 

散布図

手間をかければもっと思い通りのモノができそうだが詳しい設定方法を思い出せないので今回はこれで良しとする。

 

余談1

 高校数学のサイトによると今回の円の方程式は「標準形」で前回の方程式は「一般形」だそうだ。一般形での解法をヒントにしないと今回の発想は出せないと思う。

 

余談2 r070614

 標準形と一般形、どっちがどっちなのか覚えられないので冒頭の式に追記した。

銀行丸めと五捨五超入

四捨五入・五捨六入・五捨五超入・銀行丸め(jis丸め)について

 

色々試してみたけど銀行丸めについてはやはりfloorとceilingを使ったこれが最もシンプルで優秀かと思う(誤差検証はしてないが)。ググってまた探してみた。ただ、自分が最初に見たのはこれより古いものかも知れない。

 

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12183797137

知恵袋ユーザーさん 2017/12/25 16:32

> ExcelでJIS丸めを関数でしたいのですがどうすればできますでしょうか?

ベストアンサー 知恵袋ユーザーさん 2017/12/25 18:45

> 仮にA1セルの値を整数に丸めるとしたら

> =(FLOOR(A1+0.5,2)+CEILING(A1-0.5,2) )/2

<以下略>

 

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14281863939

1149760155さん 2023/6/23 7:43

> ExcelでJIS丸目をする式についてききたいことがあります。

> JISまるめをExcelで行う際に調べると以下のような式がみられます。

<中略>

ベストアンサー 知恵袋ユーザーさん 2023/6/23 12:27

<中略>

> 丸め幅をaとすると
> =(FLOOR(A1+a/2,a*2)+(CEILING(A1-a/2,a*2) )/2
> ということです。

<以下略>

 

銀行丸め8 (正負連続型(仮)を元にした重ね合わせ型(仮))

(銀行丸めの結果自体は正負連続型(仮)でもあり正負対称型(仮)でもある)

BV8= =(floor($B8+10^-$I$4/2,10^-$I$4*2)+CEILING($B8-10^-$I$4/2,10^-$I$4*2))/2

$B8= 端数処理する数  $I$4= 小数点以下の位の数。0なら整数化。以下同じ

 

その重ね合わせ型(仮)に触発されたのかifとabsとsignを使わない五捨五超入正負対称型(仮)の数式ができていた。(ググったら五捨五超入はCEILINGを使うのが良いとされていたが、正負対称型(仮)でも作ってみたかったのかも。)

 

五捨五超入 (重ね合わせ型(仮)の仕組みを使った正負対称型(仮))

BN8= =ROUNDUP($B8*2,$I$4)-roundup($B8,$I$4)

(xが0.5増える毎にyが1増えるグラフから、xが1増える毎にyが1増えるグラフを引く事によりxが整数の時の変化を打ち消している感じかな。)

 

銀行丸め4d (正負対称型(仮)を元にした区間交替型(仮)で五捨五超入部分を新型化)

(こちらは数式をそのまま使えたから少しだけ簡略化になった)

BP8= =if(MOD(ABS($B8)*10^$I$4,2)>=1,round($B8,$I$4),ROUNDUP($B8*2,$I$4)-roundup($B8,$I$4))

 

銀行丸め7c (正負対称型(仮)を元にした重ね合わせ型(仮)で五捨五超入部分を新型化)

(こちらは数式の修正が多くてただ複雑化してしまった)

BU8= =round(($B8-sign($B8)*10^-$I$4/2)/2,$I$4)+ROUNDUP($B8+sign($B8)*10^-$I$4/2,$I$4)-roundup(($B8+sign($B8)*10^-$I$4/2)/2,$I$4)

 

 

余談1

 切り捨て = 九捨十入 = 十入(仮)

 切り上げ = 〇捨〇超入・零捨零超入 = 〇捨(仮)・零捨(仮)

 

余談2

 グーグルドライブでは「=(0.7-0.07*10)*10^18」の結果が「-111」(r070521現在)だった。数式が合っていても誤差が出ると言うことは、エクセルやリブレオフィスでも似たような問題があるのかも知れない。

 

 

単純ミスなどは適宜修正済&修正予定

 

銀行丸め検証結果

グーグルドライブ、リブレオフィス、エクセルでいろいろな銀行丸め(jis丸め)の式を検証してみた。結果、round系の区間交替型&重ね合わせ型が最優秀だった。int系の区間交替型&重ね合わせ型はシンプルで結構好きだが誤差が出てしまった。特異点型は思ったより悪くない。検証してないがround系で組めば少し改善するかも知れない。二重丸め型が最もダメだった。第二引き数を活用した式やintと併用した式は特に悪かった。

 

元数=$B8 (小数点以下の)桁数=$I$4 とする。

round系区間交替型 銀行丸め4c

CJ8= =if(MOD(ABS($B8)*10^$I$4,2)>=1,round($B8,$I$4),if(abs($B8)<=1/2/(10^$I$4),0,ROUNDUP($B8-sign($B8)*1/2/(10^$I$4),$I$4) ) )

 

round系重ね合わせ型 銀行丸め7

CK8= =if(abs($B8)<=1/2/10^$I$4,0,ROUNDUP($B8/2-sign($B8)*1/4/10^$I$4,$I$4)+rounddown($B8/2+sign($B8)/4/10^$I$4,$I$4) )

 

round系重ね合わせ型 銀行丸め7b

CL8= =if(abs($B8)<=1/2/10^$I$4,0,ROUNDUP($B8/2-sign($B8)*1/4/10^$I$4,$I$4)+round($B8/2-sign($B8)/4/10^$I$4,$I$4) )

 

検証方法

中心値xと(小数点以下の)桁数yと分割数zをセット(1件と数えた)にして、誤った値を目視でカウントしていく方法。誤差を探すための別列には「平均を使った統計的な数値」が良いと思ったが、優秀そうな式との差の絶対値の合計の10^y倍を表示した。優秀そうな式が合っていればそのまま誤差の式の個数になるから数えやすい。更に別列に誤差累計も表示したので計数途中でセルが移動しても元の位置が分かりやすい。(行の固定部分で計数した。押すと1増えるボタンを作れば効率アップだが今はそんな力はないw)

元の数はxより小さい方に106行、大きい方に107行。1行下に行くと1/10^y/z増える。

(x, y, z)=(0, 0, 20)の場合、元の数は-5.30~5.35。

元の数は関数ではなく値(マクロで入力するのが理想的か)の方が良さそうだが、様々な検証をするためには関数の手軽さは捨てがたい。誤差が累積しないようにrow()を元に計算した。元数由来の誤差はなるべく減らしたいが完璧は無理かも。(急ぐ時は「1行上のセル+間隔」とかよくやる)

 

具体的には B列(8~221行)= =(row()-114)*1/10^y/z+x 114行目が中心値

最初の9件 (0, 2, 2)(0, 3, 2)(1, 3, 20)(-1, 3, 20)(1, 2, 20)(-1, 2, 20)(0, 4, 20)(1, 4, 20)(-1, 4, 20) (個数が3桁を超えた物は計数が大変なので検証に含めずスルーしてしまったものもある)

(追記 番外編 グーグルで(0, 6, 2)が175個だった。二重丸め型4つが順に0個57個59個59個。)

追加の3件 (0, 6, 20)(1, 6, 20)(-1, 6, 20)

検証十分とは言えないがまあまあの結果は出せたと思う。

 

列の順は検証時と同じではなく種類別に並べ替えた。CD276:CP280は誤差の個数。なので「.0」は不要だが念のため表示しておいた。

 

  CD CE CF CG CH CI CJ CK CL CM CN CO CP CQ CR CS CT
273 int if
mod
round round int
round
int
round
int int if
mod
round
round
-up if
mod他
int int round
-down
round
-up他
round
round
-up if
sign
         
274 銀行丸
め式9
銀行
丸め1
銀行
丸め1b
銀行
丸め1c
銀行
丸め1d
銀行
丸め4
銀行
丸め4b
銀行
丸め4c
銀行
丸め6
銀行
丸め6b
銀行
丸め7
銀行
丸め7b
         
275 特異点
連続型
二重
丸め奇
二重
丸め奇
二重
丸め奇
二重
丸め奇
区間
交替
区間
交替
区間
交替
重ね
合わせ
重ね
合わせ
重ね
合わせ
重ね
合わせ
         
276 14.0 8.0 74.0 68.0 68.0 2.0 2.0 0.0 2.0 2.0 0.0 0.0 240.0 小計   google
9+3件分
277 12.0 8.0 36.0 36.0 36.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 128.0 小計   LibO3
9+3件分
278 2.0 6.0 8.0 6.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 28.0 小計   LibO7
追加3件分のみ
279 14.0 8.0 77.0 70.0 70.0 2.0 2.0 0.0 2.0 2.0 0.0 0.0 247.0 小計   excel
9+3件分
280 42.0 34.0 195.0 180.0 180.0 4.0 4.0 0.0 4.0 4.0 0.0 0.0 643.0 合計      

 

LibO7は前9件がgoogleと一致していたので省略。LibO3は範囲コピーするだけで毎回ソフトが落ちた。エクセルでもエクセルが何度か落ちた。いくつか開きっぱなしだった仕事用ファイルも一緒に落ちて「修復」させられた。検証用のファイルを別途用意するのが正解と思う。

LibO3=LibreOfficePortable3.4.5

LibO7=LibreOfficePortable7.5.4
 
 
余談1
銀行丸め4bと6bは気に入ってた4と6で誤差が出てしまったから微修正して改善を期待した。結果は同数で改善なしだった。シンプルに書けるint系で誤差が出てしまったのはつくづく残念。
言い訳になるが(0, 6, 20)の中心±10行目の±0.0000005が元数の丸め結果が±0.000001の誤差だった(その値で同時に誤差だったのはマイナス側の特異点型のみ)。しかし同じ元数である(0, 6, 2)の中心±1行目の±0.0000005が元数の丸め結果はちゃんと0になった。つまり元数の設定方法由来の誤差の可能性がある。
 
余談2
今回最優秀な式はround系で第二引き数を使った形だった。第二引き数を使わない形の方が精度が上がるのだろうか?後で検証するかも。
 
余談3
最初は誤った値のつもりで「誤値」という単語を使ったが一般的ではないらしいので「誤差」に変更した(少しは電波度を減らさないとw)。ちょっとニュアンスが変わってしまう気がするが間違いではないから問題ない。
 

元の頁(blogger)は2023.06.15 19:26公開 単純ミスなどは適宜修正済&修正予定

 

銀行丸めのグラフ

銀行丸め(重ね合わせ型(仮))のグラフをグーグルドライブの図形描画とスプレッドシート内のグラフで描いてみた。今回は整数化のみ。
 

銀行丸め(重ね合わせ型)の四捨五入(正負連続型)成分を図形描画で

グラフの〇白丸部分はその値を含まない。矢印の先端はその値を含む。(二重丸めの場合は途中経過の場合あり)

 

 

 

銀行丸め(重ね合わせ型)の五捨五超入(正負連続型)成分を図形描画で

 

 

 

銀行丸め(重ね合わせ型)を図形描画で

 

 

 

 

銀行丸め(重ね合わせ型)をスプレッドシートのグラフ機能で

 

 

 

銀行丸め(二重丸め型奇数)を図形描画で

 

 

 

銀行丸め(区間交替型)を図形描画で

 

 

 

銀行丸め(特異点型正負連続)を図形描画で

 

 

 

銀行丸め(特異点型正負対称)を図形描画で

 

 

 

余談1

図形描画はスプレッドシートのグラフと同様、元データの変更がブログに反映される。(bloggerでの話と思う)

元の頁(blogger)は2023.06.09 00:10公開 単純ミスなどは適宜修正済&修正予定

 

端数処理について2-6

四捨五入・五捨六入・五捨五超入・銀行丸め(jis丸め)について負数の場合や整数化以外の場合についてもまとめてみた。(その6)

 

B列についての五捨五超入等(正負対称型)を主にROUNDUP関数を使って求めた。

  B BS BT BU BV BW BX BY BZ CA CB CC CD CE
2   0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0      
3 使用
関数
round
-up
round
-up if
sign
abs
round
-up if
sign
abs
round
-up if
sign
abs
round
-up if
sign
abs
round
-up if
sign
abs
round
-up if
sign
abs
round
-up if
sign
abs
round
-up if
sign
abs
round
-up if
sign
abs
round int int
4   切り
上げ
                1.000 銀行
丸め1
銀行
丸め4
銀行
丸め6
5 正負
対称
正負
対称
正負
対称
正負
対称
正負
対称
正負
対称
正負
対称
正負
対称
正負
対称
正負
対称
二重
丸め
区間
交替
重ね
合わせ
6 正式
名称的
0捨
0超入
1捨
1超入
2捨
2超入
3捨
3超入
4捨
4超入
5捨
5超入
6捨
6超入
7捨
7超入
8捨
8超入
9捨
9超入
     
7 略称
(仮)
0捨
(仮)
1捨
(仮)
2捨
(仮)
3捨
(仮)
4捨
(仮)
5捨
(仮)
6捨
(仮)
7捨
(仮)
8捨
(仮)
9捨
(仮)
     
8 -0.515 -0.600 -0.600 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500
9 -0.510 -0.600 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500
  中略                          
91 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100
92 -0.095 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100
93 -0.090 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 -0.100 -0.100 -0.100
94 -0.085 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 -0.100 -0.100 -0.100
95 -0.080 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 -0.100 -0.100 -0.100
96 -0.075 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 -0.100 -0.100 -0.100
97 -0.070 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 -0.100 -0.100 -0.100
98 -0.065 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 -0.100 -0.100 -0.100
99 -0.060 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 -0.100 -0.100 -0.100
100 -0.055 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 -0.100 -0.100 -0.100
101 -0.050 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
102 -0.045 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
103 -0.040 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
104 -0.035 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
105 -0.030 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
106 -0.025 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
107 -0.020 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
108 -0.015 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
109 -0.010 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
110 -0.005 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
111 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
112 0.005 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
113 0.010 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
114 0.015 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
115 0.020 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
116 0.025 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
117 0.030 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
118 0.035 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
119 0.040 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
120 0.045 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
121 0.050 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
122 0.055 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.100 0.100 0.100
123 0.060 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.100 0.100 0.100
124 0.065 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.100 0.100 0.100
125 0.070 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.100 0.100 0.100
126 0.075 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.100 0.100 0.100
127 0.080 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.100 0.100 0.100
128 0.085 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.100 0.100 0.100
129 0.090 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.100 0.100 0.100
130 0.095 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100
131 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100

BS8= =ROUNDUP($B8,$F$4)

BT8= =if(abs($B8)<=BT$2/10/(10^$F$4),0,ROUNDUP($B8-sign($B8)*BT$2/10/(10^$F$4),$F$4) )

5捨5超入正負対称整数化 bx8= =if(abs($B8)<=0.5,0,ROUNDUP($B8-sign($B8)*0.5,0) )

 

銀行丸め(JIS丸め)の型

 

1.特異点型(仮)

基本的にROUND関数またはINT関数を使い四捨五入等を行い、不一致点をIF関数で別途指定または差分調整(一致点を含む場合もあり)。

もしかしたら精度は思ったより悪くないかもしれないが、好みではないので今回は却下。

 

2.二重丸め型(仮)

まず最も近い偶数を求めてそれとの差を五捨五超入して加える、または

まず最も近い奇数を求めてそれとの差を四捨五入して加える。

前者も作ってみたが複雑になりすぎたので後者のみ。

銀行丸め1

CC8= =round($B8*10^$F$4/2+1/2)*2/10^$F$4-1/10^$F$4-ROUND(round($B8*10^$F$4/2+1/2)*2-1-$B8*10^$F$4)/10^$F$4

銀行丸め整数化1

CC8= =round($B8/2+1/2)*2-1-ROUND(round($B8/2+1/2)*2-1-$B8)

 

3.区間交替型(仮)

偶数区間では五捨五超入、奇数区間では四捨五入。(負数の場合、言葉がややこしいので言及しないが結果は合うように設定する)IFもMODも不使用でできた。

銀行丸め4

CD8= =-1^INT($B8*10^$F$4+1)*int(-1^INT($B8*10^$F$4+1)*$B8*10^$F$4+0.5)/10^$F$4

銀行丸め整数化4

CD8= =-1^INT($B8+1)*int(-1^INT($B8+1)*$B8+0.5)

 

4.重ね合わせ型(仮)

2つの波を重ね合わせるイメージ。

ヤフー知恵袋のFLOOR関数とSEILING関数を組み合わせた式を見てこの優秀な仕組みをどうしても理解したいと思った。そして理解したついでにINT関数で書き換えてみた。

銀行丸め6

CE8= =int(($B8*10^$F$4+0.5)/2)/10^$F$4-int((-$B8*10^$F$4+0.5)/2)/10^$F$4

銀行丸め整数化6

CE8= =int(($B8+0.5)/2)-int((-$B8+0.5)/2)

 

余談1

7捨7超入や3捨3超入などのINTメインの正負対称型の値が間違っていることがある。ダウンロードしてリブレオフィスで開くと問題ないので式は合っていると思われる。グーグルドライブの特性かもしれない。正負連続型は比較対象がないので未確認。(目視では2捨3入に一つ値の間違いがあった。)

 

余談2

条件付き書式を使って目視しやすくしたのと、0未満と0以上で分けて正負連続型も検算対象にしたため(当ブログには未反映)値の間違いの原因が分かってきた。今回の場合、グーグルドライブでは

int(0.7-0.07*10) = -1 (2023.06.05現在)

になってしまうのが原因だった。桁や範囲を変えれば値の間違いの個数は増減するがこれ以上は深入りしない。グーグルドライブはアップデートが早いので知らぬ間にエクセルやリブレオフィスと同じ仕様になっているかも知れない。

 

余談3

銀行丸めの二重丸め型(仮)はround関数の第二引き数を活用した式に作り替えたい。

 

元の頁(blogger)は2023.05.26 16:06公開 単純ミスなどは適宜修正済&修正予定

 

端数処理について2-5

四捨五入・五捨六入・五捨五超入・銀行丸め(jis丸め)について負数の場合や整数化以外の場合についてもまとめてみた。(その5)

 

B列についての四捨五入等(正負対称型)を主にROUNDDOWN関数を使って求めた。

  B BF BG BH BI BJ BK BL BM BN BO
2   1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
3 使用
関数
round
-down
sign
round
-down
sign
round
-down
sign
round
-down
sign
round round
-down
sign
round
-down
sign
round
-down
sign
round
-down
sign
round
-down
4           四捨
五入
        切り
捨て
5 正負
対称
正負
対称
正負
対称
正負
対称
正負
対称
正負
対称
正負
対称
正負
対称
正負
対称
正負
対称
6 正式
名称的
0捨
1入
1捨
2入
2捨
3入
3捨
4入
4捨
5入
5捨
6入
6捨
7入
7捨
8入
8捨
9入
9捨
10入
7 略称
(仮)
1入
(仮)
2入
(仮)
3入
(仮)
4入
(仮)
5入
(仮)
6入
(仮)
7入
(仮)
8入
(仮)
9入
(仮)
10入
(仮)
8 -0.515 -0.600 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500
9 -0.510 -0.600 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500 -0.500
  中略                    
91 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100
92 -0.095 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000
93 -0.090 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000
94 -0.085 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000
95 -0.080 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000
96 -0.075 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000
97 -0.070 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000
98 -0.065 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000
99 -0.060 -0.100 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000
100 -0.055 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000
101 -0.050 -0.100 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000
102 -0.045 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000
103 -0.040 -0.100 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000
104 -0.035 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000
105 -0.030 -0.100 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000
106 -0.025 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
107 -0.020 -0.100 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
108 -0.015 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
109 -0.010 -0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
110 -0.005 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
111 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
112 0.005 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
113 0.010 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
114 0.015 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
115 0.020 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
116 0.025 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
117 0.030 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000
118 0.035 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000 0.000
119 0.040 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000
120 0.045 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.000 0.000
121 0.050 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.000
122 0.055 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.000 0.000
123 0.060 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.000
124 0.065 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.000 0.000
125 0.070 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.000
126 0.075 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.000 0.000
127 0.080 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.000
128 0.085 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.000 0.000
129 0.090 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.000
130 0.095 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.000
131 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100 0.100

BF8= =rounddown($B8+sign($B8)*(10-BF$2)/10/(10^$F$4),$F$4)

BJ8= =ROUND($B8,$F$4)

BO8= =rounddown($B8,$F$4)

4捨5入正負対称整数化 BJ8= =ROUND($B8,0)

 

元の頁(blogger)は2023.05.26 16:06公開 単純ミスなどは適宜修正済&修正予定