#Julia言語 小ネタ

isless と < の違い。

それぞれの公式解説を見れば違いは明らかなのですが、違いに気付いていないユーザーは多いと思う。

< は isless にfallbackするので違いは小さいのですが、isless は sort で使用可能な全順序。

docs.julialang.org/en/v1/base/bas…
docs.julialang.org/en/v1/base/mat… ImageImage
#Julia言語 自分で定義した型に Base.isless を定義するときには、sort で使える全順序となるように定義するべき。

それに対して、Base.:< は全順序である必要はない。もちろん、islessにフォールバックするので、別に定義する必要が無ければ、全順序の Base.isless だけを定義しておけば足りる。
#Julia言語 全順序のislessとは別に、全順序ではない < が必要なケースは、浮動小数点数の大小関係。

浮動小数点数は NaN を含んでおり、例えば、0.0 < NaN や NaN < 0.0 は false になって欲しく、実際にそうなるように定義されている。

全順序の isless で isless(Inf, NaN) は true になる。
#Julia言語 「islessが全順序になる」とあっさり私が書いたのを見て、「等号の指定がないと曖昧な説明になる」と見抜いた人は鋭い。islessはisequalと合わせて全順序の条件を満たさなければいけません。すでに引用した公式ドキュメントに書いてある。

docs.julialang.org/en/v1/base/bas… Image
#Julia言語 isequal の存在を知ると == との違いも知りたくなるのですが、違いについては isequal の公式ドキュメント(上で引用した)に書いてある。

== は === にフォールバックするのですが、そうでない場合の期待される振る舞いは公式ドキュメントに書いてある。

docs.julialang.org/en/v1/base/mat… ImageImage
#Julia言語 既存の型と無関係に(サブタイプにせずに)、自前で型を定義した場合には、その型への == の作用はある === にフォールバックするので、自前で定義した型に == を自分で定義する必要が出て来ます。

タプルには == や isequal だけではなく、辞書式順序で isless や < も定義されています。
#Julia言語 個人的な意見では、isequal と == の違いの理解のためには、isless と < の違いを先に知っていた方が分かりやすいと思います。
#Julia言語 通常の数学の習慣では、例えば整数の1は実数の1と完全に同じものとみなされます。

しかし、コンピュータでの計算でInt64の1とFloat64の1.0を同一視はできない。

この違いを isequal や == はうまく吸収してくれています。例えば、isequal(1, 1.0) や 1 == 1.0 はtrueになります。
#Julia言語 そういう仕様は == だけではなく、基本的な演算でもそうなっています。2 * 4.5 はネイティブコードのレベルで 2.0 * 4.5 と完全に同じ。

Juliaはこういう仕様を多重ディスパッチによって、異なる型間の == による比較や * による演算を型昇格後に行うようにすることで実現しています。

• • •

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

2 Apr
#Julia言語 これも面白いです。

LispとJuliaの比較のような話になっている?

以下のリンク先はJuliaでの高速多項式評価が何をやっているかの解説。係数が格納された配列を読みながらの多項式評価より速いです。

discourse.julialang.org/t/cas-benchmar…
CAS benchmarks (Symbolics.jl and Maxima)
#Julia言語 【ネタ】重要情報(笑)

discourse.julialang.org/t/cas-benchmar…
【Maybe julia stands for “Jeff’s uncommon lisp is automated”?】とJeff Bezansonさんが言っていた!
#Julia言語 上で紹介したスレッドは以下に紹介するスレッドから派生したっぽい。

以下のリンク先はJuliaが何をやっているかの易しい解説になっている発言を選びました。

どういう人がやって来ても、技術的な事柄を易しく解説しようとすることはやはり大事なことだな。

discourse.julialang.org/t/cas-best-pra…
Read 7 tweets
2 Apr
#Julia言語

discourse.julialang.org/t/question-abo…

github.com/JuliaMath/Xsum…
Xsum: Exactly rounded floating-point sums in Julia
#Julia言語 Xsum.jl examples

Float128を使うと計算速度が数十倍~百倍以上遅くなったりする。

Xsum.jl の xsum を使えば、少し遅くなる程度のトレードオフで、Float64の精度での和を正確に計算できる。

