[Ruby 1.9 - Bug #5160][Open] Float::INFINITY and Float::NAN incorrect in big endian architecture

Issue #5160 has been reported by Naohisa G…


Bug #5160: Float::INFINITY and Float::NAN incorrect in big endian
architecture

Author: Naohisa G.
Status: Open
Priority: Normal
Assignee: Naohisa G.
Category:
Target version: 1.9.3
ruby -v: ruby 1.9.3dev (2011-08-05) [sparc-solaris2.10]

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
にてチェックして必要な定義を行っている。)