青ポスの部屋

旅と技術とポエムのブログ

ゼロ除算とどう向き合うべきか

ゼロ除算とは

0でのわり算のことです。

算数では「ゼロでわり算はしてはいけない」と習いますが、数学の世界では「未定義」としてその話はしないというお約束になっています。

コンピュータでのゼロ割り

ゼロでのわり算はやらないというお約束になっていても、膨大な計算が行われるコンピュータプログラムの中では、変数でわり算を行うと必ずと言っていいほどゼロ割りは発生します。

ゼロ割りが起こった場合何が起こるかは言語によります。C++JavaScriptFortranのようにInfinityという特殊な定数が返ってきます。

Welcome to Node.js v12.6.0.
Type ".help" for more information.
> 1.0/0.0;
Infinity

一方、Pythonの組み込みfloat型の場合、ZeroDivisionErrorという例外が起こり処理が止まります。

Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 13:35:33) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 1.0/0.0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero

ただ、非常にややこしいことにPythonネイティブのfloatではゼロ除算に対して例外を投げますが、NumPyのfloatの場合はInfが返ります。

>>> import numpy as np
>>> 1.0/np.float64(0.0)
__main__:1: RuntimeWarning: divide by zero encountered in double_scalars
inf

考察:2つの実装パターンのちがい

C++はInfを返すことからわかるように、Infを返すほうが自然な実装です。ただし、Infの挙動がイメージと違う場合は自分で例外処理を組む必要があります。

また、「ゼロ除算が起こると後の処理にクリティカルな影響が出るという」ようなとき、バグトレースに困ることがあります。例えば「除算の結果をリストのインデックスにして要素を引く」というような場合。IndexErrorが返ってくるが、これがゼロ除算の結果とは直感的にはわかりません。

myindex = int(xx/yy)
res = mylist[myindex]

一方で、Pythonの例外を返すという実装は内部的に例外のチェックが行われているので、例外が起こらない場合でも実行速度に影響を与えています。

そのうえ、結局epsilonとのmaxを取って回避したり、例外処理を実装する必要があるので、ある意味「要らぬおせっかい」とも言えます。

# epsilonで回避する
res = 1.0 / max(xx, sys.float_info.min)

# exceptで例外処理する
try:
    res = 1.0/xx
except ZeroDivisionError:
    res = float("inf")

まとめ

割り算を作るときは、ちゃんとゼロ除算のようなエッジケースを考慮しましょう。(あまりまとまってない)

20210220 YBR125バッテリーバンド交換

バッテリーを固定するバンドが切れた

バッテリーを充電して取りつけようとしたら、バンドがちぎれました。

僕「そろそろ暖かくなってきたし、本格シーズンインの前にバッテリー充電しとくか~」

~~充電完了~~

僕「端子ちゃんと締めたし、バンドつけて終わりと」
バンド「ブチッ」
金具「カラン」

f:id:bluepost69:20210220225535j:plain

僕「マジか」

バッテリーを固定するゴムバンドってどれも固いんです*1。バッテリーをつけはずしするとき毎回ぎゅうぎゅう伸ばすので、ついに金具を止めているところがちぎれてしまいました。

バンドは意外と売ってない

まずは近所のコーナンに行きました。車バイク用品コーナーを見ましたが、ありませんでした。次にゴムコーナーを見ましたが、バッテリーを固定するためのゴムバンドはありません。

次に2りんかんまで行きました。バッテリーコーナーを見ましたが、置いてませんでした。店員に聞いたところ、「バイクによって長さがちがうのでパーツの注文販売になる」とのことでした。オーマイガー。

YBR125のバッテリーバンド

仕方がないので、通販で買いました。純正の型番は5VL-H2131-01です。

f:id:bluepost69:20210220225601j:plain

webikeのポイントがたまってたのでwebikeで買えたらいいなと思って探してみたのですが、長さも書いてないよくわからないものしかありませんでした。せめて長さくらい書いてくれ。

仕方ないのでYBR125純正バンドの型番を調べて、検索に引っかかったyahooショッピングで純正品を買いました。300円しないものに送料が350円ついてしまいましたがやむをえません*2

純正なのでばっちりはまりました。ゴムなのでそのうちまた劣化して買うことになりそうですが、「次切れたときに売ってなかったら困るな」と消耗品を交換するたびに思ってしまいます。(逆)輸入車の宿命ですね。

代用できるもの

ホンダのXL250やスペイシー用のものが代用できるらしいです。ただこれも簡単には手に入らなさそうです。

blog.goo.ne.jp

固定できればと百均のサスペンダーで自作している人がいました。

minkara.carview.co.jp

*1:ちなみにCBRも固かったです。というかCBRはYBRより固かったです。

*2:なんかPayPayのキャンペーンで150円引いてもらえました。支払いはクレカでも効くというよくわからない感じ。

ムーンライトながらの思い出

ムーンライトながらがついに運行終了となった。

trafficnews.jp

おそらくネット中にながら葬式鉄がポエムを流していると思うが、自分も18きっぱーの一人として思っていることを書こうと思う。

乗車記録

2014年7月

大学の友人と乗った。友人との旅行だったのでブログ記事にはしていない。

初めて座席夜行に乗ったが、結構なんとかなった。そのときのメンバーとはいろいろあって疎遠になっている。

2015年7月

夜行列車でビールが飲みたかったので、往復ムーンライトながらで行って帰ってきた。

bluepost69.hatenablog.com

bluepost69.hatenablog.com

bluepost69.hatenablog.com

確かにムーンライトながらで飲むビールはうまかった。長距離列車で飲むビールはどんなにぬるくてもうまい。

でもよく考えると往復ながらはいくらなんでも頭がおかしいと思う。二度とやらない。

感想

  • 5回以上は乗ってると思っていたが、数えてみると3回しか乗ってなかった。
  • ビールがうまいというイメージしか出てこない。名産とかいうわけでもないのに。やばい。ビールはどの長距離列車で飲んでもうまい。
  • JR東海と東日本という2社をまたぐ列車であることや利益率が極めて悪い(基本18きっぱーしか乗らないので指定席料金しか取れない)ことから、早々になくなりそうな予感はしていた。むしろ2020年までよく持ったと思う。
  • 正直ダイヤはあまり便利でなかった。関西民は大垣や名古屋まで行くのが面倒くさい。せっかくなら大阪まで行ってほしかった。
  • JR西日本はがんばってWEST EXPRESS銀河を東海道本線で大阪~東京の夜行でやってほしい(無理)
    • でも今は稼ぎを得たので新幹線使っちゃう。
  • 今後の学生さんは安く鉄道旅行をする手段がまた一つ消えたので気の毒だなと思う。
    • 特にコロナ禍が学生時代にかぶってしまった世代はかわいそうだなと思う。彼らに今後大学時代ほど自由な時期は来るのだろうか。
    • 誰もがコロナで人生の重要な時間を制約されてしまっているのは同じ。話が脱線した。
    • とはいえ昔はLCCとかなかったので、ながらの有無はかわいそうかそうじゃないかという話ではない気がする。

考えが全くまとまらないが、鉄道のエポックがまた一つ変わったんだなあと思う。