Bug #5160
closedFloat::INFINITY and Float::NAN incorrect in big endian architecture
Description
Big endian のCPUで、BYTE_ORDER が定義(#define)されておらず、かつ、INFINITY や NAN が未定義の環境では、Float::INFINITY および Float::NAN の値が化けてしまいます。(このため、make test-all でいくつかFが出ます。)
具体的には sparc Solaris 10 + gcc 4.4 で発生します。
% ./miniruby -v -e 'p Float::INFINITY; p Float::NAN'
ruby 1.9.3dev (2011-08-05) [sparc-solaris2.10]
4.609571298396486e-41
6.905458702346266e-41
上記の値をどうにかしてバイト列に戻すと、見事に逆順であるのがわかります。
numeric.c 内では、以下のように byte order をチェックしていますが、
#elif BYTE_ORDER == LITTLE_ENDIAN
BYTE_ORDER と LITTLE_ENDIAN の両方が未定義のときは、CPUが何であっても little endian 扱いされてしまいます。
解決策としては、configureでbig endianか否かをチェックを行っていて、big endianの場合のみ config.hに定義されるマクロ
#define WORDS_BIGENDIAN 1
があるので、これを利用するように変更したいと思います。
numeric.c 以外で BYTE_ORDER を直接使っている場所はなさそうでした。
(ext/digest/sha2/ では使っているが、sha2.h 内で #ifdef WORDS_BIGENDIAN にてチェックして必要な定義を行っている。)
Files