今まで数秒で計算できていたのに、精度を上げた途端に数十秒~数分の計算時間が必要になるのはかなり不快なので、①そういう犠牲を払う価値がある問題を扱うこと、②精度を上げたことによる速度的劣化を最小化することの2つが重要。最適化をちょっとサボるだけで計算速度は容易に1〜2桁下がる。
#Julia言語 では、実行時に、必要な精度が与えられたときに、その精度で効率よく計算できるコードを自動的に生成して、即時ネイティブコードにコンパイルして実行する、というようなことができます。

Juliaのような環境では、各精度ごとに最適化をダイナミックに行えるという利点があります。
以下のSGJさんの講演の最後の方では、与えられた諸々の状況に合わせてFFT(高速フーリエ変換)の効率的なコードが自動生成されるようにしておけば、ハードウェアに依存しないジェネリックで効率的なFFTのライブラリを作れるという話をしています(それがFFTW!)。続く

それと同じような感じで、与えられた諸々の状況に合わせて初等および特殊函数の効率的なコードを自動生成する仕組みがあるべきだと思います。

FFT単体ではなく、沢山の函数を扱うことになるので、しんどい仕事になりそうですが。
初等函数の範囲内でもFloat64に特化されたコードは多くの場合に使われています。それらをどのようにより一般的な場合に拡張するかは非自明な問題。

添付画像は

log x - x + 1

を計算するための #Julia言語 StatsFuns.jlのコード。logとは別に log x - x + 1 が実装。

github.com/JuliaStats/Sta…
初等函数に限っても、実用的には、非常に細かないバリエーションが必要だという問題があって、一筋縄で行かない。

cos, sin, exp, log の類だけならシンプルだが、log(1 + x) や log(x) - x + 1 の類も別に必要だと知ると結構怖い。
リンク先での引用の言葉を借りれば、

* 初等函数や特殊函数のライブラリは特に64ビット浮動小数点数に完全に特化しているものが多くて、usability & generality の点で問題があるのではないか

という話。

そのせいで我々は「精度はFloat64が普通」のような思い込みに縛られているのではないか?

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with 黒木玄 Gen Kuroki

黒木玄 Gen Kuroki Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @genkuroki

21 Feb
#超算数

「(算数は)定義とか論理じゃないので」のようなことを、100年以上の伝統を持つ非常識な算数教育の伝統に沿って言う人達は基本的に嘘つき。

例えば、小2算数教科書での長方形と正方形の定義は非常に正確で小2の子にも「正方形は長方形の特別な場合であること」が分かるようになっています。
#超算数 長方形と正方形については、すでに小2算数教科書に正確な定義が噛み砕かれた形式で載っているのに、ちょー算数の伝統に則って算数の教え方を指南する人達が、小学校の先生達をおかしな方向に誘導している。

ちょー算数信者の発言は大体において全部「嘘」だと思っておく方がよいです。
#超算数 小2の子であっても、正方形を見せて、すべての角が直角かどうかを聞いてみて、全部直角だと答えた直後に、教科書にある長方形の定義を読ませて、その条件を満たしていることを確認させると、正方形も長方形の一種であることをすぐに理解できます。

教科書に書いてあるルールに従うだけ。
Read 13 tweets
21 Feb
その程度のことは #Julia言語 では実現済み(添付画像)。

64ビットのいつもの浮動小数点数の規格だけに特化されたコードを書くことに投資し続けることが、長期的に適切なやり方だとは思えない、という非常に穏健で普通の話をしているのだと私は思いました。
#Julia言語 で sin(2πkx) を計算するコードを書くときには

sinpi(2k*x)

のように書いた方が精度的にも効率的にも得です。三角函数の引数にπがかけられている場合は多いので、覚えておく価値があります。
sinpiの #Julia言語 での実装のコード(添付画像①)はすでに紹介済み。

