long-decimal 0.00.20 → 0.00.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. data/README +32 -31
  2. data/Rakefile +1 -1
  3. data/VERSION +1 -1
  4. data/doc/classes/LongDecimal.src/M000088.html +1 -1
  5. data/doc/classes/LongDecimal.src/M000089.html +1 -1
  6. data/doc/classes/LongDecimal.src/M000090.html +1 -1
  7. data/doc/classes/LongDecimal.src/M000091.html +1 -1
  8. data/doc/classes/LongDecimal.src/M000092.html +1 -1
  9. data/doc/classes/LongDecimal.src/M000093.html +1 -1
  10. data/doc/classes/LongDecimal.src/M000096.html +1 -1
  11. data/doc/classes/LongDecimal.src/M000097.html +1 -1
  12. data/doc/classes/LongDecimal.src/M000098.html +1 -1
  13. data/doc/classes/LongDecimal.src/M000099.html +1 -1
  14. data/doc/classes/LongDecimal.src/M000100.html +1 -1
  15. data/doc/classes/LongDecimal.src/M000101.html +1 -1
  16. data/doc/classes/LongDecimalBase.html +53 -53
  17. data/doc/classes/LongDecimalBase.src/M000105.html +4 -4
  18. data/doc/classes/LongDecimalBase.src/M000106.html +4 -4
  19. data/doc/classes/LongDecimalBase.src/M000107.html +4 -4
  20. data/doc/classes/LongDecimalBase.src/M000108.html +4 -4
  21. data/doc/classes/LongDecimalBase.src/M000109.html +4 -4
  22. data/doc/classes/LongDecimalBase.src/M000110.html +4 -9
  23. data/doc/classes/LongDecimalBase.src/M000113.html +9 -5
  24. data/doc/classes/LongDecimalBase.src/M000114.html +5 -4
  25. data/doc/classes/LongDecimalQuot.src/M000003.html +1 -1
  26. data/doc/classes/LongDecimalQuot.src/M000004.html +1 -1
  27. data/doc/classes/LongDecimalQuot.src/M000005.html +1 -1
  28. data/doc/classes/LongDecimalQuot.src/M000006.html +1 -1
  29. data/doc/classes/LongDecimalQuot.src/M000007.html +1 -1
  30. data/doc/classes/LongDecimalQuot.src/M000008.html +1 -1
  31. data/doc/classes/LongDecimalQuot.src/M000009.html +1 -1
  32. data/doc/classes/LongDecimalQuot.src/M000010.html +1 -1
  33. data/doc/classes/LongDecimalQuot.src/M000011.html +1 -1
  34. data/doc/classes/LongDecimalQuot.src/M000012.html +1 -1
  35. data/doc/classes/LongDecimalQuot.src/M000013.html +1 -1
  36. data/doc/classes/LongDecimalQuot.src/M000014.html +1 -1
  37. data/doc/classes/LongDecimalQuot.src/M000015.html +1 -1
  38. data/doc/classes/LongDecimalQuot.src/M000016.html +1 -1
  39. data/doc/classes/LongDecimalQuot.src/M000017.html +1 -1
  40. data/doc/classes/LongDecimalQuot.src/M000018.html +1 -1
  41. data/doc/classes/LongDecimalQuot.src/M000019.html +1 -1
  42. data/doc/classes/LongDecimalQuot.src/M000020.html +1 -1
  43. data/doc/classes/LongDecimalQuot.src/M000021.html +1 -1
  44. data/doc/classes/LongDecimalQuot.src/M000022.html +1 -1
  45. data/doc/classes/LongDecimalQuot.src/M000023.html +1 -1
  46. data/doc/classes/LongDecimalQuot.src/M000024.html +1 -1
  47. data/doc/classes/LongDecimalQuot.src/M000025.html +1 -1
  48. data/doc/classes/LongDecimalQuot.src/M000026.html +1 -1
  49. data/doc/classes/LongDecimalQuot.src/M000027.html +1 -1
  50. data/doc/classes/LongDecimalQuot.src/M000028.html +1 -1
  51. data/doc/classes/LongDecimalQuot.src/M000029.html +1 -1
  52. data/doc/classes/LongDecimalQuot.src/M000032.html +1 -1
  53. data/doc/classes/LongDecimalQuot.src/M000033.html +1 -1
  54. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +10 -10
  55. data/doc/classes/LongMath.html +170 -151
  56. data/doc/classes/LongMath.src/M000116.html +5 -4
  57. data/doc/classes/LongMath.src/M000117.html +4 -4
  58. data/doc/classes/LongMath.src/M000118.html +4 -5
  59. data/doc/classes/LongMath.src/M000119.html +5 -4
  60. data/doc/classes/LongMath.src/M000120.html +4 -18
  61. data/doc/classes/LongMath.src/M000121.html +14 -14
  62. data/doc/classes/LongMath.src/M000122.html +18 -5
  63. data/doc/classes/LongMath.src/M000123.html +5 -29
  64. data/doc/classes/LongMath.src/M000124.html +29 -5
  65. data/doc/classes/LongMath.src/M000125.html +5 -56
  66. data/doc/classes/LongMath.src/M000126.html +55 -19
  67. data/doc/classes/LongMath.src/M000127.html +20 -35
  68. data/doc/classes/LongMath.src/M000128.html +36 -6
  69. data/doc/classes/LongMath.src/M000129.html +6 -33
  70. data/doc/classes/LongMath.src/M000130.html +26 -41
  71. data/doc/classes/LongMath.src/M000131.html +46 -6
  72. data/doc/classes/LongMath.src/M000132.html +8 -4
  73. data/doc/classes/LongMath.src/M000133.html +4 -4
  74. data/doc/classes/LongMath.src/M000134.html +4 -64
  75. data/doc/classes/LongMath.src/M000135.html +59 -38
  76. data/doc/classes/LongMath.src/M000136.html +41 -8
  77. data/doc/classes/LongMath.src/M000137.html +4 -7
  78. data/doc/classes/LongMath.src/M000138.html +4 -20
  79. data/doc/classes/LongMath.src/M000139.html +4 -17
  80. data/doc/classes/LongMath.src/M000140.html +11 -34
  81. data/doc/classes/LongMath.src/M000141.html +14 -199
  82. data/doc/classes/LongMath.src/M000142.html +40 -16
  83. data/doc/classes/LongMath.src/M000143.html +211 -8
  84. data/doc/classes/LongMath.src/M000144.html +16 -41
  85. data/doc/classes/LongMath/CacheKey.html +5 -5
  86. data/doc/classes/Numeric.html +18 -0
  87. data/doc/classes/Numeric.src/M000102.html +1 -1
  88. data/doc/classes/Rational.html +5 -5
  89. data/doc/created.rid +1 -1
  90. data/doc/files/lib/long-decimal_rb.html +2 -2
  91. data/doc/files/lib/long-decimal_rb.src/M000001.html +1 -1
  92. data/doc/files/lib/long-decimal_rb.src/M000002.html +1 -1
  93. data/doc/fr_method_index.html +61 -59
  94. data/lib/long-decimal.rb +173 -80
  95. data/test/testlongdecimal.rb +258 -58
  96. metadata +2 -2
