えぐち@エスアンドイー です。

>>> On Wed, 27 Jan 1999 18:00:25 +0900, SHUDO Kazuyuki <shudoh / muraoka.info.waseda.ac.jp> said:

shudoh> 首藤です。
shudoh> 
shudoh> こいつは厄介です。#でもなかなか興味深い。:)
...
shudoh> FPU 例外の内 3種がマスクされていないのは FreeBSD のポリシーでしょうか。
shudoh> このようにすぐに発現する問題が過去に議論されていないとは到底思えないです。
shudoh> 
shudoh> さて、ruby 開発側としてはこの問題をどう扱うべきなのでしょうか...

FreeBSD/i386 の浮動小数点例外の関する話題が、
http://www.jp.freebsd.org/ports-jp/ にありました。

==抜粋はじめ==
. FreeBSDの浮動小数点例外の扱いを他のUnixと同じにするには?

(FreeBSD-ports-jp/1993より) 

現在多くのシステムは浮動小数点例外を IEEE 754 で扱うのですが、
FreeBSD では旧来の SIGFPE を発生します。他のシステムでは、無限大 (Inf, -Inf)
なり非数値数 (NaN) を返して通常処理になるところが、 SIGFPE のデフォルト動作
はcore dump なので落ちます。 

FreeBSD で他のシステムの振舞に合わせる場合、次 のようなコードを main の入口
と出口に入れるといいかもしれません。 

    #ifdef __FreeBSD__
    #include <floatingpoint.h>
    #endif

    #ifdef __FreeBSD__
         /* allow divide by zero -- Inf */
        fpsetmask(fpgetmask() & ~(FP_X_DZ|FP_X_INV));
    #endif

         :

    #ifdef __FreeBSD__
        fpresetsticky(FP_X_DZ|FP_X_INV);
        fpsetmask(FP_X_DZ|FP_X_INV);
    #endif
==抜粋おわり==

と言う事で、これに基づくパッチを添付します。

#いまどきは、 alpha(AXP) な FreeBSD もあるので
#i386 であることをテストしないと、あれかもしれませんが、
#環境がないので、、~\(._.)/~

	えぐち

--- ../ruby-1.3.1-990201/main.c Tue Jan 26 19:08:13 1999 +++ ./main.c Mon Feb 1 19:13:58 1999 @@ -22,6 +22,10 @@ #include <console.h> #endif +#ifdef __FreeBSD__ +#include <floatingpoint.h> +#endif + int main(argc, argv, envp) int argc; @@ -34,8 +38,17 @@ argc = ccommand(&argv); #endif +#ifdef __FreeBSD__ + /* allow divide by zero -- Inf */ + fpsetmask(fpgetmask() & ~(FP_X_DZ|FP_X_INV)); +#endif + ruby_init(); ruby_options(argc, argv); ruby_run(); +#ifdef __FreeBSD__ + fpresetsticky(FP_X_DZ|FP_X_INV); + fpsetmask(FP_X_DZ|FP_X_INV); +#endif return 0; }