🍲
非数 や -0.0 は truthy?
これは何?
浮動小数点数を bool に変換できちゃう人たちが、0, -0.0, 非数 をどうするのか調べてみた。
調査結果
C / C++
たぶん、浮動小数点数としては「0 は falsy、それ以外は truthy」なので
下表の仕様になる。
値 | 0.0 | -0.0 | 非数 |
---|---|---|---|
結果 | false | false | true |
で、手元で実際そうだった。未定義動作とかでもないと思う。
Ruby
ruby は、nil
と false
以外全部 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
を見ると、数値としては 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