From: Naohisa Goto Date: 2011-08-05T20:34:27+09:00 Subject: [ruby-dev:44356] [Ruby 1.9 - Bug #5160][Open] Float::INFINITY and Float::NAN incorrect in big endian architecture Issue #5160 has been reported by Naohisa Goto. ---------------------------------------- Bug #5160: Float::INFINITY and Float::NAN incorrect in big endian architecture http://redmine.ruby-lang.org/issues/5160 Author: Naohisa Goto Status: Open Priority: Normal Assignee: Naohisa Goto 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 にてチェックして必要な定義を行っている。) -- http://redmine.ruby-lang.org