🍲

非数 や -0.0 は truthy?

に公開

これは何?

浮動小数点数を bool に変換できちゃう人たちが、0, -0.0, 非数 をどうするのか調べてみた。

調査結果

C / C++

たぶん、浮動小数点数としては「0 は falsy、それ以外は truthy」なので

下表の仕様になる。

0.0 -0.0 非数
結果 false false true

で、手元で実際そうだった。未定義動作とかでもないと思う。

Ruby

ruby は、nilfalse 以外全部 truthy なので

0.0 -0.0 非数
結果 true true true

となる。

Python

数値としては「0 は falsy、それ以外は truthy」なので

Python3.13
[[x,bool(x)] for x in [ 0.0, -0.0, float("nan") ]]
#=> [[0.0, False], [-0.0, False], [nan, True]]

となる。

ということで、C / C++ と同じ。

JavaScript

https://tc39.es/ecma262/#sec-toboolean
を見ると、数値としては 0 と非数が falsy なので

0.0 -0.0 非数
結果 false false false

となる。手元で試してもそうだった。

Perl 5

shell
$ perl -e '$a=1e999-1e999;printf("%f %s\n", $a, ($a ? "T" : "F") );'
NaN T

等として調べたら、C / C++ と同じだった。

仕様は確認していない。

PHP

ideone で

php 7.3.5
echo (-1e-200*1e-200 ? "T" : "F");

などとして確認したら

0.0 -0.0 非数
結果 false false false

だった。
仕様は確認していない。

Lua

Lua は Ruby と同じく「nil と false 以外 truthy」らしいので

0.0 -0.0 非数
結果 true true true

となる。

まとめ

今のところ下表の感じ。

言語\値 0.0 -0.0 非数 補足
Ruby・Lua true true true 数値は truthy
JavaScript・PHP false false false 0 と 非数は falsy
上記以外 false false true 0 が truthy

私は Ruby・Lua の「nil と false 以外 truthy」方式が好き。

どこかに

  • 整数の 0 は falsy だけど 浮動小数点数の 0 は truty
  • 浮動小数点数の普通の 0.0 は falsy だけど、負の0 は truthy

みたいな言語・処理系がありそうなもんだと思ってるんだけど、みつからなかった。

あと、この件で JavaScrpit と PHP が少数派なのも知らなかった。調べてみるもんだね。

Discussion