@@ -2,8 +2,8 @@
2
2
  #
3
3
  # testlongdecimal.rb -- runit test for long-decimal.rb
4
4
  #
5
- # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/test/testlongdecimal.rb,v 1.25 2006/04/02 15:52:27 bk1 Exp $
6
- # CVS-Label: $Name: PRE_ALPHA_0_20 $
5
+ # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/test/testlongdecimal.rb,v 1.28 2006/04/05 23:33:54 bk1 Exp $
6
+ # CVS-Label: $Name: PRE_ALPHA_0_21 $
7
7
  # Author: $Author: bk1 $ (Karl Brodowsky)
8
8
  #
9
9
 
@@ -18,17 +18,17 @@ load "lib/long-decimal.rb"
18
18
  #
19
19
  class TestLongDecimal_class < RUNIT::TestCase
20
20
 
21
- @RCS_ID='-$Id: testlongdecimal.rb,v 1.25 2006/04/02 15:52:27 bk1 Exp $-'
21
+ @RCS_ID='-$Id: testlongdecimal.rb,v 1.28 2006/04/05 23:33:54 bk1 Exp $-'
22
22
 
23
23
  #
24
24
  # convenience method for comparing two numbers. true if and only if
25
- # they express the same value
25
+ # they express the same value
26
26
  #
