電卓が返した「2.654661017」を、レポートには何桁で書くのか
金属片の質量を電子天秤で測って 125.3 ± 0.1 g、体積をメスシリンダーの水位差から 47.2 ± 0.5 cm³。密度を出すだけの割り算なので電卓を叩き、表示された 2.654661017 をそのまま結論欄に書き写した。返ってきたレポートには赤ペンで一言、「有効数字」。
誤差を伝播させてみると Δρ = 0.02820110461 g/cm³、相対誤差 1.0623%。誤差が小数第2位に立っている以上、主張できるのは 2.65 ± 0.03 の3桁までで、電卓が返した10桁のうち後ろの7桁は「測っていない精度」を勝手に名乗っていたことになる。
厄介なのは、この赤ペンが「計算が間違っている」という指摘ではないことだ。割り算は合っている。伝播誤差の公式も知っている。それでも点が引かれる。詰まっているのは公式ではなく、求めた誤差をどこで丸め、結果値の小数位をどこに揃えるかという最後の一手だ。
このツールは、A ± ΔA と B ± ΔB を入れると和・差・積・商・べき乗・一般形 k·A^p·B^q の各演算について誤差を伝播させ、誤差の桁に合わせて有効数字を揃えた 2.65 ± 0.03 形式をそのまま返す。ついでに、その誤差の何%がAの測定に由来し何%がBに由来するかも出す。次にどちらの測定を精密化すべきかが、感覚ではなく数字で決まる。
なぜ作ったのか — 公式を載せたPDFは山ほどあるのに、丸めの話だけが抜けている
「誤差伝播」で検索すると、大学の講義資料PDFが大量に出てくる。どれも品質は高い。偏微分から一般式を導き、和差なら Δy = √(ΔA² + ΔB²)、積商なら Δy/|y| = √((ΔA/A)² + (ΔB/B)²) になることまで丁寧に書いてある。
だが、ほぼ全部が「Δy を求めよ」で終わっている。求めた Δy = 0.02820110461 を持って、じゃあ答えは 2.65 と書くのか 2.655 と書くのか 2.6547 と書くのか。そこは読者任せなのだ。
自分が学生だった頃も、TAに聞いたら「誤差は1桁に丸めて、答えはその桁に揃える」と言われて、それで納得した気になっていた。ところが実際に手を動かすと境界のケースで必ず迷う。Δy = 0.9605 を1桁に丸めると 0.96 ではなく 1 になり、丸め位置が小数第1位から1の位へ繰り上がる。このとき答えを 57.9 と書くのか 58 と書くのか。0.1 の位で丸めたつもりで 57.9 ± 1 と書くと、誤差1桁と言いながら結果は小数第1位という自己矛盾した表記になる。手計算だとここを平気で踏み抜く。
もうひとつ、公式PDFがまず書かないことがある。誤差は二乗で効くので、片方の測定がほぼ全部の誤差を作っている場面が非常に多い、という事実だ。冒頭の密度測定では、寄与率は天秤側が 0.56%、メスシリンダー側が 99.44%。天秤をどれだけ高級な機種に替えても、結果の誤差は一切改善しない。それどころか 0.1 g を 0.01 g にしても Δρ は小数点以下10桁目までほぼ動かない。この判断材料が出てこないから、学生実験では「とりあえず全部の測定を丁寧にやる」という一番効率の悪い戦略が採られ続ける。
公式を解説するツールは要らない。公式の先、丸めと寄与率を返すツールが要る。そう決めて作ったのがこれだ。
誤差の伝播とは何か — なぜ単純な足し算ではなく二乗和平方根なのか
誤差伝播 とは(第一原理からの説明)
測定値には必ず誤差が伴う。ノギスで測った長さも、天秤で読んだ質量も、真の値そのものではなく「真の値の周りにばらついた1つのサンプル」だ。そのばらつきの幅を ΔA と書く。
問題は、その測定値を使って別の量を計算したときだ。長さ A と幅 B から面積 A×B を求めたなら、面積にも当然ばらつきが乗る。この「元の測定のばらつきが計算結果のばらつきに移る」現象が誤差の伝播(propagation of uncertainty)である。
素朴に考えると、A が最大にブレて B も最大にブレたときが最悪ケースだから、誤差はそのまま足せばよさそうに思える。実際、部品の寸法公差を積み上げる「最悪値設計」ではそれをやる。だが測定誤差では普通そうしない。理由は確率だ。
二乗和平方根(RSS)になる理由 — 分散の加法性
A の誤差と B の誤差が互いに独立なら、両方が同時に同じ向きへ最大までブレる確率は、片方だけブレる確率よりずっと小さい。実際には片方が+にブレたとき、もう片方は+かもしれないし−かもしれない。打ち消し合うほうが起こりやすい。
これを数学で言うと「独立な確率変数の分散は足し算になる」となる。分散はばらつきの二乗なので、足せるのは誤差そのものではなく誤差の二乗のほうだ。したがって合成後の誤差は
Δy² = ΔA² + ΔB² → Δy = √(ΔA² + ΔB²)
になる。これが二乗和平方根(RSS: Root Sum Square)だ。
イメージとしては直角三角形の斜辺が近い。ΔA と ΔB を直交する2辺として並べたときの対角線の長さが Δy になる。だから ΔA = ΔB = 0.3 のとき、単純和なら 0.6 のところ、実際は 0.42426 と約71%に収まる。斜辺は2辺の和より必ず短い、という当たり前の事実がそのまま「誤差は足すより小さくなる」に対応している。
もっと重要なのは辺の長さが揃っていないときだ。ΔA = 0.5、ΔB = 0.1 なら斜辺は 0.5099。大きいほうの誤差からわずか2%しか増えない。誤差が二乗で効くというのは、要するに「小さいほうの誤差はほぼ無視される」ということだ。0.1 を 0.05 に半減させる労力は、この場合ほぼ丸損になる。
和差は絶対誤差、積商は相対誤差 — 一般式から見ると同じもの
一般に y = f(A, B) の誤差は、各変数の偏微分(=その変数が1動いたとき y がいくつ動くか)を重みにして合成する。
Δy = √( (∂y/∂A · ΔA)² + (∂y/∂B · ΔB)² )
y = A + B なら ∂y/∂A = ∂y/∂B = 1 なので、そのまま Δy = √(ΔA² + ΔB²)。絶対誤差どうしが合成される。差 y = A − B でも ∂y/∂B = −1 だが二乗するので符号は消え、式は加算と完全に同じになる。差をとっても誤差は減らない、という直感に反する事実はここから来る。
一方 y = A × B なら ∂y/∂A = B なので第1項は (B·ΔA)²。両辺を y² = (AB)² で割ると (ΔA/A)² になり、
Δy/|y| = √( (ΔA/A)² + (ΔB/B)² )
つまり乗除算では相対誤差どうしが合成される。さらに一般形 y = k·A^p·B^q まで広げると、指数がそのまま相対誤差の重みとして前に出てくる。
Δy/|y| = √( (p·ΔA/A)² + (q·ΔB/B)² )
積は p=1, q=1、商は p=1, q=−1、単項のべき乗は q=0。定数係数 k は微分で素通りして y² の割り算で消えるので、相対誤差には一切影響しない。
この式が持つ実務上の意味は大きい。二乗する前に指数を掛けるので、指数の絶対値が大きい量ほど誤差が増幅される。単振り子の g = 4π²L/T² では周期 T の指数が −2 なので、周期の相対誤差 0.2493% がそのまま2倍の 0.4985% になって結果に乗る。長さを1桁精密に測るより、周期の測定回数を増やすほうが効く理由がこれだ。
なお、独立性を仮定して分散を足すこの扱いは、計量分野の国際指針である JCGM 100:2008(GUM) の「合成標準不確かさ」とまったく同じ形をしている。学生実験の慣習と国際規格が、ここでは一致している。
有効数字を1桁多く書くことは「測っていない精度を主張する」ことだ
桁を盛ることは、静かな嘘になる
有効数字の話は「作法」として教わることが多いが、本質は作法ではなく主張の強さの問題だ。2.6547 と書けば、それは「小数第4位まで意味がある測定をした」という主張になる。実際にはメスシリンダーを 0.5 cm³ の精度でしか読んでいないのに、である。
同じデータから 2.65 ± 0.03 と書けば、読み手はこの値を 2.62〜2.68 の範囲として受け取り、別の実験値と比較するときも正しく判断できる。逆に 2.6547 を渡された読み手は、他班の 2.61 という値と「一致しない」という誤った結論に飛びつく。桁を盛る行為は、後工程の判断を確実に壊す。学術論文の査読で有効数字が細かく突かれるのは、様式美ではなく再現性の問題だからだ。
桁落ちは「計算ミス」ではなく「測定計画のミス」
もっと深刻なのが桁落ちだ。100.02 ± 0.05 から 100.00 ± 0.05 を引く。元の測定はどちらも相対誤差 0.05% という立派な精度である。ところが差をとった瞬間、結果は 0.02 ± 0.07 になり、相対誤差は 353.55% へ跳ね上がる。誤差が結果値の3倍以上、つまり差の符号すら保証できない。
これは電卓の桁数を増やしても直らない。有効数字は引き算そのもので消えている。対処法は測定計画を変えること以外にない — 差そのものを直接測る(差動測定、ゼロ点合わせ、ブリッジ回路、比較測長)方向に切り替える。熱膨張量を「加熱前後の絶対長さの差」ではなくダイヤルゲージの変位として直接読むのは、まさにこの回避策だ。ツール上で相対誤差が100%を超えたら黄色警告を出しているのは、そこが「計算をやり直す場面」ではなく「実験をやり直す場面」だからである。
寄与率は、測定器への投資順を決める
寄与率は分散の比、つまり誤差の二乗の比で出る。ΔAがΔBの2倍なら寄与率は4倍になる。この非線形さが判断を分ける。
冒頭の密度測定は天秤 0.56% : メスシリンダー 99.44%。天秤を高精度機に買い替える予算があるなら、それは丸ごと無駄になる。同じ予算でピペットやメスフラスコに回したほうが、結果の誤差は目に見えて縮む。実務でも同じで、測定システムの更新を検討するとき「どの測定器が全体の不確かさを支配しているか」を先に出さないと、効かないところに金を使うことになる。寄与率が90%を超えた側だけを見ればよい、というのは乱暴なようで、二乗で効く以上ほぼ正しい割り切りだ。
週1回のレポートから、実験計画の事前検討まで
毎週の学生実験レポート。物理・化学・機械の基礎実験は、測定→計算→誤差評価が毎回セットで課される。密度、面積、重力加速度、抵抗率、比熱。演算種別を選んで数値を4つ入れるだけで、レポートにそのまま写せる 9.81 ± 0.05 形式が出る。手計算の丸めミスで点を落とす経路が消える。
卒論・修論の測定値まとめ。表に並べる値の桁を揃える作業は地味に重い。誤差の丸め桁を1桁と2桁で切り替えられるようにしてあるのは、最終値として書くなら1桁、その値をさらに別の計算へ渡すなら丸め誤差の蓄積を避けて2桁、という使い分けのためだ。
実験を始める前の事前検討。測定器のカタログ精度を入れて、目標精度に届くかを先に見る。届かないなら、寄与率が高い側の測定手順を組み直してから実験に入る。測ってから足りないと気づくのが一番高くつく。
測定器の仕様から精度を見積もる場面。仕様書は「±0.5% rdg」のように相対値で書かれていることが多い。誤差の入力形式を相対誤差に切り替えれば、% のまま入力できる。内部では ΔA = |A| × ΔA[%] / 100 で絶対誤差へ換算し、換算後の値も結果に表示するので、仕様の読み替えミスもその場で気づける。
3ステップで、レポートに書ける表記まで
1. 演算種別を選ぶ。 A+B / A−B / A×B / A÷B / A^p / k·A^p·B^q の6択。迷ったら一番右の一般形を選び、指数 p・q と定数係数 k を直接書けばよい(積なら p=1・q=1、商なら q=−1)。学生実験の定番5件はプリセットから一括入力できる。
2. 測定値と誤差を入れる。 A と ΔA、B と ΔB。誤差は非負のみ。測定器の仕様が % で書かれているなら、誤差の入力形式を相対誤差に切り替える。定数倍がある式なら k に 4π² = 39.4784176 や π/4 = 0.7853981634 を入れる。
3. 最終表記をそのまま写す。 誤差の桁に有効数字を揃えた 2.65 ± 0.03 が主役として表示される。その下に丸め前の生値・相対誤差・有効数字の桁数、そしてA由来/B由来の分散寄与率が並ぶ。コピーボタンで最終表記と内訳をまとめて取れるので、レポートへの貼り付けは1操作で済む。
使用例11ケース — 密度から桁落ちまで、実測値で追う
以下はすべて実装済みの計算エンジンに同じ入力を与えて得た出力である。中間値(各項の分散)も併記したので、なぜその寄与率になるかを追える。
ケース1: 密度 ρ = m/V(商・絶対誤差・誤差1桁丸め)
入力: A = 125.3 ± 0.1 g、B = 47.2 ± 0.5 cm³
結果: y = 2.654661017、Δy = 0.02820110461、相対誤差 1.0623%、2.65 ± 0.03、有効数字3桁、寄与率 A 0.56% : B 99.44%(支配は測定値B)
解釈: termA = (0.1/125.3)² = 6.3707e-7 に対し termB = (0.5/47.2)² = 1.12212e-4。176倍の開きがある。天秤の精度を上げても結果は動かない。体積測定を精密化するのが唯一の改善策だ。
ケース2: 同じ密度を、誤差2桁丸めで見る
入力: ケース1と完全に同一、丸め桁だけ2桁へ
結果: 生値は不変。2.655 ± 0.028、有効数字4桁、丸め位置は小数第2位から第3位へ
解釈: 変わるのは表記と有効数字だけで、伝播誤差も寄与率も1文字も動かない。レポートの最終値なら1桁、この密度を使ってさらに別量を計算するなら2桁、という使い分けになる。
ケース3: 長方形の面積 S = a × b(積)
入力: A = 12.34 ± 0.05 cm、B = 8.76 ± 0.05 cm
結果: y = 108.0984、Δy = 0.7566591042、相対誤差 0.69997%、108.1 ± 0.8、有効数字4桁、寄与率 A 33.51% : B 66.49%
解釈: ノギスの読み取り誤差は両辺とも同じ 0.05 cm なのに、寄与率は約2倍の差がつく。termA = 1.64182e-5、termB = 3.25757e-5。相対誤差で効く以上、短い辺のほうが不利になる。
ケース4: 単振り子の重力加速度 g = 4π²L/T²(一般形・p=1・q=−2・k=39.4784176)
入力: L = 1.000 ± 0.002 m、T = 2.006 ± 0.005 s
結果: y = 9.810652191、Δy = 0.05269578134、相対誤差 0.53713%、9.81 ± 0.05、有効数字3桁、寄与率 L 13.86% : T 86.14%
解釈: 周期の相対誤差 0.2493% が指数2倍で 0.4985% に増幅され、長さ側の 0.2% を上回る。標準重力加速度 9.80665 m/s² がこの誤差範囲にきちんと入るので、伝播式と定数倍の扱いが物理的に正しいことの裏付けにもなっている。改善の一手は「糸を精密に測る」ではなく「10周期分の時間を測って割る」だ。
ケース5: 円板の面積 S = (π/4)d²(べき乗・p=2・Bを使わない)
入力: d = 25.40 ± 0.05 mm
結果: y = 506.7074791、Δy = 1.994911335、相対誤差 0.3937%、507 ± 2、有効数字3桁、寄与率 A 100%
解釈: 直径の相対誤差 0.1969% が指数2倍でちょうど 0.3937% になっている。π × 12.70²(半径からの独立計算)が 506.7075 と一致するので、係数 k の扱いも検算できている。1変数なので寄与率の表示は「全て測定値A由来」に切り替わる。
ケース6: 温度差 ΔT = T₂ − T₁(差)
入力: A = 87.4 ± 0.3 ℃、B = 23.6 ± 0.3 ℃
結果: y = 63.8、Δy = 0.4242640687、相対誤差 0.66499%、63.8 ± 0.4、寄与率 50% : 50%(同等)
解釈: termA = termB = 0.09。単純に足せば 0.6 のところ、二乗和平方根では 0.42426(約71%)に収まる。差をとっても誤差は減らず、むしろ増えるという事実がそのまま出ている。
ケース7: 質量の合算(和・誤差の大きい側が支配)
入力: A = 250.0 ± 0.5、B = 125.3 ± 0.1
結果: y = 375.3、Δy = 0.5099019514、相対誤差 0.13587%、375.3 ± 0.5、有効数字4桁、寄与率 A 96.15% : B 3.85%
解釈: termA = 0.25 に対し termB = 0.01。合成誤差は 0.5 からわずか2%しか増えない。「小さいほうの誤差はほぼ無視される」の教科書的な例だ。
ケース8: 桁落ち(近い2値の差)
入力: A = 100.02 ± 0.05、B = 100.00 ± 0.05
結果: y = 0.02、Δy = 0.07071067812、相対誤差 353.5533906%、0.02 ± 0.07、有効数字1桁、桁落ち警告
解釈: 元の測定はどちらも相対誤差 0.05% という高精度。それが引き算1回で353%へ跳ね上がる。誤差が結果値の3倍以上なので、差の符号すら主張できない。差そのものを直接測る方法に切り替えるしかない場面だ。
ケース9: 丸めの繰り上がり(誤差 0.9605 → 1桁 → 1)
入力: A = 45.6 ± 0.6、B = 12.3 ± 0.75
結果: y = 57.9、Δy = 0.9604686356、相対誤差 1.6588%、58 ± 1、有効数字2桁、寄与率 A 39.02% : B 60.98%
解釈: termA = 0.36、termB = 0.5625。Δy を1桁に丸めると 0.9605 が 1 になり、丸め位置が 0.1 の位から1の位へ繰り上がる。だから結果値も 57.9 ではなく 58 と書く。手計算で最も踏み抜きやすい分岐がここだ。
ケース10: 誤差を絶対値で入力(積・指数表記への自動切替)
入力: A = 50 ± 2、B = 20 ± 5
結果: y = 1000、Δy = 253.179778、相対誤差 25.318%、(1.0 ± 0.3)×10³、有効数字2桁、寄与率 A 2.50% : B 97.50%
解釈: termA = (2/50)² = 0.0016、termB = (5/20)² = 0.0625。丸め位置が100の位なので、1000 ± 300 と固定表記で書くと末尾のゼロが有効数字4桁を偽装してしまう。ここで指数表記に切り替わり、仮数が2桁であることが表記から読み取れるようになる。
ケース11: 同じ数値を相対誤差(%)として入力
入力: A = 50 ± 2%、B = 20 ± 5%
結果: y = 1000、Δy = 53.85164807、相対誤差 5.3852%、(1.00 ± 0.05)×10³、有効数字3桁、寄与率 A 13.79% : B 86.21%
解釈: 換算後は ΔA = 50×2/100 = 1、ΔB = 20×5/100 = 1 で絶対誤差はどちらも 1。それでも相対誤差が 2% と 5% で違うため、寄与率は6倍以上の差がつく。ケース10と同じ「2」「5」という数字を入れても Δy は 253.18 → 53.85 と5倍近く変わる。仕様書の ± が絶対値なのか % なのかを取り違えると、結論がここまでずれる。
11ケースを通して見ると、誤差の大きさそのものより「二乗して比べたときの比」がすべてを決めていることが分かる。次にどこへ手を入れるかは、寄与率の高い側を見れば1秒で決まる。
仕組み — 一般形1本への集約と、丸めの「順序」
6つの演算を、実質2つの分岐に畳んだ
UIには6つの演算種別が並んでいるが、計算エンジンの分岐は2つしかない。加減算ブランチと、乗除・べき乗ブランチだ。
積・商・単項べき乗は、すべて一般形 y = k·A^p·B^q の特殊形として書ける。積は (p, q) = (1, 1)、商は (1, −1)、単項べき乗は q = 0 で B を参照しない。だから演算種別ごとに個別の式を書く必要はなく、種別から p と q を決めて共通ルーチンへ渡すだけで済む。
// 演算種別 → 実効指数への写像。分岐はここだけ
pEff = mul ? 1 : div ? 1 : expP // pow / general は入力値をそのまま
qEff = mul ? 1 : div ? -1 : pow ? 0 : expQ
resultValue = k * A**pEff * (usesB ? B**qEff : 1)
termA = (pEff * errorAAbs / A) ** 2
termB = usesB ? (qEff * errorBAbs / B) ** 2 : 0
absError = |resultValue| * Math.sqrt(termA + termB)
演算ごとに式を4本書く実装と比べて、分岐が減るだけでなくユーザーが指数を直接指定できるという副次的な利点が大きい。g = 4π²L/T² のように負の指数を含む式も、√A のように p = 0.5 の式も、専用の選択肢を増やさずに扱える。
定数係数 k を独立した入力にしたのも意図的な判断だ。k は termA / termB のどちらにも現れない。式の上でも、微分して y で割った時点で消えるので相対誤差には一切効かない。効くのは結果値だけで、ちょうど k 倍になる。この非対称性を実際に触って確かめられることに教育的な意味がある — k を 1 から 39.4784176 に変えると g の値が 0.2485 から 9.81 へ跳ねるのに、相対誤差 0.53713% は 1 桁も動かない。
丸めは「誤差が先、値が後」— この順序を逆にすると壊れる
このツールの本体は、実は伝播計算ではなく丸めの部分にある。手順は次の順序で固定されている。
// 1. 誤差を有効数字 digits 桁(1 or 2)に丸める
roundedErrorRaw = Number(absError.toExponential(digits - 1));
// 2. ★丸めた「後」の値から丸め位置を取る
place = Number(roundedErrorRaw.toExponential().split('e')[1]) - (digits - 1);
// 3. その位置に結果値の小数位を揃える
if (place <= 0) { valueStr = resultValue.toFixed(-place); }
else { valueStr = (Math.round(resultValue / 10**place) * 10**place).toFixed(0); }
順序が重要な理由は明快だ。結果値の小数位を決められるのは誤差だけであり、結果値自身は何桁目まで意味があるかを知らない。先に結果値を「なんとなく3桁」に丸めてから誤差を合わせにいくと、誤差が小数第3位に立つケースで情報が失われる。誤差 → 丸め位置 → 結果値、という一方通行にすることで、全ケースが同じ1本の道を通る。
繰り上がりは、丸めた「後」の値から桁を取り直す
ステップ2に★を付けたのはここが唯一の罠だからだ。素朴に書くと丸め位置は Math.floor(Math.log10(absError)) で先に求めたくなる。ところがケース9(Δy = 0.9604686356)では、この式が返すのは −1 だ。一方、誤差を1桁に丸めた値は 0.96 ではなく 1 で、こちらの丸め位置は 0 である。
先に決めた place = −1 を使い続けると、出力は 57.9 ± 1.0 になる。誤差1桁と宣言しながら値は小数第1位、しかも誤差表記が 1.0 で2桁に見える、という三重に矛盾した表記だ。丸めた後の値から指数を取り直すだけでこれは自動的に解消し、正しく 58 ± 1 になる。追加のif文は要らない。順序を守るだけで消える種類のバグである。
丸め自体に toExponential / toFixed を使っているのも同じ思想だ。Math.round(x * 10**n) / 10**n 形式は2進浮動小数の丸め誤差を踏みやすく、境界値で参照実装とずれる。toFixed 系は double の厳密値に対する10進丸めなので、Python の Decimal + ROUND_HALF_UP による参照実装と1対1で一致する。テストベクトル15件は、この一致を前提に表記文字列まで含めて固定してある。
指数表記へ切り替える3条件
固定表記のまま出すと有効数字を誤読させるケースが3つある。切替条件はこれだけだ。
| 条件 | 例 | 固定表記だと何が困るか |
|---|---|---|
| 丸め位置が1の位より上(place > 0) | (1.0 ± 0.3)×10³ | 1000 ± 300 の 1000 は4桁ではなく2桁。末尾のゼロが有効数字を偽装する |
| 丸め後の結果値が 1e5 以上 | 大きな面積・体積 | 桁が多く、どこまでが有効かを目視で判別できない |
| 丸め後の結果値が 1e-3 未満 | (2.50 ± 0.07)×10⁻⁴ | 0.00025 の先頭のゼロが有効数字と紛らわしい |
3つ目のケースは微小値の測定で頻出する。指数部を E としたとき仮数の小数桁は E − place で決まるので、仮数側の桁数も誤差の丸め位置に自動で連動する。切替が起きたときは「なぜ指数表記にしたのか」を情報ボックスで説明するようにした。表記が勝手に変わったように見えるのが一番の混乱要因だからだ。
なお誤差が 0 の入力(ΔA = ΔB = 0)は、エラーにせず 12 ± 0 として通す。ただし有効数字の欄と寄与率の欄は数値ではなく「—」を出す。丸め位置が誤差から決まらない以上、有効数字を何桁と主張する根拠がないし、分散の総和が 0 なら寄与率は数学的に定義できない。ここで 0% と表示してしまうと「Aは誤差に寄与していない」という別の意味に読めるので、あえて表示しない設計にしてある。
誤差伝播 計算ツールとしての立ち位置 — 講義PDFとも公差解析とも違う
前半で触れたとおり、この領域は解説だけが充実していてツールが空いている。比較の軸として意味があるのは「どこまでを自動でやるか」の線引きのほうだ。講義資料が担当するのは式の導出までで、そこから先の丸めは読者が手で処理する前提で書かれている。本ツールが引き受けるのは後半——Δy を何桁に丸め、結果値の小数位をどこに揃えるかを、入力から一気通貫で確定させる部分になる。
反対側には「有効数字カウンター」の類がある。入力した数値が何桁の有効数字を持つかを数えるだけの道具で、誤差という概念そのものを持たない。測定値と誤差の両方を受け取り、伝播させたうえで書き写せる表記まで作る、という中間地点が意外なほど空いている。
このツールが返すのは3つ。伝播誤差 Δy、誤差の桁に揃えた最終表記、そして A由来・B由来の分散寄与率だ。3つ目が効く。Δy の数字だけ眺めても「次に何をすればいいか」は分からないが、寄与率が出れば「体積の測り方を変えれば効く/天秤はこのままでいい」という次の一手が即座に決まる。
公差解析系のツールとは、数学を共有していても扱う対象が違う。公差積み上げシミュレーターや、RSS+モンテカルロ+Cpk を扱う公差解析シミュレーターは、部品寸法の公差を線形和で積み上げ、分布種別を指定して乱数を回し、工程能力指数や ppm 不良率まで出す。これは設計側・製造側の話だ。こちらは、すでに手元にある測定値の相対誤差を積・商・べき乗を通して伝播させ、有効数字の桁を決める。測定側の話になる。二乗和平方根という骨格は同じでも、入力するもの(設計公差か、測定誤差か)も、出てくるもの(不良率・Cpk か、レポートに書く1行か)も別物だ。図面を引いているなら前者、実験ノートを埋めているなら後者、で選び分けてほしい。
「誤差」から「不確かさ」へ、用語が入れ替わった裏側
有効数字を3桁で書く習慣は、電卓より前の時代に育ったものだ。計算尺は対数目盛を目で読む道具で、読み取れるのはせいぜい3桁。4桁目は目盛の隙間を勘で埋めるしかない。掛け算をしても出てくる答えが3桁なのだから、「何桁で書くか」という問題がそもそも発生しなかった。道具のほうが桁数を決めてくれていたわけだ。電卓が10桁を平然と返すようになって初めて、どこで切るかの判断が人間に丸投げされた。有効数字の指導が急にうるさくなったのは、実のところ道具が進化した副作用でもある。
ちなみに ± を数学記号として広めたのは William Oughtred の『Clavis Mathematicae』(1631) だとされる。この Oughtred、計算尺の考案者としても名前が残っている人物だ。誤差表記と計算尺の両方に同じ名前が出てくるのは、偶然にしても出来すぎている。
もうひとつ、用語の話。国際的な計量の世界では、いま「誤差(error)」という語をあまり使わない。誤差は定義上「測定値 − 真値」だが、真値は原理的に知りようがない。知り得ない量を含む定義では、誤差そのものが計算できない量になってしまう。そこで BIPM がまとめた GUM(測定における不確かさの表現のガイド、JCGM 100:2008)は、「不確かさ(uncertainty)」——値がどの範囲に散らばるかという、観測だけから求められる量——へ用語を置き換えた。日本語でも JIS Z 8103 で不確かさが正式な用語になっている。
このツールが「誤差伝播」を名乗っているのは、学生実験の現場と検索語がいまだに誤差で回っているからで、中で走っている計算は GUM の合成標準不確かさとまったく同じ形をしている。企業の品質保証部門や校正の話をする場面では「合成標準不確かさ」と言い換えたほうが通りがいい、という程度に覚えておくと得をする。
測定誤差 計算をうまく回すための小さなコツ
誤差が分からないときは最小目盛の半分から始める アナログ器具は「最小目盛の1/2を読み取り誤差とする」のが実験室の慣習。デジタル表示なら最小表示桁の±1カウントに、仕様書の確度(±○% rdg ±○ dgt)を合わせるのが基本だ。ここが決まらないと伝播計算は一歩も進まないので、厳密さにこだわる前に慣習値を入れて一度回してみるのが早い。
仕様が % で書かれた測定器は入力形式を切り替える
「±0.5% rdg」を絶対誤差の欄に 0.5 と打ち込むと、まったく別の計算になる。誤差の入力形式を「相対誤差(%)」にすれば、内部で |A|×ΔA[%]/100 を使って絶対誤差へ換算してから伝播させる。換算後の絶対誤差は結果側にも出るので、読み替えが意図どおりか目で確認できる。
3変数以上は2変数ずつ、中間段階は誤差2桁で 測定量が3つある式は、2つずつまとめて段階的に流し込めばいい。抵抗率を例にすると次の順になる。
ρ = R·πd²/(4L) ← 測定量は R, d, L の3つ
① S = (π/4)·d² → A^p を選び p=2, k=0.7853981634
② RS = R × S → A×B(①の丸め前の値と誤差を B 側に入れる)
③ ρ = RS ÷ L → A÷B
中間段階の値を次の入力へ渡すときは、丸め桁を「2桁」に切り替えておく。1桁に丸めた値を再入力すると、段を重ねるたびに丸め誤差が積み上がる。
寄与率90%はストップサイン 片側の分散寄与率が90%を超えたら、もう一方をどれだけ精密に測っても合成後の誤差はほとんど動かない。時間も予算も、寄与率の高い側に全部つぎ込むほうが効く。プリセットの密度を選んで寄与率バーを見ると、この非対称さが一目で分かる。
よくある質問
誤差は単純に足してはいけない? なぜ二乗和平方根なのか
単純な足し算は「両方の誤差が同時に、同じ向きに、最大限ずれる」という最悪ケースの見積りだ。互いに独立な測定量でそれが起きる確率は低く、多くの場合は互いに打ち消し合う。統計的には、独立な量では誤差そのものではなく分散(誤差の二乗)が足し算になるので、合成後の誤差は Δy = √(ΔA² + ΔB²) になる。実際にどれだけ小さくなるかは、使用例の温度差ケースを見てほしい。単純和は安全側の見積りだが、そのぶん過大になる。
有効数字は結局何桁で書けばいい?
誤差を有効数字1桁に丸め、その位に結果値を揃える——というのが実験レポートの慣習だ。理由は、誤差そのものも推定値でしかないから。数回から十数回の測定から求めた標準偏差は、それ自体が1〜2割の幅で動く。その2桁目を書き分けても情報が増えない。本ツールは既定で1桁に丸めるが、丸め桁を2桁に切り替えることもできる(切り替えても伝播誤差の生値と寄与率は動かず、変わるのは表記と有効数字の桁だけ。実例は使用例のケース1とケース2の対比を見てほしい)。2桁は、この結果をさらに別の計算へ渡すときの丸め誤差対策として使ってほしい。提出先の投稿規定や講義の指定があれば、当然そちらが優先される。
誤差を 0 で入れたら有効数字欄が「—」になった
仕様どおりの挙動だ。3±0 と 4±0 の積は「12 ± 0」と表示され、有効数字欄と寄与率はどちらも「—」になる。誤差が 0 だと丸め位置が決まらず、結果を何桁で切るべきかを誤差から言えなくなるためだ(このとき桁数は入力値そのものの書き方に依存する)。分散の総和も 0 なので、寄与率は 0% ではなく「定義できない」として非表示にしている。定数どうしの計算ならそれで正しいが、測定値のつもりで 0 を入れたなら、最小目盛の半分あたりを誤差として入れ直すと、実際に主張できる桁数が見える。
「1000 ± 300」ではなく「(1.0 ± 0.3)×10³」と表示されるのはなぜ?
固定表記だと末尾のゼロが有効数字を偽装するからだ。50±2 と 20±5 の積は y=1000、Δy=253.18 で、1桁に丸めると誤差は 300 になる。つまり100の位にすでに誤差がある。それを「1000」と書くと4桁測ったように読めてしまうが、実際の有効数字は2桁しかない。固定表記では末尾のゼロが「位取りのゼロ」なのか「有効数字のゼロ」なのか区別する手段がない。指数表記なら仮数部の桁数がそのまま有効数字になるので誤読の余地が消える。切り替わるのは、丸め位置が1の位より上になったとき、結果値の絶対値が 0.001 未満のとき、10万以上のときの3条件で、どれに該当したかは結果欄の情報ボックスに理由が出る。
3変数以上の式は扱えない?
2変数ずつ段階的に流せば扱える。具体的な手順は上の Tips に書いたとおりで、各段の丸め前の値と誤差を次の入力へ渡していく。相対誤差の二乗和平方根は結合の順序に依存しない(3項を1回で合成しても、2項ずつ2回に分けても、丸めさえしなければ同じ Δy になる)ので、どの2つから先にまとめても最終結果は変わらない。入力欄を測定量2つと定数係数 k に絞ったのは、可変個の入力欄にすると1画面で完結しなくなるという UI 上の判断だ。定数係数を持たせてあるおかげで、4π² や π/4 のような係数付きの式もそのまま1段で計算できる。
入力した測定値がサーバーに送られることはない?
ない。伝播計算も丸めもすべてブラウザ内の JavaScript で完結していて、測定値・誤差・結果のいずれもサーバーへ送信していないし、保存もしていない。ページを閉じれば消える。未発表の卒論データや社外秘の測定値を入れても外へは出ない。ただし URL にも値は残らないため、続きをやるつもりなら「結果をコピー」で手元にテキストを残しておくといい。
同じ測定器で測った量どうしでも、この計算でいい?
厳密には注意が要る。本ツールは各測定量が互いに独立(無相関)で、誤差が正規分布に従うという前提で二乗和平方根の合成をしている。同じ標準器で校正した2台の測定器、同じ人が同じ読み癖で読んだ2つの値などは相関を持ち、GUM でいう共分散項 2·ρAB·(∂y/∂A)(∂y/∂B)·ΔA·ΔB の分だけ実際の誤差が変わる。正の相関がある量の和では本ツールの値より大きく、差では逆に小さくなる(共通の系統誤差が打ち消し合うため)。学生実験は独立を仮定して運用するのが大半なのでそのまま使って問題ないが、校正の履歴が共通している測定を扱うときは、結果を一次見積りとして受け取ってほしい。
まとめ — 表記はレポートへ、寄与率は次の実験へ
測定値と誤差を入れれば、伝播誤差・有効数字を揃えた表記・分散寄与率が一度に出る。レポートに写すのは表記の1行、次の実験計画を決めるのが寄与率、という使い分けで回してほしい。
同じ二乗和平方根を設計側で使うなら 公差積み上げシミュレーター、分布指定とモンテカルロで工程能力指数まで見るなら 公差解析シミュレーター(RSS+モンテカルロ+Cpk) が対応する。単位がそろっていない測定値は 単位換算 で先に直しておくと桁の取り違えが減るし、力や変位のようにベクトル量を合成してから誤差を考える場面では 2Dベクトル合成・断面力算出 も併せて使える。
「この演算が足りない」「この丸め規則にも対応してほしい」といった要望があれば、お問い合わせページ から気軽に送ってほしい。
Mahiro
Mahiro Appの開発者。学生実験で密度を出したとき、電卓の 2.654661017 をそのまま結論欄に書いて赤ペンをもらった側の人間。誤差の丸め位置が繰り上がって 58 ± 1 になるケースを手計算で何度も踏み抜いたので、そこだけは自動化した。
運営者情報を見る