dart.math 常用対数と自然対数(失敗学)
年表の時間軸を対数にしたい
まあ・・その詳しい裏事情は別にして、
最初、Numbersでいろいろ計算式を工夫して、これでいこう、という変換式ができた。
ところが、それをdartで記述するのに紆余曲折があった。
でもそれもうまくいった! と信じて
「dart.mathを使って数を操る」というドヤ顔の記事を書いたのだった。
書いて公表する前に、Testすべきでしたねえ。
いや、別に、まちがったことを書いたわけではない。
でも、想定とは違っていた。
Numbersの変換結果と一致しない
タイトルからして、その原因は予想されるかもしれないが、
Numbersで使っていたのは常用対数、
対して、前回の記事で書いたcodeは、実は自然対数になっていた。
どこにもeとか書いてないんですけどね、dart.mathではそれがdefaultのようです。
そのことになかなか気づけず、正直、丸一日ムダにしました。
どっちに揃えるか
常用対数と自然対数はどう違うのか。
底が違う、は、わかるんですが、じゃあ、どっちを使うのがいい?
で、このサイトが非常に端的に答えをくれましたね。
私が欲しいのは、間違いなく常用対数です。
dart.mathで常用対数を使う
こちらはpuv.dev。
恐ろしいことに
WARNING!!! This function is not such accurate as low-level implementation!
WARNING!!! Some unit-tests fail because of that!
と警告が出ています。
いったい私にどうしろと。
ともかく、私的に想定した変換をしてくれたのはこちら
import import 'dart:developer';
import 'dart:math' as math;
import 'dart:math';
なんでいくつもimportしてるんだって話だが、その前に常用対数をdefine
double log10(num x) => log(x) / ln10; //Package推奨の書き方
double log10(num x) => math.log(x) / ln10; //場合によってはこちら
こちらもなんで二つあるんだ、という話。
推奨の書き方にはErrorが出ることがある。
前回も書いた、履歴としてのlogと混用だ、ということ。
これはdart:developerをimportしていると起こる。
これが要らなければシンプル。
でもdeveloperも必要だ、ということなら、
'dart:math' as mathもimportして、math.log()と書けばErrorは出ない。
ちなみに、この割り算はなんだ、といったら、
xの自然対数 ÷ 10の自然対数
いわゆる自然対数←→常用対数の変換式。
つまるところ、dart.mathには常用対数は ない という話らしい。
log('正の値') //defaultで自然対数
log10('正の値') //defineした常用対数
今回のlog10はdefineしているので、mathをつける必要はない。
defaultの自然対数を使うなら、やはり履歴logとの関係で変わってくる。
転んでもただでは起きない
失敗したら、失敗しただけ、記事が書けるからね\(^O^)/
そして、一つ一つ学んで、進んでいこう\(^O^)/
Discussion