[#9581] SIGFPE isn't raised on FreeBSD 4.0 — gotoken@... (GOTO Kentaro)

ごとけんです

18 messages 2000/04/18
[#9582] Re: SIGFPE isn't raised on FreeBSD 4.0 — ARIMA Yasuhiro <fit0298@...> 2000/04/18

有馬です。

[#9583] Re: SIGFPE isn't raised on FreeBSD 4.0 — EGUCHI Osamu <eguchi@...> 2000/04/18

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

[ruby-dev:9594] Re: SIGFPE isn't raised on FreeBSD 4.0

From: ARIMA Yasuhiro <fit0298@...>
Date: 2000-04-18 13:44:18 UTC
List: ruby-dev #9594
有馬です。

nobu.nakada@nifty.ne.jp wrote

| At Tue, 18 Apr 2000 17:53:52 +0900,
| matz@netlab.co.jp (Yukihiro Matsumoto) wrote:
| > |> ですよね。だとすると、この程度なら__FreeBSD__埋め込みでもか
| > |> えって分かりやすい気がするのは私だけ?
| > |
| > |  FreeBSD でもバージョンで違うとか、他の環境も考えなきゃいけないとかだ
| > |と分けてしまった方がいいような気がするんですが。
| > 
| > 他の環境も考えねばならんでしょう。バージョンでも違うでしょう。

まず、FreeBSD 固有の問題としてとらえるなら、バージョンの違いで
動作を変えるという対策は有効だと思います。
特に問題がなければ、1.4系、1.5系ともこの対処をお願いします。

  #if defined __FreeBSD__ && __FreeBSD__ < 4
  #  include <floatingpoint.h>
  #endif

  #if defined __FreeBSD__ && __FreeBSD__ < 4
      /* allow divide by zero -- Inf */
      fpsetmask(fpgetmask() & ~(FP_X_DZ|FP_X_INV|FP_X_OFL));
  #endif

次に問題の本質の方ですが、どうしていいものやらよくわかりません。

|   fpsetmask() というのは BSD 系では結構一般的なようなので、Free BSD 限
| 定よりももうちょっと一般的かなと。

ちなみに(ちなんでどうするつもりだ?)手近な SunOS 5.5.1 で
man fpsetmask してみました。以下のものが使えます。

関数
     #include <ieeefp.h>
     fp_rnd fpgetround(void);
     fp_rnd fpsetround(fp_rnd rnd_dir);
     fp_except fpgetmask(void);
     fp_except fpsetmask(fp_except mask);
     fp_except fpgetsticky(void);
     fp_except fpsetsticky(fp_except sticky);

     FP_X_INV      /* invalid operation exception */
     FP_X_OFL      /* overflow exception */
     FP_X_UFL      /* underflow exception */
     FP_X_DZ       /* divide-by-zero exception */
     FP_X_IMP      /* imprecise (loss of precision) */

     FP_RN         /* round to nearest representative number */
     FP_RP         /* round to plus infinity */
     FP_RM         /* round to minus infinity */
     FP_RZ         /* round to zero (truncate) */

--
 有馬 康弘 <fit0298@fitec.co.jp>

In This Thread