27
27
  def assert_val_equal(expected, actual, message="")
28
28
  _wrap_assertion {
29
29
  full_message = build_message(message, "Expected <?> to match <?>", actual, expected)
30
30
  assert_block(full_message) {
31
- (expected <=> actual).zero?
31
+ (expected <=> actual).zero?
32
32
  }
33
33
  }
34
34
  end
@@ -514,7 +514,7 @@ class TestLongDecimal_class < RUNIT::TestCase
514
514
  # helper method for test_log
515
515
  # tests if log(x) with precision prec is calculated correctly
516
516
  #
517
- def check_log_floated(x, prec)
517
+ def check_log_floated(x, prec, divisor=1e9, summand=0)
518
518
 
519
519
  # make sure x is LongDecimal
520
520
  x0 = x
@@ -528,25 +528,26 @@ class TestLongDecimal_class < RUNIT::TestCase
528
528
  xf = x.to_f
529
529
  if (xf > 0) then
530
530
  z = Math.log(x.to_f)
531
- yf = y.to_f
532
- assert((yf - z).abs / [yf.abs, z.abs, Float::MIN].max < 1e-9, "y=#{yf.to_s} and z=#{z.to_s} should be almost equal x=#{x}")
531
+ zl = z.to_ld(y.scale)
532
+ delta = [ y.unit, z.abs / divisor + summand ].max
533
+ assert((y - zl).abs <= delta, "y=#{y.to_s} (#{y.to_f}) and z=#{z.to_s} (#{zl.to_f}) should be almost equal (d=#{delta} x=#{x} y=#{y})")
533
534
  end
534
535
  end
535
536
 
536
- # check by taking exp(log(x))
537
+ # check by taking exp(log(y))
537
538
  # we have to take into account that we might not have enough
538
539
  # significant digits, so we have to go down with the precision
539
540
  if (y <= LongMath::MAX_EXP_ABLE) then
540
- eprec = prec
541
+ eprec = prec-1
541
542
  if (y > 1) then
542
- lx = 0
543
- if (x > LongMath::MAX_FLOATABLE) then
544
- puts("unusual x=#{x} y=#{y}\n")
545
- lx = LongMath::MAX_EXP_ABLE
543
+ ly = 0
544
+ if (y > LongMath::MAX_FLOATABLE) then
545
+ puts("unusual y=#{y} y=#{y}\n")
546
+ ly = LongMath::MAX_EXP_ABLE
546
547
  else
547
- lx = Math.log(x.to_f)
548
+ ly = Math.log(y.to_f)
548
549
  end
549
- l10 = (lx / Math.log(10)).ceil
550
+ l10 = (ly / Math.log(10)).ceil
550
551
  eprec = [ eprec - l10, 0 ].max
551
552
  end
552
553
 
@@ -557,8 +558,8 @@ class TestLongDecimal_class < RUNIT::TestCase
557
558
  # check by doing calculation with different internal rounding modes. They should not differ.
558
559
  yd = LongMath.log_internal(x, prec, nil, nil, LongDecimal::ROUND_DOWN)
559
560
  yu = LongMath.log_internal(x, prec, nil, nil, LongDecimal::ROUND_UP)
560
- assert_equal(yd, yu, "the result yd/yu should not depend on the internal rounding mode x0=#{x0} x=#{x} p=#{prec} d=#{(yd-yu).to_f.to_s}")
561
- assert_equal(y, yu, "the result y/yu should not depend on the internal rounding mode x0=#{x0} x=#{x} p=#{prec} d=#{(y -yu).to_f.to_s}")
561
+ assert_equal(yd, yu, "the result yd/yu should not depend on the internal rounding mode yd=#{yd} yu=#{yu} y=#{y} p=#{prec} d=#{(yd-yu).to_f.to_s}")
562
+ assert_equal(y, yu, "the result y/yu should not depend on the internal rounding mode yd=#{yd} yu=#{yu} y=#{y} p=#{prec} d=#{(y -yu).to_f.to_s}")
562
563
  end
563
564
 