そのコードを見れば分かるように、sinpi(1/2)やsinpi(1/6)などを特別扱いして添付画像②のようになっているわけではないです。
Read 4 tweets
20 Feb
#Julia言語 ほとんどマクローリン展開なのですが、DS1~DS6の値をじっと見れば、高次の係数ほど大きくずらしてあって、ぴったりマクローリン展開にはなっていないことが分かります。

この微妙な点も結構面白いはず。

Juliaのリポジトリへのリンク↓
github.com/JuliaLang/juli… Image
#Julia言語 返答や引用ツイートを見ると、これをテイラー・マクローリン展開そのものだと誤解している人が多いな。

マクローリン展開ならDS1, DS2が

-1/6=-0.16666…
1/120=0.0083333…

と6,3がずっと続くことになるのですが、そうなっていない。

マクローリン展開そのものだと精度的に損。
#Julia言語 #数楽

浮動小数点数の mod 2π での剰余を求めるのは非常に大変。

Juliaではそのためのコードが別ファイルになっていて、非常に複雑。

rem_pio2_kernel(x::Union{Float32, Float64}) はxをπ/2で割った剰余とxを2πで割った剰余がその何倍かを計算。

github.com/JuliaLang/juli… Image
Read 27 tweets
19 Feb
#JuliaLang

v1.5.3 vs. v1.6.0-rc1

random counting

11 sec (v1.5.3)

3 sec (v1.6.0-rc1)

😊😊😊😊😊

gist.github.com/genkuroki/33f6…
#JuliaLang

3 sec (v1.6.0-rc1, single thread)

0.9 sec (v1.6.0-rc1, ThreadPools.tmap)

ThreadPools.tmap example.ipynb
gist.github.com/genkuroki/2e8f…
#Julia言語

forループの函数版:返り値のある函数fをX成分ごとに作用させた結果を得るためにはmap(f,X)を使い、返り値を使わずにXの各成分ごとにfを実行するにはforeach(f,X)を使う。

それぞれのスレッド並列版がThreadPools.{tmap, tforeach}。
github.com/tro3/ThreadPoo…
Read 18 tweets
19 Feb
#超算数

【超算数をインストールされた人、なぜか再生産を行う傾向にある】

そうなる理由↓

日本で算数教育で飯を食って行きたい場合には、ちょー算数マスターになると、就職先が増えたり、出世できる可能性が増えたりする。

ちょー算数には100年以上の伝統に支えられた社会的基盤があります。
かけ算順序問題が新聞で話題にされても、ダメージも受けない理由は、社会的に硬い基盤を持っているから。

子供の保護者側は自分ちの子が被害を受けずに通過すれば発言を続ける意欲は減ります。

ちょー算数マスターになると算数教育界で出世してより良い地位に転職できるかもしれない。

この対比。
例えば、算数の教科書の著作者リストに載っている人達がちょー算数についてどのような考え方を持っているか、どこでその考えを身につけたのか、どのような経歴で算数の教科書の著作者まで出世できたのか、などについては調べる価値があります。

これ面倒な作業で結構大変。
Read 8 tweets
19 Feb
#Julia言語

github.com/johnmyleswhite…

は古過ぎるパッケージであることがProject.tomlがないことからわかります。

そして、add ContinuedFractionsでインストールされるパッケージはさらに古く、ContinuedFraction自体を持っていません。

古めのパッケージが放置されていることがあるので要注意。
#Julia言語 適当なフォルダに

github.com/johnmyleswhite…

をクローンしておいて、そこにaddで追加されたContinuedFractionsのProject.tomlをコピーして、devで使えるようにすれば、ContinuedFractionを最初から含むそのパッケージを使えるようになります。

たまにこういうことがある。
#Julia言語 スクショ

~/.julia/dev/ContinuedFractions にリポジトリのクローンを置いておいて、そこにProject.tomlを追加し、

pkg> dev ContinuedFractions

してある。こうしておけば、ContinuedFractions.jlパッケージを使える↓
Read 4 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!

Follow Us on Twitter!