CODE Polyglot / 直した不具合

推定体脂肪率がちょうど区分の境目のとき、下の区分と判定する

160.0cm・57.6kg・40歳・男性(体脂肪率 20.0% ちょうど)→「標準」(正しくは「やや高い」)

何が起きていたか

身長・体重・年齢・性別から、BMI をもとに体脂肪率を推定し、「低い・標準・やや高い・高い」に分けるツールで、推定した体脂肪率がちょうど区分の境目になる入力を、下の区分と判定していました。

  • 身長 160.0cm・体重 57.6kg・40歳・男性: 体脂肪率は 20.0% ちょうどで、「やや高い」が正しい区分です。ツールは「標準」と出していました
  • 150.0cm・40.5kg・20歳・男性(10.0% ちょうど)は「低い」と出ていました(正しくは「標準」)

どのくらいの入力で起きていたか

下の「確かめたこと」の 6,989,319通りのうち、2,916通りで区分(とコピーの文字)がずれていました。体脂肪率・BMI・体脂肪量の数字の表示は、もともと正しく出ていました。

どうやって見つかったか

BMI計算 で、BMI がちょうど境目のとき下の区分になる不具合が見つかりました。そこで、シルギア側が、BMI から区分を決めているほかのツールを探して直しました。CODE Polyglot は、直したコードを本番に出す前と出したあとに、全通りで確かめました。

原因

体脂肪率は「1.2×BMI + 0.23×年齢 − 10.8×性別 − 5.4」で出します。これを2進数の小数で計算すると、ちょうど 20 になるはずの値が 19.999… になることがあり、区分は「20未満なら標準」で決めていたので、「標準」に入りました。

どう直したか

BMI計算と同じく、計算を calc.js に分けました。入力の文字列を分数(BigInt)のまま扱い、区分を丸める前の正確な値で決めるようにしました。数字の表示は変えていません。

確かめたこと

CODE Polyglot の検証(tools/shirugear-verify/。本番の app.js と calc.js をそのまま動かし、画面の文字を正確な分数の正解と比べる)で確かめました。

入力は次の 6,989,319通り です。

  • 身長 140.0〜190.0cm × 体重 40.0〜100.0kg(0.1刻み)× 年齢 20〜80(10歳刻み)× 性別
  • 身長 2cm 刻み × 体重 0.1刻み × 年齢 15〜90 の全部 × 性別
  • 体脂肪率が区分の境目ちょうど、体脂肪率・BMI が表示の四捨五入の境目ちょうどになる体重
  • 1.6e2 のような書き方・小数の年齢・エラーになる入力

比べたのは、体脂肪率・区分・BMI・体脂肪量・説明の行・コピーの文字です。

版不一致
直す前6,989,319通り中2,916通り
修正(191f08b4d)・本番に反映したあと(2026-10-31。本番の app.js・calc.js がコミットと同じことも確認)6,989,319通り中0通り

← 直した不具合の一覧へ