564
565
  #
@@ -575,6 +576,18 @@ class TestLongDecimal_class < RUNIT::TestCase
575
576
  check_log_floated(1e-300, 10)
576
577
  check_log_floated(LongDecimal(1, 2000), 10)
577
578
 
579
+ check_log_floated(2, 50)
580
+ check_log_floated(1.01, 50)
581
+ check_log_floated(1+1e-10, 50, 1e7)
582
+ check_log_floated(1.to_ld(90).succ, 100, 1e9, 1e-90)
583
+ check_log_floated(1.to_ld(300).succ, 400, 1e9,1e-300)
584
+
585
+ check_log_floated(2, 50)
586
+ check_log_floated(0.99, 50)
587
+ check_log_floated(1-1e-10, 50, 1e7)
588
+ check_log_floated(1.to_ld(90).pred, 100, 1e9, 1e-90)
589
+ check_log_floated(1.to_ld(300).pred, 400, 1e9, 1e-300)
590
+
578
591
  check_log_floated(10**2000, 100)
579
592
  check_log_floated(100, 100)
580
593
  check_log_floated(1, 100)
@@ -1330,6 +1343,9 @@ class TestLongDecimal_class < RUNIT::TestCase
1330
1343
  #
1331
1344
  def test_int_digits10
1332
1345
  assert_equal(0, LongDecimal("0.0000").int_digits10, "0.0000")
1346
+ assert_equal(0, LongDecimal("0.0009").int_digits10, "0.0009")
1347
+ assert_equal(0, LongDecimal("0.0099").int_digits10, "0.0099")
1348
+ assert_equal(0, LongDecimal("0.0999").int_digits10, "0.0999")
1333
1349
  assert_equal(0, LongDecimal("0.9999").int_digits10, "0.9999")
1334
1350
  assert_equal(1, LongDecimal("1.0000").int_digits10, "1.0000")
1335
1351
  assert_equal(1, LongDecimal("9.9999").int_digits10, "9.9999")
@@ -1346,6 +1362,61 @@ class TestLongDecimal_class < RUNIT::TestCase
1346
1362
  assert_equal(2, LongDecimal("-99.9999").int_digits10, "-99.9999")
1347
1363
  assert_equal(3, LongDecimal("-100.0000").int_digits10, "-100.0000")
1348
1364
  assert_equal(3, LongDecimal("-999.9999").int_digits10, "-999.9999")
