diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 62078b9e53..5259fed066 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -1402,7 +1402,7 @@ Init_bigdecimal(void)
/* Computation mode */
rb_define_const(rb_cBigDecimal, "COMP_MODE",INT2FIX(VP_COMP_MODE));
rb_define_const(rb_cBigDecimal, "COMP_MODE_TRUNCATE",INT2FIX(VP_COMP_MODE_TRUNCATE));
- rb_define_const(rb_cBigDecimal, "COMP_MODE_ROUNDUP",INT2FIX(VP_COMP_MODE_ROUNDUP));
+ rb_define_const(rb_cBigDecimal, "COMP_MODE_ROUND",INT2FIX(VP_COMP_MODE_ROUNDUP));
rb_define_const(rb_cBigDecimal, "COMP_MODE_CEIL",INT2FIX(VP_COMP_MODE_CEIL));
rb_define_const(rb_cBigDecimal, "COMP_MODE_FLOOR",INT2FIX(VP_COMP_MODE_FLOOR));
rb_define_const(rb_cBigDecimal, "COMP_MODE_EVEN",INT2FIX(VP_COMP_MODE_EVEN));
@@ -3912,8 +3912,15 @@ VpPower(Real *y, Real *x, S_INT n)
Real *w2 = NULL;
if(VpIsZero(x)) {
- if(n<0) n = -n;
- VpSetZero(y,(n%2)?VpGetSign(x):(-VpGetSign(x)));
+ sign = VpGetSign(x);
+ if(n<0) {
+ n = -n;
+ if(sign<0) sign = (n%2)?(-1):(1);
+ VpSetInf (y,sign);
+ } else {
+ if(sign<0) sign = (n%2)?(-1):(1);
+ VpSetZero(y,sign);
+ }
goto Exit;
}
if(!VpIsDef(x)) {
diff --git a/ext/bigdecimal/bigdecimal_en.html b/ext/bigdecimal/bigdecimal_en.html
index ee3420ed5f..cfdff51f79 100644
--- a/ext/bigdecimal/bigdecimal_en.html
+++ b/ext/bigdecimal/bigdecimal_en.html
@@ -161,14 +161,14 @@ f = BigDecimal::mode(BigDecimal::COMP_MODE,flag)
where flag must be one of:
COMP_MODE_TRUNCATE | truncate |
-COMP_MODE_ROUNDUP | roundup,default |
+COMP_MODE_ROUND | round,default |
COMP_MODE_CEIL | ceil |
COMP_MODE_FLOOR | floor |
COMP_MODE_EVEN | Banker's rounding |
nil is returned if any argument is illegal.
The digit location for rounding operation can not be specified by mode method,
-use truncate/roundup/ceil/floor mthods for each instance instead.
+use truncate/round/ceil/floor mthods for each instance instead.
diff --git a/ext/bigdecimal/bigdecimal_ja.html b/ext/bigdecimal/bigdecimal_ja.html
index 3b4d3f3b10..0031f15144 100644
--- a/ext/bigdecimal/bigdecimal_ja.html
+++ b/ext/bigdecimal/bigdecimal_ja.html
@@ -170,10 +170,10 @@ EXCEPTION_NaN
f = BigDecimal::mode(BigDecimal::COMP_MODE,flag)
の形式で指定します。
-ここで、flag は以下の一つを指定します。
+ここで、flag は以下(括弧内は対応するインスタンスメソッド)の一つを指定します。
COMP_MODE_TRUNCATE | 全て切り捨てます(truncate)。 |
-COMP_MODE_ROUNDUP | 四捨五入します(roundup、デフォルト)。 |
+COMP_MODE_ROUND | 四捨五入します(round、デフォルト)。 |
COMP_MODE_CEIL | 数値の大きい方に繰り上げます(ceil)。 |
COMP_MODE_FLOOR | 数値の小さい方に繰り下げます(floor)。 |
COMP_MODE_EVEN | 四捨六入します。5の時は上位1桁が奇数の時のみ繰り上げます(Banker's rounding)。 |
@@ -181,7 +181,7 @@ f = BigDecimal::mode(BigDecimal::COMP_MODE,flag)
戻り値は指定前の flag の値です。
引数に正しくないものが指定された場合は nil が返ります。
mode メソッドでは丸め操作の位置をユーザが指定することはできません。
-丸め操作と位置を自分で制御したい場合は truncate/roundup/ceil/floor といった
+丸め操作と位置を自分で制御したい場合は truncate/round/ceil/floor といった
インスタンスメソッドを使用して下さい。
limit([n])