【入門編】HSLの数学関数とPHPの浮動小数点:型安全な数値計算の設計 – Hack言語 コア・静的型システムとHHVMのアーキテクチャ解析バイブル

やあ。Hack言語の世界へようこそ。
私はHHVMの心臓部で型チェッカーの挙動を日々見守っているアーキテクトだ。

君たちがPHPの「なんとなく動く」という甘い蜜から卒業し、Hackという厳格で高潔な地平に足を踏み入れたことを歓迎する。今回は、多くのエンジニアが沼に足を取られる「数値計算」と「浮動小数点」の罠、そしてそれをHackの型システムとHSL(Hack Standard Library)でどう攻略するかを語ろう。

—

1. PHPの「曖昧さ」という悪魔

PHPは魔法のような言語だ。`”10″ + 5` と書けば、自動的に型を変換して `15` と返してくれる。初心者の頃は便利だが、大規模なシステムにおいて、この「おせっかいな自動変換」はバグの温床となる。

特に浮動小数点は厄介だ。`0.1 + 0.2` が `0.3` にならないのは有名だろう。PHPでこれを放置すると、決済や統計処理で致命的な誤差を生む。

Hackの哲学はこうだ: 「曖昧な状態を放置せず、型で縛り上げ、計算の責任をコンパイル時に確定させる」

—

2. HSLで数学を「安全」にする

PHPのグローバル関数(`sqrt()` や `floor()` など)をそのまま使うのは、もうやめよう。Hackでは `HH\Lib\Math` モジュールを使うのが正解だ。

基本的な使い方

まずは、安全な数値計算の第一歩を見てほしい。

use namespace HH\Lib\Math;

<<__EntryPoint>>
function main(): void {
// 数値の最大・最小を確実に扱う
$a = 10.5;
$b = 20.2;

// HSLの Math\max は型安全。 float 同士を比較し、 float を返す
$max_val = Math\max($a, $b);

// もしここで誤って文字列を渡せば、コンパイル時に型チェッカーが怒鳴りつけてくる
// Math\max(“10”, 20); // Error: Argument 1 must be num, string given

\print(“最大値は: ” . (string)$max_val . “\n”);
}

—

3. なぜ「浮動小数点」を制御する必要があるのか?

コンピュータはメモリ上で数字を「2進数」で表現している。そのため、0.1のような「10進数で割り切れる数」が、2進数では無限小数になってしまう。

陥りやすいエラー:厳密な比較

$a = 0.1 + 0.2;
// 悪い例: if ($a == 0.3) { … }
// これが真になることは、コンピュータの構造上、保証されない。

これをHackでどう扱うか? 賢明な開発者は「イプシロン(極小値)」を使って比較する。HSLは直接的な演算子よりも、数学的な設計を要求する。

use namespace HH\Lib\Math;

function is_nearly_equal(float $a, float $b): bool {
// 差の絶対値が十分に小さければ等しいとみなす
return Math\abs($a – $b) < 0.00001; } この「あえて面倒なことをさせる」のがHackの真骨頂だ。君が計算の誤差を制御しているという「自覚」を、コードに刻み込むんだ。 ---

4. 型システムで守る「数値」の境界線

Hackには `num` という便利な型がある。これは `int` と `float` の両方を受け入れられる型だ。しかし、計算結果を厳密に制御したいなら、関数のシグネチャを絞り込むべきだ。

  • int: 整数。カウントやIDなどに使う。
  • float: 浮動小数点。物理演算や統計など、精度が許容される範囲で使う。

もし、金額のような「1円の誤差も許されない」計算が必要なら、`float` を使ってはいけない。その場合は、「最小単位の整数(例:円なら銭単位のint)」として計算するか、BCMathのようなライブラリをラップして「独自の型」として扱うのが正解だ。

—

5. 先輩からのアドバイス:ここをクリアすれば大丈夫!

初心者が最も躓くのは「型エラーを消すためのキャスト(型変換)」で無理やり数値を変換してしまうことだ。

  • `$val as float` と書くのは、「私はこの変数がfloatであることを保証する」という宣言だ。
  • もし `as` を使わずに `(float)$val` と書くなら、それは「型を強制変換してでも動かしたい」という逃げ道だ。

極意:
「`as` を使うときは、なぜその数値がその型であると断言できるのか、論理的な根拠をコメントに残すこと。」

これだけで、君のコードの信頼性は数段跳ね上がる。

—

まとめ

1. グローバルな数学関数を捨て、`HH\Lib\Math` を使え。
2. `0.1 + 0.2` にはイプシロン(許容誤差)で立ち向かえ。
3. 型エラーは「敵」ではなく、バグを防ぐ「守護神」だと認識せよ。

Hackの型システムは、君の書くコードを未来の自分やチームへの「契約書」に変えてくれる。浮動小数点の不確かささえも型で管理するようになれば、君はもう立派なHackエンジニアだ。

さあ、エディタを開いて、厳格で美しい計算ロジックを実装してみよう。君ならできるはずだ。

タイトルとURLをコピーしました