1365
+ x = 1234.to_ld
1366
+ assert_equal(4, x.int_digits10, "1234")
1367
+ assert_equal(4, x.int_digits10, "1234")
1368
+ x = 1234.to_ld(10)
1369
+ assert_equal(4, x.int_digits10, "1234")
1370
+ assert_equal(4, x.int_digits10, "1234")
1371
+ end
1372
+
1373
+ #
1374
+ # test sint_digits10 of LongDecimal
1375
+ #
1376
+ def test_sint_digits10
1377
+ assert_equal(-4, LongDecimal("0.0000").sint_digits10, "0.0000")
1378
+ assert_equal(-3, LongDecimal("0.0009").sint_digits10, "0.0009")
1379
+ assert_equal(-2, LongDecimal("0.0099").sint_digits10, "0.0099")
1380
+ assert_equal(-1, LongDecimal("0.0999").sint_digits10, "0.0999")
1381
+ assert_equal(0, LongDecimal("0.9999").sint_digits10, "0.9999")
1382
+ assert_equal(1, LongDecimal("1.0000").sint_digits10, "1.0000")
1383
+ assert_equal(1, LongDecimal("9.9999").sint_digits10, "9.9999")
1384
+ assert_equal(2, LongDecimal("10.0000").sint_digits10, "10.0000")
1385
+ assert_equal(2, LongDecimal("99.9999").sint_digits10, "99.9999")
1386
+ assert_equal(3, LongDecimal("100.0000").sint_digits10, "100.0000")
1387
+ assert_equal(3, LongDecimal("999.9999").sint_digits10, "999.9999")
1388
+
1389
+ assert_equal(-4, LongDecimal("-0.0000").sint_digits10, "-0.0000")
1390
+ assert_equal(0, LongDecimal("-0.9999").sint_digits10, "-0.9999")
1391
+ assert_equal(1, LongDecimal("-1.0000").sint_digits10, "-1.0000")
1392
+ assert_equal(1, LongDecimal("-9.9999").sint_digits10, "-9.9999")
1393
+ assert_equal(2, LongDecimal("-10.0000").sint_digits10, "-10.0000")
1394
+ assert_equal(2, LongDecimal("-99.9999").sint_digits10, "-99.9999")
1395
+ assert_equal(3, LongDecimal("-100.0000").sint_digits10, "-100.0000")
1396
+ assert_equal(3, LongDecimal("-999.9999").sint_digits10, "-999.9999")
1397
+ x = 1234.to_ld
1398
+ assert_equal(4, x.sint_digits10, "1234")
1399
+ assert_equal(4, x.sint_digits10, "1234")
1400
+ x = 1234.to_ld(10)
1401
+ assert_equal(4, x.sint_digits10, "1234")
1402
+ assert_equal(4, x.sint_digits10, "1234")
1403
+ end
1404
+
1405
+ #
1406
+ # test int_digits10 of LongMath
1407
+ #
1408
+ def test_lm_int_digits10
1409
+ assert_equal(0, LongMath.int_digits10(0), "0")
1410
+ assert_equal(1, LongMath.int_digits10(1), "1")
1411
+ assert_equal(1, LongMath.int_digits10(9), "9")
1412
+ assert_equal(2, LongMath.int_digits10(10), "10")
1413
+ assert_equal(2, LongMath.int_digits10(11), "11")
1414
+ assert_equal(2, LongMath.int_digits10(98), "98")
1415
+ assert_equal(2, LongMath.int_digits10(99), "99")
1416
+ assert_equal(3, LongMath.int_digits10(100), "100")
1417
+ assert_equal(3, LongMath.int_digits10(999), "999")
1418
+ assert_equal(4, LongMath.int_digits10(1000), "1000")
1419
+ assert_equal(4, LongMath.int_digits10(9999), "9999")
1349
1420
  end
1350
1421
 
1351
1422
  #
@@ -2043,6 +2114,58 @@ class TestLongDecimal_class < RUNIT::TestCase
2043
2114
  # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = -1 -> use 0
2044
2115
  zz = LongDecimalQuot(Rational(3333, 224), 0)
2045
2116
  assert_kind_of(LongDecimalQuot, z, "z=#{z.inspect}")
2117
+ assert_equal(zz, z, "z=#{z.inspect}")
2118
+
2119
+ # x= 2.24 dx=1 sx=2
2120
+ y = LongDecimal(33333, 2) # 333.33 dy=3 sy=2
2121
+ z = x / y
2122
+ # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = 2
2123
+ zz = LongDecimalQuot(Rational(224, 33333), 2)
2124
+ assert_kind_of(LongDecimalQuot, z, "z=#{z.inspect}")
2125
+ assert_equal(zz, z, "z=#{z.inspect}")
2126
+ z = y / x
2127
+ # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = -2 -> use 0
2128
+ zz = LongDecimalQuot(Rational(33333, 224), 0)
2129
+ assert_kind_of(LongDecimalQuot, z, "z=#{z.inspect}")
2130
+ assert_equal(zz, z, "z=#{z.inspect}")
2131
+
2132
+ # x= 2.24 dx=1 sx=2
2133
+ y = LongDecimal(33333, 3) # 33.333 dy=2 sy=3
2134
+ z = x / y
2135
+ # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = 1
2136
+ zz = LongDecimalQuot(Rational(2240, 33333), 1)
2137
+ assert_kind_of(LongDecimalQuot, z, "z=#{z.inspect}")
2138
+ assert_equal(zz, z, "z=#{z.inspect}")
2139
+ z = y / x
2140
+ # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = -1 -> use 0
2141
+ zz = LongDecimalQuot(Rational(33333, 2240), 0)
2142
+ assert_kind_of(LongDecimalQuot, z, "z=#{z.inspect}")
2143
+ assert_equal(zz, z, "z=#{z.inspect}")
2144
+
2145
+ # x= 2.24 dx=1 sx=2
2146
+ y = LongDecimal(3333, 3) # 3.333 dy=1 sy=3
2147
+ z = x / y
2148
+ # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = 0
2149
+ zz = LongDecimalQuot(Rational(2240, 3333), 0)
2150
+ assert_kind_of(LongDecimalQuot, z, "z=#{z.inspect}")
2151
+ assert_equal(zz, z, "z=#{z.inspect}")
2152
+ z = y / x
2153
+ # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = 0
2154
+ zz = LongDecimalQuot(Rational(3333, 2240), 0)
2155
+ assert_kind_of(LongDecimalQuot, z, "z=#{z.inspect}")
2156
+ assert_equal(zz, z, "z=#{z.inspect}")
2157
+
2158
+ # x= 2.24 dx=1 sx=2
2159
+ y = LongDecimal(123456789, 3) # 123456.789 dy=6 sy=3
2160
+ z = x / y
2161
+ # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = 5
2162
+ zz = LongDecimalQuot(Rational(2240, 123456789), 5)
2163
+ assert_kind_of(LongDecimalQuot, z, "z=#{z.inspect}")
2164
+ assert_equal(zz, z, "z=#{z.inspect}")
2165
+ z = y / x
2166
+ # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = -5 -> use 0
2167
+ zz = LongDecimalQuot(Rational(123456789, 2240), 0)
2168
+ assert_kind_of(LongDecimalQuot, z, "z=#{z.inspect}")
2046
2169
  assert_equal(zz, z, "z=#{z.inspect}")