精度が気になる和をgeneratorのsumで計算してはいけない。

gist.github.com/genkuroki/97c4… ImageImageImage
#Julia言語 builtin sum も sum(f, iter) の形式で使えば精度的に結構悪くなさそう?
Read 5 tweets
2 Apr
ツツカナ vs. 森下卓 電王戦リベンジマッチ shogidb2.com/games/07219818… #将棋 #将棋DB2 @backflip1801より
電王戦公式統一パソコン「GALLERIA電王戦」森下卓九段インタビュー - ヒューマンエラー対策 森下新ルールなら技術で勝てる (1) | マイナビニュース news.mynavi.jp/kikaku/2014120…
指掛けの電王戦リベンジマッチは指継がず、森下卓九段の判定勝ちと発表。ニコ生アンケート結果は良かった85% shogi1.com/denousen-reven…
Read 5 tweets
2 Apr
#数楽 大学1年生向けの線形代数の講義では、与えられた a_{ij}とb_iが定めるx_j達に関する連立一次方程式

a_{11}x_1 + … + a_{1n}x_n = b_1
  ………
a_{m1}x_1 + … + a_{mn}x_n = b_m

をa_{ij}, b_iに関する場合分けで解く話をやったりします。

ax=bはこれのm=n=1の特別な場合。
#数楽 そのm=n=1の特別な場合の方程式

ax=b

は以下の3種に分けされる。

(0) a≠0の場合の ax=b
(1) a=0, b≠0の場合の 0=b
(2) a=0, b=0の場合の 0=0

(0), (2)の場合に解空間の次元はそれぞれ0, 1になり、(1)の場合に解空間は空集合になる。

これの一般化をやる。
#数楽 m=n=2の場合の方程式の中には

x + ay = p
0x + 0y = q

のようなものも含まれる、q≠0の場合は解なしになり、q=0の場合には

x = p - ay
yは任意

の形ですべての解を表せる。

こういう講義をしている人達はそれなりにいるはず。
Read 5 tweets
2 Apr
#数楽 #Julia言語 新学期の講義のためのC^∞級函数の例の準備で、

f(x) = if x > 0 exp(-1/x) else 0 end

のような函数を扱っている人もいるはず。

現時点で最もよく使われているFloat64型の浮動小数点数の精度では

exp(-1/0.001) == 0

は true になります❗️(笑)

こういうのもネタになりそう。 Image
#Julia言語

f(x) = if x > 0 exp(-1/x) else zero(x) end

using ForwardDiff
f′(x) = ForwardDiff.derivative(f, x)

のグラフ。最近では自動微分が普通で、数値的に微分を求めるときにも、導函数の公式を入力せずに、「正確に」かつ「効率良く」微係数を計算できます。

gist.github.com/genkuroki/ce92… Image
#Julia言語

f(x) = if x > 0 exp(-1/x) else zero(x) end
g(x) = if x > 0 exp(-1/x)/x^2 else zero(x) end

using ForwardDiff
f′(x) = ForwardDiff.derivative(f, x)

のgとf′の値と計算速度の比較。

導函数の公式を私が入力したgとForward.derivativeで自動微分しているf′で計算速度はほぼ同じ。 Image
Read 7 tweets
2 Apr
#Julia言語 マクロは難しいです。Symbol型とExpr型がどう使われているかのイメージがないとつらい。そこでイメージを得るためのパッケージを作って以下の場所で公開しています。

github.com/genkuroki/Meta…

github.com/genkuroki/Meta…

AbstractTrees.jlが神。それを使ってExprをツリー表示。 Image
#Julia言語 イメージを得るためには、

e = :(x = 1 + 2)
dump(e)

とかしてみるとよいです。dumpの結果は見難いですが、情報がフルに入っている。見易く気軽に表示したければ、MetaUtils.jl を使えばよい。 Image
#Julia言語 自分でMetaUtils.jlを書くまで、Juliaのマクロを自分で書くことをできませんでした。

まるで「鶏と卵」。数学的な複雑さがある程度以上のものの理解ではほぼ常に「鶏と卵」状態になる。

親子丼が実は大好物。
Read 5 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!