このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

電卓のパーセントキーってムチャクチャじゃん

ハードウェアの電卓って、機種によって違うかも知れないけど、1 + 2 × 3 と打つと 9 になっちゃいますよね。あれイヤ。でも、ハードウェアの電卓を持ち歩くことなんてなくて、僕はiPhone付属の電卓アプリを使います。電卓アプリでは、イコールキーを打つまでは計算式を内部に保存するので、足し算・掛け算の優先順位はちゃんと認識します。つまり:

  • 入力「1 + 2 × 3 =」で答は 7

入力した式を常識的に解釈してくれるんだ、と安心(?)してたんですが、奇妙な挙動が:

  • 入力「50 % + 50 % =」で答は 0.75

%は、優先度が最も高い「1/100を掛ける」オペレータとして解釈して

  • 50×(1/100) + 50×(1/100)

を計算してくれるかと思ったら、違う!

いろいろやってみると、アプリがパーセントを受け取ると内部の計算式を変更してしまうようです。%の直前の演算が×か÷のときは、特に何もしないのですが、%の直前の演算が+か-のときは、次のような解釈をします。

  • %の直前の演算が+の場合、入力列が A + x % であるとき、A + A×(x/100) を計算する。
  • %の直前の演算が-の場合、入力列が A - x % であるとき、A - A×(x/100) を計算する。

50 % + 50 % ならば、(50 %) + (50 %)×(50/100) = 0.5 + 0.5×0.5 = 0.5 + 0.25 = 0.75 だったのです。

掛け算を先にするという規則と、パーセントによる式変形効果はどういう関係でしょうか?

  1. 100 + 30 % × 2 = 160
  2. 100 + 2 × 30 % = 100.6

一番目は、掛け算優先により 30%×2 = 60% が計算されて、100 + 60 % ⇒ 100 + 100×60% の変形が施された後に評価(evaluate)されて160です。

二番目は違うようです。2 × 30 % を先に見ますが、%の直前が×なので、%の特殊効果が殺されて、2×(30/100) という単なる数(変形効果なし)に退化します。100 + 2×(30/100) が評価されて100.6。

ウワーーッ、ナンダこの変な仕様は? ヤダなー、もう。


手元のハードウェア電卓、CASIO MW-12Aというヤツですが、これで試してみます。

  • 100 + 50 % = 200
  • 100 - 50 % = 100

ハァーー??

パーセントキーは1/100という単純な意味ではなくて、事前の入力の意味を変える修飾キーなんですね。その直前に打った演算キーとパーセントキーのコンボで、特定の関数をトリガーする仕掛けのようです。

  • x + y % は f(x, y) という関数呼び出しに変形される。ここで、f(x, y) = x/(1 - y/100)
  • x - y % は g(x, y) という関数呼び出しに変形される。ここで、g(x, y) = 100*(x - y)/y

「+ y %」という打鍵列は、λx.(x/(1 - y/100)) という関数を意味します。「x + y %」では、既に打鍵され評価されている値xに、この関数が適用されるわけです。「- y %」, 「x - y %」の解釈も同様です。

  • 「100 + 20 %」 = 100/(1 - 20/100) = 100/0.8 = 125
  • 「100 - 20 %」 = 100*(100 - 20)/20 = 100*80/20 = 400

%でトリガーされる関数fとgは、次の用途から選ばれたようです。

  • f: 原価をx円として、売値に対する利益率をyパーセントとするときの、売値を求める関数
  • g: 売値をx円、原価をy円とするとき、原価に対する利益率のパーセント値を求める関数
  • gの別解釈: 値引き後売値をx円、元売値をy円とするとき、値引き率のパーセント値を求める関数

ウゲーッ。制限されたインターフェイスで苦し紛れに考えた出された歪んだ仕様ですね。ハードウェアに拘らなければ素直でまともな入力形式を使えるのだから、ソフトウェア実装では、こんな奇妙な機能は無意味だよな …… んっ、その無意味な知識を僕は調べたんだな …… アーアッ。

[追記]
変な仕様を擁護する理由としてひとつ思い付いたことは、消費税計算。3000円の商品の税込み価格が、「3000 + 8 %」で計算できます。「3000円に8%増し」という日本語表現とも相性がいいし。

カシオ電卓だと、「3000 + 8 %」の意味は「原価を3000円として、売値に対する利益率を8パーセントとするときの売値」なので、3260.86… という結果。代わりに、1.08を掛ける演算としてズバリ[税込み]ボタンがあります。

まーいずれにしても、入力シーケンスの特定のコンビネーションに例外的な意味を持たせるアプローチは、整合性がなく記憶負担を強いるので、僕は大嫌いです。
[/追記]