2047
2170
 
2048
2171
  # x= 2.24 dx=1 sx=2
@@ -2520,21 +2643,65 @@ class TestLongDecimal_class < RUNIT::TestCase
2520
2643
  assert_equal(x, w, "left 12 right 12")
2521
2644
 
2522
2645
  y = x.move_point_right(4)
2523
- z = LongDecimal(n, 4)
2646
+ z = LongDecimal(n, 5)
2524
2647
  assert_equal(y, z, "right 4")
2525
2648
  w = y.move_point_left(4)
2526
2649
  ww = y.move_point_right(-4)
2527
2650
  assert_equal(w, ww, "left / right 4")
2528
2651
  assert_equal(x, w, "right 4 left 4")
2529
2652
 
2530
- y = x.move_point_left(12)
2531
- yy = x.move_point_right(-12)
2653
+ y = x.move_point_right(12)
2654
+ yy = x.move_point_left(-12)
2532
2655
  assert_equal(y, yy, "left / right 12")
2533
2656
  z = LongDecimal(n * 1000, 0)
2534
2657
  assert_equal(y, z, "left 12")
2535
- w = y.move_point_right(12)
2658
+ w = y.move_point_left(12)
2536
2659
  v = x.round_to_scale(12)
2537
2660
  assert_equal(v, w, "right 12 left 12")
2661
+
2662
+ y = x.move_point_left(12)
2663
+ yy = x.move_point_right(-12)
2664
+ assert_equal(y, yy, "left / right 12")
2665
+ z = LongDecimal(n, 21)
2666
+ assert_equal(y, z, "left 12")
2667
+ w = y.move_point_right(12)
2668
+ assert_equal(x, w, "right 12 left 12")
2669
+ end
2670
+
2671
+ #
2672
+ # test moving of decimal point of LongDecimal
2673
+ #
2674
+ def test_move_point2
2675
+ x = LongDecimal(224, 2)
2676
+
2677
+ y = x.move_point_left(0)
2678
+ assert_equal(x, y, "point not moved")
2679
+ y = x.move_point_right(0)
2680
+ assert_equal(x, y, "point not moved")
2681
+
2682
+ z = LongDecimal(224, 3)
2683
+ y = x.move_point_left(1)
2684
+ assert_equal(z, y, "0.224")
2685
+ y = x.move_point_right(-1)
2686
+ assert_equal(z, y, "0.224")
2687
+
2688
+ z = LongDecimal(224, 1)
2689
+ y = x.move_point_left(-1)
2690
+ assert_equal(z, y, "22.4")
2691
+ y = x.move_point_right(1)
2692
+ assert_equal(z, y, "22.4")
2693
+
2694
+ z = LongDecimal(224, 5)
2695
+ y = x.move_point_left(3)
2696
+ assert_equal(z, y, "0.00224")
2697
+ y = x.move_point_right(-3)
2698
+ assert_equal(z, y, "0.00224")
2699
+
2700
+ z = LongDecimal(2240, 0)
2701
+ y = x.move_point_left(-3)
2702
+ assert_equal(z, y, "2240")
2703
+ y = x.move_point_right(3)
2704
+ assert_equal(z, y, "2240")
2538
2705
  end
