VIDEO LESSON

JavaScriptのMath.log1p():小さな増減率を精度よく対数へ変換するの解説動画

再生時間 7:52動画を別のタブで開く ↗
動画の字幕・文字起こしを読む

再生中の字幕を濃い黒で表示し、一番上に追従します。字幕の行を選ぶと、その位置から再生できます。

  1. 0:00こんにちは。
  2. 0:00今回はジャバスクリプトのマス・ログワンピーを紹介します。
  3. 0:05これは、一たすエックスの自然対数を求める標準のメソッドです。
  4. 0:10自然対数とは、約二点七一八という定数を底とする対数で、増減の分析や統計の処理でよく使われます。
  5. 0:18たとえば五パーセントの増加は、割合で表すとゼロ点ゼロ五です。
  6. 0:23この変化を対数で表すには、マス・ログワンピーにゼロ点ゼロ五を渡します。
  7. 0:29変化がなければ結果はゼロ、減っていれば負の値になります。
  8. 0:33普通の計算と何が違うのか、なぜ小さな変化で精度が問題になるのかを、この動画で順番に確かめていきます。
  9. 0:41まず動作環境です。
  10. 0:43マス・ログワンピーは、二千十五年に追加されたジャバスクリプト標準の機能で、
  11. 0:47ブラウザーとノード・ジェイエスの両方で利用できます。
  12. 0:51二千十五年七月以降、主要ブラウザーを横断して使える機能とされており、現行のクローム、
  13. 0:56エッジ、ファイアフォックス、サファリが対象です。
  14. 1:00記事のサンプルはノード・ジェイエス二十二系または二十四系を想定し、追加パッケージや実験的な設定は使いません。
  15. 1:08古い組み込みブラウザーを対象にする場合は、使う前にタイプオブで関数かどうかを確認してください。
  16. 1:14結果がフォルスなら、その環境ではそのまま実行できません。
  17. 1:18基本の書き方を見ましょう。
  18. 1:20呼び出し方は、マス・ログワンピー、かっこ、エックスです。
  19. 1:25エックスには、一へ加える数値を渡します。
  20. 1:28増減率なら、五パーセントをゼロ点ゼロ五として渡してください。
  21. 1:33戻り値はナンバー型で、一たすエックスの自然対数です。
  22. 1:37ゼロを渡せばゼロ、ゼロ点ゼロ五なら約ゼロ点ゼロ四八七九、一なら約ゼロ点六九三一が返ります。
  23. 1:45マスはコンストラクターではないため、新しくインスタンスを作る必要はありません。
  24. 1:52戻り値はプロミスではなく同期的に得られる数値なので、アウェイトやコールバックも不要です。
  25. 1:59入力そのものを書き換えることもありません。
  26. 2:03このメソッドが用意された理由を、具体例で確かめます。
  27. 2:06ジャバスクリプトの通常の数値は、有限の精度しか持っていません。
  28. 2:11イーのマイナス十六乗という値はゼロではありませんが、一に加えると、結果は丸められて一になってしまいます。
  29. 2:18その後で対数を取っても、元の微小な変化は取り戻せず、結果はゼロです。
  30. 2:23一方、マス・ログワンピーに元の変化をそのまま渡すと、約イーのマイナス十六乗という正しい結果が返ります。
  31. 2:31大切なのは、元の小さい値を、そのまま渡すことです。
  32. 2:34先に一へ加えてから引き直しても、失われた差は戻りません。
  33. 2:38特殊な値の結果をまとめて確認します。
  34. 2:42エックスがマイナス一なら、結果はマイナス無限大です。
  35. 2:46マイナス一より小さい値を渡すと、結果はナンになります。
  36. 2:51ゼロはゼロ、マイナスゼロはマイナスゼロ、無限大は無限大が返ります。
  37. 2:57有限のエックスがマイナス一より大きければ、戻り値も有限になります。
  38. 3:02ここで注意したいのは、範囲を外れた入力でも例外にはならず、特殊な値が静かに返ってくることです。
  39. 3:11計算が成功して見えても、入力が異常だった可能性は残ります。
  40. 3:16だからこそ、用途に合わせて事前の入力チェックが大切になります。
  41. 3:21実例として、増減率を対数へ変換するトゥーログチェンジという関数を作ります。
  42. 3:28最初に、引数がナンバー型で、かつ有限の数値かどうかを調べます。
  43. 3:33文字列や無限大、ナンはここでタイプエラーとして止めます。
  44. 3:38次に、値がマイナス一以下でないかを確認し、範囲を外れるならレンジエラーとして報告します。
  45. 3:46この順番がポイントで、まず数として扱えるかを見て、次に増減率として許される範囲かを見ます。
  46. 3:54どちらの検査も通った場合だけ、マス・ログワンピーで対数を計算して返します。
  47. 4:00検証と計算の役割を分けることで、読みやすい関数になります。
  48. 4:06計算結果を読みます。
  49. 4:07変化なし、つまりゼロなら結果はゼロです。
  50. 4:11五パーセント増加のゼロ点ゼロ五では、約ゼロ点ゼロ四八七九〇になります。
  51. 4:17五パーセント減少のマイナスゼロ点ゼロ五では、約マイナスゼロ点ゼロ五一二九三です。
  52. 4:24増加と減少で、絶対値が少しだけ違う点に注目してください。
  53. 4:29基準となる値が時点ごとに変わるため、符号を反転しただけの同じ大きさにはならないのです。
  54. 4:37微小な増加であるイーのマイナス十六乗は、通常の小数表示では読みにくいため、
  55. 4:43指数表記に直してイーのマイナス十六乗と表示しています。
  56. 4:49表示の桁数を絞ることで、読みやすくなります。
  57. 4:52不正な入力を渡した場合も確認します。
  58. 4:55マイナス一とマイナス一点一は、数値としては有限ですが、増減率の範囲を外れるためレンジエラーになります。
  59. 5:02文字列のゼロ点ゼロ五は、数字に見えても型が違うためタイプエラーです。
  60. 5:07無限大とナンも、有限でない数値としてタイプエラーで止まります。
  61. 5:12マス・ログワンピーを直接呼ぶだけでは、これらは例外にならず特殊な値が返ってしまいます。
  62. 5:18完成コードが事前に検査して例外を投げるのは、処理を止める条件を明確にするためです。
  63. 5:24これらの結果は、ノード・ジェイエスの実機でも確認済みで、記事の期待出力と一致しました。
  64. 5:30実行方法は二通りです。
  65. 5:31ブラウザーでは、通常のウェブページを開き、開発者ツールのコンソールへ実例のコード全体を貼り付けて実行します。
  66. 5:39画面要素を操作しないため、専用のエイチティーエムエルは要りません。
  67. 5:44ノード・ジェイエスでは、コードをログチェンジ・シージェイエスというファイルに保存し、
  68. 5:49ターミナルでノード、スペース、ファイル名と入力して実行します。
  69. 5:54最初にバージョンを確認するコマンドも併せて実行すると安心です。
  70. 5:59ウェブサーバーの起動や、エヌピーエム・インストールは必要ありません。
  71. 6:04コード全体を関数で囲んでいるので、繰り返し実行しても変数名が衝突しにくい構成になっています。
  72. 6:11失敗例を三つ押さえます。
  73. 6:13一つ目は、パーセントと割合の取り違えです。
  74. 6:17五パーセント増加に、そのまま五を渡すと、計算対象は一・ゼロ五ではなく六になってしまいます。
  75. 6:26これはエラーにならないため、入力チェックだけでは見つかりません。
  76. 6:32パーセントで受け取るなら、百で割って割合に直してから渡してください。
  77. 6:39二つ目は、丸めのタイミングです。
  78. 6:42元データがすでに丸められて変化がゼロになっていれば、このメソッドでも精度は復元できません。
  79. 6:51三つ目は比較の方法です。
  80. 6:53結果を等号三つで固定の小数と比べるのではなく、用途に合った許容誤差で判断してください。
  81. 7:02活用場面とまとめです。
  82. 7:04時系列の増減率を対数変化へ変換すると、掛け算で連続する変化を、足し算で表せるようになります。
  83. 7:12たとえば五パーセント増えた後に五パーセント減ると、倍率は一・ゼロ五かけるゼロ・九五となり、
  84. 7:17元の値には完全には戻りません。
  85. 7:22そのわずかな減少も、対数変化なら負の値として正しく扱えます。
  86. 7:27別の使い方として、アクセス件数のようなゼロ以上のデータを変換すると、ゼロ件をゼロのまま保ちながら、
  87. 7:33大きな値の差を圧縮できます。
  88. 7:38増減率ならマイナス一より大きい値、件数ならゼロ以上の値というように、目的に合わせて受け付ける範囲と単位を決めてから使ってください。
  89. 7:50お疲れさまでした。
日本語字幕をダウンロード(WebVTT)

この動画で学べること

Math.log1p()で小さな増減率を自然対数へ変換する方法を解説。丸め誤差が起きる理由、引数と戻り値、入力チェック、ブラウザーとNode.jsの実行手順を学べます。

解説記事・サンプルコードを読む:JavaScriptのMath.log1p():小さな増減率を精度よく対数へ変換する →