Project

General

Profile

Actions

Bug #5160

closed

Float::INFINITY and Float::NAN incorrect in big endian architecture

Added by ngoto (Naohisa Goto) over 12 years ago. Updated over 12 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 1.9.3dev (2011-08-05) [sparc-solaris2.10]
Backport:
[ruby-dev:44356]

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

infinity-nan-bigendian.patch (660 Bytes) infinity-nan-bigendian.patch ngoto (Naohisa Goto), 08/05/2011 08:33 PM
Actions

Also available in: Atom PDF

Like0
Like0