ネイティブ / 体験型ケーススタディ / 読了目安:18分

Windows 電卓:なぜ 200 + 10% は220になる?

REA で Windows 電卓のパーセントキーを調査。加算と乗算を比較し、分岐を読み解いて、二つのオペランドを使うデモで検証します。

このページの内容

01. 解析する前に試してみる

数字を200と10のままにして「% を適用」を押すと、二つ目の数字が20になります。「続いて =」を押すと結果は220です。乗算に切り替えて同じ操作をすると、二つ目の数字は0.1、最終結果は20になります。

パーセントの実験試す / 観察する / 説明する
標準モード / パーセント01 / 入力

200 + 10%

10

% を押し、二つ目の数字の変化を見てください。

同じ二つの数字で、加算と乗算を順に試してください。

二つのオペランドによるパーセントの実験です。Windows 電卓全体のエミュレーターではありません。

作るもの

二つのオペランドを使うパーセント実験と、中間状態・最終結果の両方を確認するテスト一覧。

調査の前に

ラボは設定なしで使えます。バイナリ解析には、調査可能な Windows 電卓のインストールと設定済みネイティブ解析プロバイダーが必要です。Microsoft の公開ソースも照合に使えます。 REA を設定する →

02. キーを押す順序を記録する

問いを具体的にします。200を入力し、加算を選び、10を入力し、パーセント、イコールの順に押すと何が起きるでしょうか。イコール後だけでなくパーセント後の表示も記録します。途中のオペランドは、最終結果だけでは分からない情報を示します。

これは標準モードの動作です。モード、リリース、入力順を記録してください。イコールの連打、オペランドの省略、二度目のパーセント入力には追加の状態が関わるため、最初の実験からは除きます。

この調査用プロンプトをコピー
REA で Windows 電卓の標準モードの百分率計算を調べてください。200 + 10 % = と 200 × 10 % = の入力順を比較し、インストール済みのどのモジュールが計算を担当するか特定してください。パーセントの分岐と演算子に応じたオペランド変換を追跡し、確認した命令、ソースの解釈、実際の GUI 入力結果を区別してください。

03. 計算処理はランチャーにあるとは限らない

それらしい名前の実行ファイルを開くだけでは不十分です。別のアプリに処理を渡しているなら、インストール済みパッケージまで追います。実際に解析したファイルとハッシュを記録してください。

元の調査では、小さな calc.exe ランチャーではなく CalcViewModel.dll に計算処理がありました。関数の選定には人の分析も使われています。Microsoft の公開ソースは演算子 ID の解釈に役立ちましたが、インストール済みバイナリと完全に対応するソースコミットであるとは確認されていません。

  • どのファイルに計算の分岐があるか?
  • 何がパーセント処理を選び、前の演算子はどこに記録されるか?
  • 前の値と現在の入力はどこに保存されるか?
  • 各分岐はどの計算ヘルパーに到達するか?

04. まずオペランドの変換を再実装する

加算・減算では、入力したパーセントは一つ目の数字を基準にします。乗算・除算では、100で割った値に変換します。その後で保留中の演算子を適用します。実装と画面の両方で、この二段階を分けてください。

このラボでは、状態の変化が見えるよう % と = を別々に押します。入力値や演算子を変更すると新しい計算が始まります。受け付けるのは有限の数値二つで、任意の計算式ではありません。

この調査用プロンプトをコピー
標準モードで二つのオペランドを使う次のパーセント動作だけを実装してください。+ と − は entry × (first / 100)、× と ÷ は entry / 100 に入力を変換します。変換後のオペランドをテストから参照可能にし、保留中の演算はイコール時だけ適用してください。ゼロ除算、空の入力、リセットを処理し、キー連打や関数電卓モードとの互換性は主張しないでください。

05. 答えだけでなく途中の値もテストする

二つの誤りが相殺し、正しい最終結果になることもあります。まず変換後のオペランド、次に結果を検証してください。減算、除算、ゼロ、負の最初の値を含め、よく知られた加算例を固定で返すだけでは通らないテストにします。

新たに Windows で試した結果が異なる場合は、式を変更する前にモードと正確な入力順を確認します。キーの順序と表示状態を保存してください。元の報告は Windows の実 GUI 入力検証を完了したとは述べていないため、実施済みと扱わないでください。

06. 既知の結果と比較する

以下を明確な確認点として使います。一致しても、この小さなルールを裏付けるだけで、アプリ全体の互換性を示すものではありません。

キーの入力順% の後= の後
200 + 10 % =20220
200 − 10 % =20180
200 × 10 % =0.120
200 ÷ 10 % =0.12,000
50 + 20 % =1060
6 × 6 % =0.060.36
200 ÷ 0 % =0未定義

両方を同じフォルダーに保存し、Node.js で検証を実行します。パッケージのインストールは不要です。

ターミナル
node check-case-labs.mjs

07. 実際に検証したのはどこまで?

当サイトは、Microsoft の公開例を含め、独自の二オペランド実装に対して数値テストを実行しています。Microsoft のテストスイートやインストール済み Windows アプリの自動操作は実行していません。% や = の連打、完全な式解析、関数電卓モードはデモの対象外です。

当サイトの数値テスト結果を読む →

出典: REA の電卓検証レポート · Microsoft の固定コミットのパーセント分岐。チュートリアル、図、ブラウザー実験は独自制作です。

次の実験恐竜ゲームはなぜだんだん速くなる? →

REA は初めてですか? REA とは? · ガイドの検証方針