From: nobu.nakada@... Date: 2002-04-11T20:38:44+09:00 Subject: [ruby-dev:16850] Re: math.c 1.10 なかだです。 At Thu, 11 Apr 2002 17:47:39 +0900, Yukihiro Matsumoto wrote: > |(1.0/(1< | > |久しぶりだからこれでいいのかどうか…。 > > これをmissingに入れようかなあと思うのですが、DBL_MANT_DIGが > どこでも有効なのかとかfloat.hがあるのかとかを考えると頭痛い > です。「ないのが悪い」と素朴な実装にしちゃうほうがよいのかな > あ。 DBL_MANT_DIGってANSIにはありませんでしたっけ。まぁ、なくても多 少遅くなるケースが増えるだけで、とくに問題はないと思いますが。 あと、log(0)はEDOMじゃないし。 --- missing/acosh.c~ Thu Apr 11 17:10:46 2002 +++ missing/acosh.c Thu Apr 11 20:33:49 2002 @@ -2,6 +2,10 @@ #include -#define BIG_CRITERIA (1.0*(1<<(DBL_MANT_DIG/2+2))) +#ifdef DBL_MANT_DIG +#define BIG_CRITERIA (1.0*(1<<(DBL_MANT_DIG/2+1))) #define SMALL_CRITERIA (1.0/(1< BIG_CRITERIA) x += x; +#endif + else + x += sqrt((x + 1) * (x - 1)); return log(x); } --- missing/asinh.c~ Thu Apr 11 17:51:48 2002 +++ missing/asinh.c Thu Apr 11 20:33:40 2002 @@ -3,6 +3,10 @@ #include -#define BIG_CRITERIA (1.0*(1<<(DBL_MANT_DIG/2+2))) +#ifdef DBL_MANT_DIG +#define BIG_CRITERIA (1.0*(1<<(DBL_MANT_DIG/2+1))) #define SMALL_CRITERIA (1.0/(1< BIG_CRITERIA) { + z = log(z + z); + } +#endif else { - z = log(z + (z > BIG_CRITERIA ? z : sqrt(z * z + 1))); + z = log(z + sqrt(z * z + 1)); } if (neg) z = -z; --- missing/atanh.c~ Thu Apr 11 17:05:38 2002 +++ missing/atanh.c Thu Apr 11 20:33:31 2002 @@ -3,6 +3,10 @@ #include -#define BIG_CRITERIA (1.0*(1<<(DBL_MANT_DIG/2+2))) +#ifdef DBL_MANT_DIG +#define BIG_CRITERIA (1.0*(1<<(DBL_MANT_DIG/2+1))) #define SMALL_CRITERIA (1.0/(1< 1 ? 0 : (1 + z) / (1 - z)) / 2; + z = log(z > 1 ? -1 : (1 + z) / (1 - z)) / 2; } if (neg) z = -z; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