$ ruby -ve 'p Math.cbrt(1.0-2**-52)'
ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]
0.9999999999999999
かぼー
@nagachika 小飼さんのツイート https://twitter.com/dankogai/status/1004180513228124161 でMath.cbrt(1.0-2**-52)がLinuxのRubyだと正答の0.9999999999999998ではなく1.0000000000000002が返ってくるとあって試してみました。
下記は正答:
ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]
ruby 2.3.6p384 (2017-12-14 revision 61254) [x86_64-netbsd]
ruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-netbsd]
下記は誤答でした
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
@zundan なるほど。Linux では今のところ正答になるバージョンはみつかってないわけですね。
@nagachika 全タイムライン的にそのようです。https://twitter.com/anohana/status/1004192539379884033 によるとLinuxではCのcbrt()が1を超えちゃうとか。
@zundan 最適化オプションで違うのか〜。ま、そうだろうなと思いました(後出し)
@nagachika Apple LLVM version 9.1.0 (clang-902.0.39.2)だと-O0から-O3までどれでも0.99999999999999989になりますねー(出先でglibcとgccが手元にない)
@zundan おそらく Linux というより glibc に依るんでしょうね。といいつつわたしも今ぱっと試す環境がない。
@nagachika ですねー。NetBSD 8.0_RC1 amd64でgcc (nb2 20150115) 4.8.4だと-O0から-O3まで正答でした。
$ ldd a.out
a.out:
-lm.0 => /usr/lib/libm.so.0
-lgcc_s.1 => /usr/lib/libgcc_s.so.1
-lc.12 => /usr/lib/libc.so.12
$ ls -l /usr/lib/libc.so.12
lrwxr-xr-x 1 root wheel 26 Sep 24 2015 /usr/lib/libc.so.12@ -> ../../lib/libc.so.12.193.1
(ライブラリのバージョンのみかたがわからにゃい)
@nagachika 見るべきはlibmですね
ls -l /usr/lib/libm.so.0
lrwxr-xr-x 1 root wheel 22 Sep 24 2015 /usr/lib/libm.so.0@ -> ../../lib/libm.so.0.11
@nagachika コンパイル時に計算定数は正答だけどcbrt()じたいは誤答のようです https://twitter.com/anohana/status/1004195971322994688