WEBVTT

1
00:00:00.000 --> 00:00:00.972
こんにちは。

2
00:00:00.972 --> 00:00:05.997
今回はジャバスクリプトのマス・エクスピーエムワンを紹介します。

3
00:00:05.997 --> 00:00:14.749
これは、自然対数の底である約二点七一八という定数イーのエックス乗から、一を引いた値を返す標準のメソッドです。

4
00:00:14.749 --> 00:00:19.936
式だけ見れば、マス・イーエックスピーから一を引く計算と同じです。

5
00:00:19.936 --> 00:00:26.743
しかしコンピューター上では、途中の丸めによって小さな差が消えてしまうことがあります。

6
00:00:26.743 --> 00:00:33.226
エックスがゼロに近いほど、指数の結果は一に近づき、その差は失われやすくなります。

7
00:00:33.226 --> 00:00:39.871
このメソッドは、最終的に必要な一との差を直接求めることで、その精度低下を抑えます。

8
00:00:39.871 --> 00:00:45.220
なぜ直接計算では足りないのかを、この動画で順番に確かめていきます。

9
00:00:45.220 --> 00:00:46.547
まず動作環境です。

10
00:00:46.547 --> 00:00:51.414
マス・エクスピーエムワンは、二千十五年に追加されたジャバスクリプト標準の機能で、

11
00:00:51.414 --> 00:00:56.281
ブラウザーとノード・ジェイエスの両方で利用できます。

12
00:00:56.281 --> 00:01:01.148
二千十五年七月以降、主要ブラウザーを横断して使える機能とされており、現行のクローム、

13
00:01:01.148 --> 00:01:06.015
エッジ、ファイアフォックス、サファリが対象です。

14
00:01:06.015 --> 00:01:12.652
記事のサンプルはノード・ジェイエス二十二系以降を想定し、追加パッケージや通信は使いません。

15
00:01:12.652 --> 00:01:18.108
この関数は画面要素に依存しないため、同じコードを両方の環境で実行できます。

16
00:01:18.108 --> 00:01:25.040
古い組み込みブラウザーを対象にする場合は、使う前にタイプオブで関数かどうかを確認してください。

17
00:01:25.040 --> 00:01:27.055
基本の書き方を見ましょう。

18
00:01:27.055 --> 00:01:31.859
呼び出し方は、マス・エクスピーエムワン、かっこ、エックスです。

19
00:01:31.859 --> 00:01:35.113
エックスには指数として使う数値を渡します。

20
00:01:35.113 --> 00:01:39.763
戻り値はナンバー型で、イーのエックス乗から一を引いた値です。

21
00:01:39.763 --> 00:01:46.891
ゼロを渡せばゼロ、一なら約一点七一八二八、マイナス一なら約マイナスゼロ点六三二一が返ります。

22
00:01:46.891 --> 00:01:51.231
エックスが正なら結果も正、負なら結果も負の値になります。

23
00:01:51.231 --> 00:01:57.275
マスはコンストラクターではないため、新しくインスタンスを作る必要はありません。

24
00:01:57.275 --> 00:02:04.093
戻り値はプロミスではなく同期的に得られる数値なので、アウェイトやコールバックも不要です。

25
00:02:04.093 --> 00:02:07.348
入力そのものを書き換えることもありません。

26
00:02:07.348 --> 00:02:11.623
このメソッドが用意された理由を、具体例で確かめます。

27
00:02:11.623 --> 00:02:16.720
エックスに、一点一一一一からはじまる非常に小さい値を入れます。

28
00:02:16.720 --> 00:02:22.639
ゼロに近いエックスでは、正しい答えもおおむねエックス自身に近くなります。

29
00:02:22.639 --> 00:02:27.407
ところが、先に指数を計算してから一を引く方法では、結果は一点一一零二となり、

30
00:02:27.407 --> 00:02:32.175
入力から相対的に大きくずれてしまいます。

31
00:02:32.175 --> 00:02:39.245
一方、マス・エクスピーエムワンを使うと、一点一一一一という正しい値がそのまま返ります。

