Bug #5160
Float::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 にてチェックして必要な定義を行っている。)
Associated revisions
- numeric.c (rb_infinity, rb_nan): use WORDS_BIGENDIAN to get endian. fix [Bug #5160]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32863 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
- numeric.c (rb_infinity, rb_nan): use WORDS_BIGENDIAN to get endian. fix [Bug #5160]
- numeric.c (rb_infinity, rb_nan): use WORDS_BIGENDIAN to get endian. fix [Bug #5160]
- numeric.c (rb_infinity, rb_nan): use WORDS_BIGENDIAN to get endian. fix [Bug #5160]
- numeric.c (rb_infinity, rb_nan): use WORDS_BIGENDIAN to get endian. fix [Bug #5160]
- numeric.c (rb_infinity, rb_nan): use WORDS_BIGENDIAN to get endian. fix [Bug #5160]
History
#1
Updated by ngoto (Naohisa Goto) over 6 years ago
- Status changed from Open to Closed
- % Done changed from 90 to 100
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@32863 b2dd03c8-39d4-4d8f-98ff-823fe69b080e