概要

親愛なるルームメイト「マイナスゼロってあるんですか?」

緑さん「ええ? 無いだろ? ゼロは負の数でも正の数でも無いでしょ」

Python さん「あるで」

キタキタ。プログラミングで遊んでて、こういうのが一番楽しいんだから。1日1 Python のお時間です。

 

float 型のゼロにはマイナスがある

ほうら。 float0.0 にマイナスをくっつけることができるぜ。

python -V
# Python 3.10.12

python -c 'print(0.0 * -1)'
# -0.0

python -c 'print(0 / -1)'
# -0.0

-0.00.0 と等価だけど、同一ではないぜ。

python -c 'print(-0.0 == 0.0)'
# True

python -c 'print(-0.0 is 0.0)'
# SyntaxWarning: "is" with a literal. Did you mean "=="?
# False

is は普通 bool とか None について使うものだから、 Python ちゃんは warning をくれているな。でも今回の場合 ==is では結果が違うのだから、使い分ける意義はあるじゃねーか Python ちゃんよォ〜〜?

逆に、 -0.00.0 にしたいときは、 0.0 を足したり -0.0 を掛けたりすればいいぜ。これは普通の整数と同じだね。

python -c 'print(-0.0 + 0.0)'
0.0

python -c 'print(-0.0 * -0.0)'
0.0

 

なんで?

float 、つまり浮動小数点数は、以下の構造から出来ている。

  • 符号 (正か負か)
  • 仮数部 (なんか説明しづらいけど以下の A 部分)
  • 指数部 (なんか説明しづらいけど以下の B 部分)
-12.34 = -, 1.234, 10**1 = 符号, 仮数部, 10**指数部

だから、符号にマイナスが来るような計算をすると、マイナスがきっちり残るということらしいぜ。ふーん。こういうのが一番楽しいんだよな……。