32
00:02:39.245 --> 00:02:48.452
ジャバスクリプトの通常の数値は有限の精度しか持たないため、一に近い数を先に作ると小さな差が丸めに埋もれるのです。

33
00:02:48.452 --> 00:02:54.536
大切なのは、差を後から引き直すのではなく、最初から差として求めることです。

34
00:02:54.536 --> 00:02:57.341
特殊な値の結果をまとめて確認します。

35
00:02:57.341 --> 00:03:03.105
エックスが無限大なら結果は無限大、マイナス無限大なら結果はマイナス一です。

36
00:03:03.105 --> 00:03:05.754
ゼロはゼロ、ナンはナンが返ります。

37
00:03:05.754 --> 00:03:12.142
大きな正の値を渡した場合も、結果が有限の範囲を超えると無限大になることがあります。

38
00:03:12.142 --> 00:03:19.465
ここで注意したいのは、範囲を外れた入力でも例外にはならず、特殊な値が静かに返ってくることです。

39
00:03:19.465 --> 00:03:23.984
計算が成功して見えても、入力が異常だった可能性は残ります。

40
00:03:23.984 --> 00:03:31.307
数値以外の入力では暗黙の変換が起きる場合もあり、意図しない値を受け入れてしまう危険があります。

41
00:03:31.307 --> 00:03:36.137
だからこそ、用途に合わせて事前の入力チェックが大切になります。

42
00:03:36.137 --> 00:03:43.875
実例として、検証つきで指数変化を計算するカルキュレートチェンジという関数を作ります。

43
00:03:43.875 --> 00:03:49.586
最初に、引数がナンバー型で、かつ有限の数値かどうかを調べます。

44
00:03:49.586 --> 00:03:54.744
文字列や無限大、ナンはここでタイプエラーとして止めます。

45
00:03:54.744 --> 00:04:01.377
次に、マス・エクスピーエムワンで計算し、結果が有限かどうかも確認します。

46
00:04:01.377 --> 00:04:09.851
大きな入力では結果が無限大になることがあるため、有限でなければレンジエラーとして報告します。

47
00:04:09.851 --> 00:04:17.957
この順番がポイントで、まず入力として扱えるかを見て、次に計算結果が扱える範囲かを見ます。

48
00:04:17.957 --> 00:04:23.300
検証と計算の役割を分けることで、読みやすい関数になります。

49
00:04:23.300 --> 00:04:25.079
計算結果を読みます。

50
00:04:25.079 --> 00:04:31.840
表示は小数六桁にそろえて、環境ごとの末尾の丸め差を読み取りやすくしています。

51
00:04:31.840 --> 00:04:33.975
ゼロなら結果はゼロです。

52
00:04:33.975 --> 00:04:41.269
一では、イーの一乗である約二点七一八から一を引いた、約一点七一八二八二になります。

53
00:04:41.269 --> 00:04:45.539
マイナス一では約マイナスゼロ点六三二一二一です。

54
00:04:45.539 --> 00:04:51.766
負の入力では、指数の結果が一より小さくなるため、差は負の値になります。

55
00:04:51.766 --> 00:04:58.704
一方、文字列の一を渡すと、数字に見えても型が違うためタイプエラーで止まります。

56
00:04:58.704 --> 00:05:04.308
マス・エクスピーエムワンを直接呼べば文字列も変換されて計算できてしまいますが、

57
00:05:04.308 --> 00:05:09.913
完成コードでは事前検査で止める設計にしています。

58
00:05:09.913 --> 00:05:15.072
これらの結果は、ノード・ジェイエスの実機でも確認済みです。

59
00:05:15.072 --> 00:05:20.124
活用例として、表示値を目標値へ滑らかに近づける計算を見ます。

60
00:05:20.124 --> 00:05:28.038
経過時間をディーティー、追従の強さをレートとすると、更新割合は一から指数を引いた形で表せます。

61
00:05:28.038 --> 00:05:32.754
これをマイナス・マス・エクスピーエムワンと書けば、経過時間が小さい場合にも一との差を直接、

62
00:05:32.754 --> 00:05:37.469
精度よく求められます。

63
00:05:37.469 --> 00:05:42.773
現在値ゼロ、目標値百、レート二、経過時間ゼロ点五秒の例では、更新割合は約ゼロ点六三二一となり、