2539
2706
 
2540
2707
  #
@@ -2572,6 +2739,46 @@ class TestLongDecimal_class < RUNIT::TestCase
2572
2739
  assert(y0 <= y1, "y0 y1")
2573
2740
  assert(y1 <= y2, "y1 y2")
2574
2741
 
2742
+ y0 = check_sqrt(x, 140, LongDecimal::ROUND_DOWN, 0, 1, "two")
2743
+ assert(y0.square < x, "y0*y0")
2744
+ assert(y0.succ.square > x, "(y0.succ).square")
2745
+ y1 = check_sqrt(x, 140, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
2746
+ y2 = check_sqrt(x, 140, LongDecimal::ROUND_UP, -1, 0, "two")
2747
+ assert(y2.pred.square < x, "y2.pred.squre")
2748
+ assert(y2.square > x, "y2*y2")
2749
+ assert(y0 <= y1, "y0 y1")
2750
+ assert(y1 <= y2, "y1 y2")
2751
+
2752
+ y0 = check_sqrt(x, 160, LongDecimal::ROUND_DOWN, 0, 1, "two")
2753
+ assert(y0.square < x, "y0*y0")
2754
+ assert(y0.succ.square > x, "(y0.succ).square")
2755
+ y1 = check_sqrt(x, 160, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
2756
+ y2 = check_sqrt(x, 160, LongDecimal::ROUND_UP, -1, 0, "two")
2757
+ assert(y2.pred.square < x, "y2.pred.squre")
2758
+ assert(y2.square > x, "y2*y2")
2759
+ assert(y0 <= y1, "y0 y1")
2760
+ assert(y1 <= y2, "y1 y2")
2761
+
2762
+ y0 = check_sqrt(x, 120, LongDecimal::ROUND_DOWN, 0, 1, "two")
2763
+ assert(y0.square < x, "y0*y0")
2764
+ assert(y0.succ.square > x, "(y0.succ).square")
2765
+ y1 = check_sqrt(x, 120, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
2766
+ y2 = check_sqrt(x, 120, LongDecimal::ROUND_UP, -1, 0, "two")
2767
+ assert(y2.pred.square < x, "y2.pred.squre")
2768
+ assert(y2.square > x, "y2*y2")
2769
+ assert(y0 <= y1, "y0 y1")
2770
+ assert(y1 <= y2, "y1 y2")
2771
+
2772
+ y0 = check_sqrt(x, 100, LongDecimal::ROUND_DOWN, 0, 1, "two")
2773
+ assert(y0.square < x, "y0*y0")
2774
+ assert(y0.succ.square > x, "(y0.succ).square")
2775
+ y1 = check_sqrt(x, 100, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
2776
+ y2 = check_sqrt(x, 100, LongDecimal::ROUND_UP, -1, 0, "two")
2777
+ assert(y2.pred.square < x, "y2.pred.squre")
2778
+ assert(y2.square > x, "y2*y2")
2779
+ assert(y0 <= y1, "y0 y1")
2780
+ assert(y1 <= y2, "y1 y2")
2781
+
2575
2782
  x = 3.to_ld
2576
2783
  y0 = check_sqrt(x, 120, LongDecimal::ROUND_DOWN, 0, 1, "three")
2577
2784
  assert(y0.square < x, "y0*y0")
@@ -2618,9 +2825,15 @@ class TestLongDecimal_class < RUNIT::TestCase
2618
2825
 
2619
2826
  x = LongDecimal.two!(101)
2620
2827
  check_sqrt_with_remainder(x, 120, "two")
2828
+ check_sqrt_with_remainder(x, 140, "two")
2829
+ check_sqrt_with_remainder(x, 160, "two")
2830
+ check_sqrt_with_remainder(x, 100, "two")
2621
2831
 
2622
2832
  x = 3.to_ld
2623
2833
  check_sqrt_with_remainder(x, 120, "three")
2834
+ check_sqrt_with_remainder(x, 140, "three")
2835
+ check_sqrt_with_remainder(x, 160, "three")
2836
+ check_sqrt_with_remainder(x, 100, "three")
2624
2837
 
2625
2838
  x = 4.to_ld.round_to_scale(101)
2626
2839
  r = check_sqrt_with_remainder(x, 120, "four")
@@ -2630,6 +2843,29 @@ class TestLongDecimal_class < RUNIT::TestCase
2630
2843
  check_sqrt_with_remainder(x, 120, "five")
2631
2844
  end
2632
2845
 
2846
+ #
2847
+ # test LongMath.sqrt with non-LongDecimal arguments
2848
+ #
2849
+ def test_non_ld_sqrt
2850
+ xi = 77
2851
+ yi = LongMath.sqrt(xi, 31, LongMath::ROUND_HALF_EVEN)
2852
+ zi = yi.square.round_to_scale(30, LongMath::ROUND_HALF_EVEN)
2853
+ assert(zi.is_int?, "zi=#{zi.to_s}")
2854
+ assert_equal(xi, zi.to_i, "zi")
2855
+
2856
+ xf = 77.0
2857
+ yf = LongMath.sqrt(xf, 31, LongMath::ROUND_HALF_EVEN)
2858
+ zf = yf.square.round_to_scale(30, LongMath::ROUND_HALF_EVEN)
2859
+ assert(zf.is_int?, "zf")
2860
+ assert_equal(xf, zf.to_f, "zf")
2861
+ assert_equal(yi, yf, "i-f")
2862
+
2863
+ xr = Rational(224, 227)
2864
+ yr = LongMath.sqrt(xr, 31, LongMath::ROUND_HALF_EVEN)
2865
+ zr = yr.square.round_to_scale(30, LongMath::ROUND_HALF_EVEN)
2866
+ assert((zr-xr).abs <= zr.unit, "zr-xr")
2867
+ end
2868
+
2633
2869
  #
2634
2870
  # test absolute value of LongDecimal
2635
2871
  #
@@ -2645,42 +2881,6 @@ class TestLongDecimal_class < RUNIT::TestCase
2645
2881
  assert_equal(x, y, "abs of zero")
2646
2882
  end
2647
2883
 
2648
- #
2649
- # test moving of decimal point of LongDecimal
2650
- #
2651
- def test_move_point
2652
- x = LongDecimal(224, 2)
2653
-
2654
- y = x.move_point_left(0)
2655
- assert_equal(x, y, "point not moved")
2656
- y = x.move_point_right(0)
2657
- assert_equal(x, y, "point not moved")
2658
-
2659
- z = LongDecimal(224, 3)
2660
- y = x.move_point_left(1)
2661
- assert_equal(z, y, "0.224")
2662
- y = x.move_point_right(-1)
2663
- assert_equal(z, y, "0.224")
2664
-
2665
- z = LongDecimal(224, 1)
2666
- y = x.move_point_left(-1)
2667
- assert_equal(z, y, "22.4")
2668
- y = x.move_point_right(1)
2669
- assert_equal(z, y, "22.4")
2670
-
2671
- z = LongDecimal(224, 5)
2672
- y = x.move_point_left(3)
2673
- assert_equal(z, y, "0.00224")
2674
- y = x.move_point_right(-3)
2675
- assert_equal(z, y, "0.00224")
2676
-
2677
- z = LongDecimal(2240, 0)
2678
- y = x.move_point_left(-3)
2679
- assert_equal(z, y, "2240")
2680
- y = x.move_point_right(3)
2681
- assert_equal(z, y, "2240")
2682
- end
2683
-
2684
2884
  #
2685
2885
  # test ufo-operator (<=>) of LongDecimal
2686
2886
  #
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: long-decimal
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.00.20
7
- date: 2006-04-02 00:00:00 +02:00
6
+ version: 0.00.21
7
+ date: 2006-04-06 00:00:00 +02:00
8
8
  summary: LongDecimal for numbers with fixed point
9
9
  require_paths:
10
10
  - lib