[#1582] [BUG] Regexp — sinara@...

原です。あけましておめでとうございます。

16 messages 1997/01/06

[#1705] 正規表現 単独の ? — Sinichiro Dezawa <dezawa@...>

出沢です

14 messages 1997/01/15

[#1771] rectangle of canvas widget — Noritugu Nakamura <nnakamur@...>

18 messages 1997/01/19

[#1788] Text of TkCanvas — Noritugu Nakamura <nnakamur@...>

28 messages 1997/01/20
[#1800] Re: Text of TkCanvas — matz@... (Yukihiro Matsumoto) 1997/01/21

まつもと ゆきひろです.

[#1802] Re: Text of TkCanvas — Noritugu Nakamura <nnakamur@...> 1997/01/21

[#1806] Re: Text of TkCanvas — matz@... (Yukihiro Matsumoto) 1997/01/22

まつもと ゆきひろです.

[#1816] Re: Text of TkCanvas — Noritugu Nakamura <nnakamur@...> 1997/01/22

[#1819] Re: Text of TkCanvas — matz@... (Yukihiro Matsumoto) 1997/01/22

まつもと ゆきひろです.

[#1865] ruby-1.0-960124 available — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

25 messages 1997/01/24
[#1878] Re: ruby-1.0-960124 available — WATANABE Hirofumi <watanabe@...> 1997/01/27

わたなべです.

[#1879] Re: ruby-1.0-960124 available — matz@... (Yukihiro Matsumoto) 1997/01/27

まつもと ゆきひろです.

[#1880] Re: ruby-1.0-960124 available — WATANABE Hirofumi <watanabe@...> 1997/01/27

わたなべです.

[#1890] Re: ruby-1.0-960124 available — matz@... (Yukihiro Matsumoto) 1997/01/27

まつもと ゆきひろです.

[#1926] [Dist] Mutex module — keiju@... (Keiju ISHITSUKA)

けいじゅ@SHLジャパンです.

81 messages 1997/01/28
[#1929] Re: [Dist] Mutex module — matz@... (Yukihiro Matsumoto) 1997/01/29

まつもと ゆきひろです.

[#1934] Re: [Dist] Mutex module 1997/01/29

けいじゅ@SHLジャパンです.

[#1935] Re: [Dist] Mutex module — matz@... (Yukihiro Matsumoto) 1997/01/29

まつもと ゆきひろです.

[#1938] Re: [Dist] Mutex module 1997/01/29

けいじゅ@SHLジャパンです.

[#1940] Re: [Dist] Mutex module — matz@... (Yukihiro Matsumoto) 1997/01/29

まつもと ゆきひろです.

[#1944] Re: [Dist] Mutex module 1997/01/29

けいじゅ@SHLジャパンです.

[#1947] Re: [Dist] Mutex module — matz@... (Yukihiro Matsumoto) 1997/01/29

まつもと ゆきひろです.

[#1960] Re: [Dist] Mutex module — sinara@... 1997/01/30

原です。

[#1969] Re: [Dist] Mutex module 1997/01/30

けいじゅ@SHLジャパンです.

[#1978] Re: [Dist] Mutex module — sinara@... 1997/01/30

原です。

[#1986] Re: [Dist] Mutex module 1997/01/30

けいじゅ@SHLジャパンです.

[#1989] Array as list/tupple (Re: [Dist] Mutex module) — matz@... (Yukihiro Matsumoto) 1997/01/31

まつもと ゆきひろです.

[#2008] [Request] static var? (Re: Array as list/tupple) — sinara@... 1997/01/31

原です。

[#1953] open (file descriptor) — j_kuro@... (Jun Kuroda)

黒田です.

16 messages 1997/01/29

[ruby-list:1871] None

From: (Dezawa Shin-ichiro) <dezawa@...>
Date: 1997-01-25 09:48:43 UTC
List: ruby-list #1871
でざわです

bignum に sqrt 作ってみました。

で、テストしていて気づいたのですが bignum が 32bit を切ると
Fixnum に変わってしまうんですね。
c=200000000000000; c.sqrt は通るが (c/100000000000).sqrt は
	 undefined local variable or method `sqrt' for 2000(Fixnum)
はて、
すべての Numneric に作る必要がでてきた、、。
と言うことで、Fixnum と Float にも作りました。

Known BUG:
	負の Fixnum を sqrt しても エラーにならない。

次の warning が出ます。

bignum.c:1260: warning: assignment makes pointer from integer without a cast
bignum.c:1263: warning: assignment makes pointer from integer without a cast

bignum な x を x>>1 するにはどうするのが正しい作法?

	    x = big_rshift(x, INT2FIX(1) );

--- bignum.c.orig	Sat Jan 25 09:47:03 1997
+++ bignum.c	Sat Jan 25 18:11:01 1997
@@ -1,3 +1,4 @@
+#include <stdio.h>
 /************************************************
 
   bignum.c -
@@ -1215,6 +1216,55 @@
     return INT2FIX(big->len*2);
 }
 
+static VALUE
+big_sqrt(x)
+    struct RBignum *x;
+{
+    struct RBignum *z;
+    USHORT *zds, *xds;
+    unsigned long y, a;
+    UINT len, sqrt_len, iz, ix , j ;
+    UINT mask;
+  
+  /* 符号確認*/
+    if (x->sign == 0)ArgError("square root for negative number");
+
+  /* <= 2^32 */
+    /* あり得ない */
+  /* 正規化 2^30 <=  < 2^32 にする*/
+    xds = BDIGITS(x);
+    iz = sqrt_len;  ix = x->len;
+    y = ((long)xds[x->len-1])<<16 ;
+    j=16;
+    mask = ~0177777 ; /* 0011 1111 1111 1111  or 0111 1111 1111 1111 */
+    while ( y & mask ){
+      j -= 2; y >>=2;      /* j bits 左shift した */
+    }
+    y = (y << 16) + (((long)xds[x->len-2])<<j)
+             + (( (xds[x->len-3])<<j & 0377 )>>16 );
+
+    /* 初期値 */
+    a = 143257 - 202860544/(1582+( y >>22));
+    a = a << ( 16 - (j>>1)); 
+    sqrt_len = (( x->len+1) >>1) ;
+    z = (struct RBignum*)bignew( sqrt_len, 1);
+    zds = BDIGITS(z);
+    zds[sqrt_len-1] = a>>16; zds[sqrt_len - 2 ] = a & 0177777;
+   
+    /* 精度計算 */
+    iz = (x->len *16 - j)>>1 ;
+    
+    /* Newton (until j * 2^i > iz ) */
+    /* X(i+1) = (X(i)^2 + Y)/2X(i) --> = X(i)>>1 + (Y>>1)/X(i)  */
+    /* x = x>>1 */
+    x = big_rshift(x, INT2FIX(1) );
+    for(j=15; j < iz; j = j<<1){
+      /* z = ( z >> 1 )             + ( x >> 1 )/z */
+      z = big_plus(big_rshift(z, INT2FIX(1)), big_div( x,z) );
+    }
+    return bignorm(z);
+}
+
 void
 Init_Bignum()
 {
@@ -1246,4 +1296,6 @@
     rb_define_method(cBignum, "to_f", big_to_f, 0);
     rb_define_method(cBignum, "abs", big_abs, 0);
     rb_define_method(cBignum, "size", big_size, 0);
+    rb_define_method(cBignum, "sqrt", big_sqrt, 0);
+
 }
*** numeric.c.orig      Sat Jan 25 09:44:25 1997
--- numeric.c   Sat Jan 25 18:41:49 1997
***************
*** 1040,1045 ****
--- 1040,1065 ----
      }
      return num;
  }
+ static VALUE
+ flo_sqrt(flt)
+     struct RFloat *flt;
+ {
+     double val = flt->value;
+     if (val < 0.0) ArgError("square root for negative number");
+     return float_new(sqrt(val));
+ }
+ static VALUE
+ fix_sqrt(fix)
+     VALUE fix;
+ {
+   double dbl;
+   fix = FIX2INT(fix) ;
+   if ( fix < 0 ) ArgError("square root for negative number");
+   dbl = fix;
+   fix = sqrt(dbl)+0.5 ;
+   fix =INT2FIX(fix) ;
+   return fix ;
+ }
  
  extern VALUE mComparable;
  extern VALUE eException;
***************
*** 1138,1141 ****
--- 1158,1163 ----
      rb_define_method(cFloat, "to_i", flo_to_i, 0);
      rb_define_method(cFloat, "to_f", flo_to_f, 0);
      rb_define_method(cFloat, "abs", flo_abs, 0);
+     rb_define_method(cFloat, "sqrt", flo_sqrt, 0);
+     rb_define_method(cFixnum, "sqrt", fix_sqrt, 0);
  }

In This Thread

Prev Next