64
00:05:42.773 --> 00:05:48.078
次の値は約六三点二一になります。

65
00:05:48.078 --> 00:05:52.624
つまり零点五秒で差の約六三パーセントを埋める計算です。

66
00:05:52.624 --> 00:05:57.003
経過時間がゼロなら更新割合もゼロで、値は動きません。

67
00:05:57.003 --> 00:06:03.065
秒とミリ秒を混ぜると追従速度が大きく変わるため、単位は統一してください。

68
00:06:03.065 --> 00:06:04.717
実行方法は二通りです。

69
00:06:04.717 --> 00:06:12.076
ブラウザーでは、空のタブを開き、開発者ツールのコンソールへ実例のコード全体を貼り付けて実行します。

70
00:06:12.076 --> 00:06:17.032
画面要素を操作しないため、専用のエイチティーエムエルは要りません。

71
00:06:17.032 --> 00:06:23.039
ノード・ジェイエスでは、コードをイーエックスピーエムワン・デモ・ジェイエスというファイルに保存し、

72
00:06:23.039 --> 00:06:29.047
ターミナルでノード、スペース、ファイル名と入力して実行します。

73
00:06:29.047 --> 00:06:33.702
最初にバージョンを確認するコマンドも併せて実行すると安心です。

74
00:06:33.702 --> 00:06:38.809
ウェブサーバーの起動や、エヌピーエム・インストールは必要ありません。

75
00:06:38.809 --> 00:06:45.717
コード全体を関数で囲んでいるので、繰り返し実行しても変数名が衝突しにくい構成になっています。

76
00:06:45.717 --> 00:06:47.616
失敗例を三つ押さえます。

77
00:06:47.616 --> 00:06:52.364
一つ目は、単に指数から一を引く式へ置き換えてしまうことです。

78
00:06:52.364 --> 00:06:57.033
イーのマイナス十六乗のような微小な入力では、直接計算の結果はゼロになってしまいますが、

79
00:06:57.033 --> 00:07:01.703
このメソッドなら差が保たれます。

80
00:07:01.703 --> 00:07:03.760
二つ目は、表示の丸めです。

81
00:07:03.760 --> 00:07:11.199
トーフィックスドは表示用の文字列を作るだけなので、後続の計算には整形前の数値を渡してください。

82
00:07:11.199 --> 00:07:15.156
丸めた値を計算へ戻すと、別の丸め誤差が加わります。

83
00:07:15.156 --> 00:07:17.372
三つ目は、入力側の精度です。

84
00:07:17.372 --> 00:07:22.041
レートと経過時間の掛け算など、関数を呼ぶ前の計算で情報が失われていれば、

85
00:07:22.041 --> 00:07:26.710
その後にこのメソッドを使っても復元できません。

86
00:07:26.710 --> 00:07:32.724
比較が必要な場面では、固定の小数と等号で比べず、許容誤差で判断してください。

87
00:07:32.724 --> 00:07:34.138
制約とまとめです。

88
00:07:34.138 --> 00:07:39.164
このメソッドを使っても、任意精度の計算になるわけではありません。

89
00:07:39.164 --> 00:07:46.232
ジャバスクリプトの数値は六十四ビットの浮動小数点数で、表せる範囲と精度には限界があります。

90
00:07:46.232 --> 00:07:54.872
大きな正の入力では結果が無限大になる可能性があり、用途ごとに、どの値を異常として扱うかを決める必要があります。

91
00:07:54.872 --> 00:07:59.977
表示値の平滑化のように、目標へ少しずつ近づける計算や、指数による増加量を求める計算では、

92
00:07:59.977 --> 00:08:05.081
小さな差を消さないことが品質に直結します。

93
00:08:05.081 --> 00:08:13.878
ゼロに近い入力で一との差が必要になったら、指数から一を引くのではなく、マス・エクスピーエムワンを選んでください。

94
00:08:13.878 --> 00:08:19.218
入力と結果の有限チェックを添えることで、安全に使えるようになります。

95
00:08:19.218 --> 00:08:20.632
お疲れさまでした。
