|
22 | 22 | # atanh(x, prec) |
23 | 23 | # log2 (x, prec) |
24 | 24 | # log10(x, prec) |
| 25 | +# log1p(x, prec) |
| 26 | +# expm1(x, prec) |
25 | 27 | # PI (prec) |
26 | 28 | # E (prec) == exp(1.0,prec) |
27 | 29 | # |
@@ -524,6 +526,49 @@ def log10(x, prec) |
524 | 526 | v.mult(1, prec) |
525 | 527 | end |
526 | 528 |
|
| 529 | + # call-seq: |
| 530 | + # BigMath.log1p(decimal, numeric) -> BigDecimal |
| 531 | + # |
| 532 | + # Computes log(1 + decimal) to the specified number of digits of precision, +numeric+. |
| 533 | + # |
| 534 | + # BigMath.log1p(BigDecimal('0.1'), 32).to_s |
| 535 | + # #=> "0.95310179804324860043952123280765e-1" |
| 536 | + # |
| 537 | + def log1p(x, prec) |
| 538 | + BigDecimal::Internal.validate_prec(prec, :log1p) |
| 539 | + x = BigDecimal::Internal.coerce_to_bigdecimal(x, prec, :log1p) |
| 540 | + raise Math::DomainError, 'Out of domain argument for log1p' if x < -1 |
| 541 | + |
| 542 | + return BigMath.log(x + 1, prec) |
| 543 | + end |
| 544 | + |
| 545 | + # call-seq: |
| 546 | + # BigMath.expm1(decimal, numeric) -> BigDecimal |
| 547 | + # |
| 548 | + # Computes exp(decimal) - 1 to the specified number of digits of precision, +numeric+. |
| 549 | + # |
| 550 | + # BigMath.expm1(BigDecimal('0.1'), 32).to_s |
| 551 | + # #=> "0.10517091807564762481170782649025e0" |
| 552 | + # |
| 553 | + def expm1(x, prec) |
| 554 | + BigDecimal::Internal.validate_prec(prec, :expm1) |
| 555 | + x = BigDecimal::Internal.coerce_to_bigdecimal(x, prec, :expm1) |
| 556 | + return BigDecimal(-1) if x.infinite? == -1 |
| 557 | + |
| 558 | + exp_prec = prec |
| 559 | + if x < -1 |
| 560 | + # log10(exp(x)) = x * log10(e) |
| 561 | + lg_e = 0.4342944819032518 |
| 562 | + exp_prec = prec + (lg_e * x).ceil + 2 |
| 563 | + elsif x < 1 |
| 564 | + exp_prec = prec - x.exponent + 2 |
| 565 | + else |
| 566 | + exp_prec = prec |
| 567 | + end |
| 568 | + exp_prec > 0 ? BigMath.exp(x, exp_prec).sub(1, prec) : BigDecimal(-1) |
| 569 | + end |
| 570 | + |
| 571 | + |
527 | 572 | # call-seq: |
528 | 573 | # PI(numeric) -> BigDecimal |
529 | 574 | # |
|
0 commit comments