🧮

dart.math 常用対数と自然対数(失敗学)

2023/11/10に公開

年表の時間軸を対数にしたい

まあ・・その詳しい裏事情は別にして、
最初、Numbersでいろいろ計算式を工夫して、これでいこう、という変換式ができた。
ところが、それをdartで記述するのに紆余曲折があった。
でもそれもうまくいった! と信じて
「dart.mathを使って数を操る」というドヤ顔の記事を書いたのだった。
書いて公表する前に、Testすべきでしたねえ。
いや、別に、まちがったことを書いたわけではない。
でも、想定とは違っていた。

Numbersの変換結果と一致しない

タイトルからして、その原因は予想されるかもしれないが、
Numbersで使っていたのは常用対数、
対して、前回の記事で書いたcodeは、実は自然対数になっていた。
どこにもeとか書いてないんですけどね、dart.mathではそれがdefaultのようです。
そのことになかなか気づけず、正直、丸一日ムダにしました。

どっちに揃えるか

常用対数と自然対数はどう違うのか。
底が違う、は、わかるんですが、じゃあ、どっちを使うのがいい?
で、このサイトが非常に端的に答えをくれましたね。
私が欲しいのは、間違いなく常用対数です。
https://chigai.site/313/

dart.mathで常用対数を使う

こちらはpuv.dev。
恐ろしいことに
WARNING!!! This function is not such accurate as low-level implementation!
WARNING!!! Some unit-tests fail because of that!
と警告が出ています。
いったい私にどうしろと。
https://pub.dev/documentation/dart_numerics/latest/dart_numerics/log10.html

ともかく、私的に想定した変換をしてくれたのはこちら

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^)/

Flutter大学

Discussion