long-decimal 1.00.01 → 1.00.02

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ module LongDecimalSupport
2
+ VERSION = "1.00.02"
3
+ end
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'long-decimal/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "long-decimal"
8
+ spec.version = LongDecimalSupport::VERSION
9
+ spec.authors = ["Karl Brodowsky"]
10
+ spec.email = ["karl_brodowsky@yahoo.com"]
11
+ spec.summary = %q{Fixed Point Decimal Numbers}
12
+ spec.description = %q{Decimal arbitrary precision fixed point numbers in pure Ruby.}
13
+ spec.homepage = "https://github.com/bk1/ruby-long-decimal"
14
+ spec.license = "LGPL or Ruby"
15
+ spec.files = "./Gemfile", "./LICENSE", "./README", "./Rakefile", "./lib/long-decimal-extra.rb", "./lib/long-decimal.rb", "./test/testlongdecimal.rb", "./test/testlongdeclib.rb", "./test/testrandlib.rb", "./test/testrandom.rb", "./test/testrandpower.rb", "./tex/long-decimal.pdf", "./tex/long-decimal.tex", "./long-decimal.gemspec", "./lib/long-decimal/version.rb"
16
+ spec.executables =
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.6"
21
+ spec.add_development_dependency "rake"
22
+ end
@@ -5,11 +5,20 @@
5
5
  # (C) Karl Brodowsky (IT Sky Consulting GmbH) 2006-2009
6
6
  #
7
7
  # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/test/testlongdecimal.rb,v 1.86 2011/01/16 22:16:59 bk1 Exp $
8
- # CVS-Label: $Name: RELEASE_1_00_00 $
8
+ # CVS-Label: $Name: $
9
9
  # Author: $Author: bk1 $ (Karl Brodowsky)
10
10
  #
11
11
 
12
- require 'test/unit'
12
+ $test_type = nil
13
+ if ((RUBY_VERSION.match /^1\./) || (RUBY_VERSION.match /^2\.0/)) then
14
+ require 'test/unit'
15
+ $test_type = :v20
16
+ else
17
+ require 'minitest/autorun'
18
+ require 'test/unit/assertions'
19
+ include Test::Unit::Assertions
20
+ $test_type = :v21
21
+ end
13
22
 
14
23
  # require "runit/testcase"
15
24
  # require "runit/cui/testrunner"
@@ -20,11 +29,20 @@ load "test/testlongdeclib.rb"
20
29
 
21
30
  LongMath.prec_overflow_handling = :warn_use_max
22
31
 
32
+ if ($test_type == :v20)
33
+ class UnitTest < Test::Unit::TestCase
34
+ end
35
+ else
36
+ class UnitTest < MiniTest::Test
37
+ end
38
+ end
39
+
23
40
  #
24
41
  # test class for LongDecimal and LongDecimalQuot
25
42
  #
26
- class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
43
+ class TestLongDecimal_class < UnitTest # RUNIT::TestCase
27
44
  include TestLongDecHelper
45
+ include LongDecimalRoundingMode
28
46
 
29
47
  @RCS_ID='-$Id: testlongdecimal.rb,v 1.86 2011/01/16 22:16:59 bk1 Exp $-'
30
48
 
@@ -186,6 +204,82 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
186
204
  assert((zr-xr).abs <= zr.unit, "zr-xr")
187
205
  end
188
206
 
207
+ #
208
+ # test exp2 of LongMath
209
+ #
210
+ def test_exp2
211
+ print "\ntest_exp2 [#{Time.now}]: "
212
+ 10.times do |i|
213
+ n = (i*i+i)/2
214
+ x = LongDecimal(n, 3*i)+LongMath.pi(20)
215
+ check_exp2_floated(x, n)
216
+
217
+ y = LongMath.exp2(x, n)
218
+ yy = LongMath.exp2(x, n + 5)
219
+ assert_equal(yy.round_to_scale(y.scale, LongDecimal::ROUND_HALF_DOWN), y, "x=#{x} y=#{y} yy=#{yy}")
220
+ z = LongMath.power(2, x, n)
221
+ assert_equal(z, y, "exp2 x=#{x} y=#{y} z=#{z} i=#{i} n=#{n}")
222
+ end
223
+
224
+ # random tests that have failed previously
225
+ check_exp2_floated(LongDecimal("-0.00147492625237084606064197462823289474038138852346725504592707365251736299180323394082648207114993022483949313246714392730651107673327728615912046468517225938833913598854936005"), 20)
226
+
227
+ end
228
+
229
+ #
230
+ # test the calculation of the exponential function where result is
231
+ # near zero
232
+ #
233
+ def test_exp2_near_zero
234
+ print "\ntest_exp2_near_zero [#{Time.now}]: "
235
+
236
+ x = LongDecimal(1, 100)
237
+ y = LongMath.log2(x, 100)
238
+ z = check_exp2_floated(y, 100)
239
+ assert_equal(x, z, "must be equal")
240
+ z = check_exp2_floated(y, 99)
241
+ assert(z.zero?, "must be zero")
242
+ z = check_exp2_floated(y * 100, 99)
243
+ assert(z.zero?, "must be zero")
244
+
245
+ end
246
+
247
+ #
248
+ # test exp10 of LongMath
249
+ #
250
+ def test_exp10
251
+ print "\ntest_exp10 [#{Time.now}]: "
252
+ 10.times do |i|
253
+ n = (i*i+i)/2
254
+ x = LongDecimal(n, 3*i)+LongMath.pi(20)
255
+ check_exp10_floated(x, n)
256
+
257
+ y = LongMath.exp10(x, n)
258
+ yy = LongMath.exp10(x, n + 5)
259
+ assert_equal(yy.round_to_scale(y.scale, LongDecimal::ROUND_HALF_DOWN), y, "x=#{x} y=#{y} yy=#{yy}")
260
+ z = LongMath.power(10, x, n)
261
+ assert_equal(z, y, "exp10 x=#{x} y=#{y} z=#{z} i=#{i} n=#{n}")
262
+ end
263
+ end
264
+
265
+ #
266
+ # test the calculation of the exponential function where result is
267
+ # near zero
268
+ #
269
+ def test_exp10_near_zero
270
+ print "\ntest_exp10_near_zero [#{Time.now}]: "
271
+
272
+ x = LongDecimal(1, 100)
273
+ y = LongMath.log10(x, 100)
274
+ z = check_exp10_floated(y, 100)
275
+ assert_equal(x, z, "must be equal")
276
+ z = check_exp10_floated(y, 99)
277
+ assert(z.zero?, "must be zero")
278
+ z = check_exp10_floated(y * 100, 99)
279
+ assert(z.zero?, "must be zero")
280
+
281
+ end
282
+
189
283
  #
190
284
  # test LongMath.log with non-LongDecimal arguments
191
285
  #
@@ -282,6 +376,410 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
282
376
  end
283
377
 
284
378
 
379
+ #
380
+ # test LongMath.power for bases that can be expressed as integer
381
+ #
382
+ def test_lm_power_xint
383
+ print "\ntest_lm_power_xint [#{Time.now}]: "
384
+
385
+ xx = LongMath.log(3, 40)
386
+ pi = LongMath.pi(40)
387
+ sq = LongMath.sqrt(5, 40)
388
+
389
+ check_power_xint(2, 700.01, 10)
390
+ check_power_xint(2, 100.001, 10)
391
+ check_power_xint(2, 1.000000001, 10)
392
+ check_power_xint(2, 0.01, 10)
393
+ check_power_xint(2, 1e-10, 10)
394
+ check_power_xint(2, 1e-90, 10)
395
+ check_power_xint(2, 0, 10)
396
+ check_power_xint(2, -1.000000001, 10)
397
+ check_power_xint(2, -100.001, 10)
398
+ check_power_xint(2, -700.01, 10)
399
+ check_power_xint(2, xx, 10)
400
+ check_power_xint(2, pi, 10)
401
+ check_power_xint(2, sq, 10)
402
+
403
+ check_power_xint(10, 308.01, 10)
404
+ check_power_xint(10, 100.001, 10)
405
+ check_power_xint(10, 1.000000001, 10)
406
+ check_power_xint(10, 0.01, 10)
407
+ check_power_xint(10, 1e-10, 10)
408
+ check_power_xint(10, 1e-90, 10)
409
+ check_power_xint(10, 0, 10)
410
+ check_power_xint(10, -1.000000001, 10)
411
+ check_power_xint(10, -100.001, 10)
412
+ check_power_xint(10, -308.01, 10)
413
+ check_power_xint(10, xx, 10)
414
+ check_power_xint(10, pi, 10)
415
+ check_power_xint(10, sq, 10)
416
+
417
+ check_power_xint(2, 700.01, 100)
418
+ check_power_xint(2, 100.001, 100)
419
+ check_power_xint(2, 1.000000001, 100)
420
+ check_power_xint(2, 0.01, 100)
421
+ check_power_xint(2, 1e-10, 100)
422
+ check_power_xint(2, 1e-90, 100)
423
+ check_power_xint(2, 0, 100)
424
+ check_power_xint(2, -1.000000001, 100)
425
+ check_power_xint(2, -100.001, 100)
426
+ check_power_xint(2, -700.01, 100)
427
+ check_power_xint(2, xx, 100)
428
+ check_power_xint(2, pi, 100)
429
+ check_power_xint(2, sq, 100)
430
+
431
+ check_power_xint(10, 308.01, 100)
432
+ check_power_xint(10, 100.001, 100)
433
+ check_power_xint(10, 1.000000001, 100)
434
+ check_power_xint(10, 0.01, 100)
435
+ check_power_xint(10, 1e-10, 100)
436
+ check_power_xint(10, 1e-90, 100)
437
+ check_power_xint(10, 0, 100)
438
+ check_power_xint(10, -1.000000001, 100)
439
+ check_power_xint(10, -100.001, 100)
440
+ check_power_xint(10, -308.01, 100)
441
+ check_power_xint(10, xx, 100)
442
+ check_power_xint(10, pi, 100)
443
+ check_power_xint(10, sq, 100)
444
+
445
+ check_power_xint(2, 700.01, 40)
446
+ check_power_xint(2, 100.001, 40)
447
+ check_power_xint(2, 1.000000001, 40)
448
+ check_power_xint(2, 0.01, 40)
449
+ check_power_xint(2, 1e-10, 40)
450
+ check_power_xint(2, 1e-90, 40)
451
+ check_power_xint(2, 0, 40)
452
+ check_power_xint(2, -1.000000001, 40)
453
+ check_power_xint(2, -100.001, 40)
454
+ check_power_xint(2, -700.01, 40)
455
+ check_power_xint(2, xx, 40)
456
+ check_power_xint(2, pi, 40)
457
+ check_power_xint(2, sq, 40)
458
+
459
+ check_power_xint(10, 308.01, 40)
460
+ check_power_xint(10, 100.001, 40)
461
+ check_power_xint(10, 1.000000001, 40)
462
+ check_power_xint(10, 0.01, 40)
463
+ check_power_xint(10, 1e-10, 40)
464
+ check_power_xint(10, 1e-90, 40)
465
+ check_power_xint(10, 0, 40)
466
+ check_power_xint(10, -1.000000001, 40)
467
+ check_power_xint(10, -100.001, 40)
468
+ check_power_xint(10, -308.01, 40)
469
+ check_power_xint(10, xx, 40)
470
+ check_power_xint(10, pi, 40)
471
+ check_power_xint(10, sq, 40)
472
+
473
+ end
474
+
475
+ #
476
+ # test LongMath.power for bases that can be expressed as integer
477
+ #
478
+ def test_lm_power_yint
479
+ print "\ntest_lm_power_yint [#{Time.now}] (2 min): "
480
+
481
+ xx = LongMath.log(3, 40)
482
+ pi = LongMath.pi(40)
483
+ sq = LongMath.sqrt(5, 40)
484
+
485
+ check_power_yint(xx, 400, 10)
486
+ check_power_yint(xx, 100, 10)
487
+ check_power_yint(xx, 1, 10)
488
+ check_power_yint(xx, 0, 10)
489
+ check_power_yint(xx, -1, 10)
490
+ check_power_yint(xx, -100, 10)
491
+ check_power_yint(xx, -400, 10)
492
+
493
+ check_power_yint(pi, 400, 10)
494
+ check_power_yint(pi, 100, 10)
495
+ check_power_yint(pi, 1, 10)
496
+ check_power_yint(pi, 0, 10)
497
+ check_power_yint(pi, -1, 10)
498
+ check_power_yint(pi, -100, 10)
499
+ check_power_yint(pi, -400, 10)
500
+
501
+ check_power_yint(sq, 400, 10)
502
+ check_power_yint(sq, 100, 10)
503
+ check_power_yint(sq, 1, 10)
504
+ check_power_yint(sq, 0, 10)
505
+ check_power_yint(sq, -1, 10)
506
+ check_power_yint(sq, -100, 10)
507
+ check_power_yint(sq, -400, 10)
508
+
509
+ check_power_yint(xx, 400, 100)
510
+ check_power_yint(xx, 100, 100)
511
+ check_power_yint(xx, 1, 100)
512
+ check_power_yint(xx, 0, 100)
513
+ check_power_yint(xx, -1, 100)
514
+ check_power_yint(xx, -100, 100)
515
+ check_power_yint(xx, -400, 100)
516
+
517
+ check_power_yint(pi, 400, 100)
518
+ check_power_yint(pi, 100, 100)
519
+ check_power_yint(pi, 1, 100)
520
+ check_power_yint(pi, 0, 100)
521
+ check_power_yint(pi, -1, 100)
522
+ check_power_yint(pi, -100, 100)
523
+ check_power_yint(pi, -400, 100)
524
+
525
+ check_power_yint(sq, 400, 100)
526
+ check_power_yint(sq, 100, 100)
527
+ check_power_yint(sq, 1, 100)
528
+ check_power_yint(sq, 0, 100)
529
+ check_power_yint(sq, -1, 100)
530
+ check_power_yint(sq, -100, 100)
531
+ check_power_yint(sq, -400, 100)
532
+
533
+ check_power_yint(xx, 400, 40)
534
+ check_power_yint(xx, 100, 40)
535
+ check_power_yint(xx, 1, 40)
536
+ check_power_yint(xx, 0, 40)
537
+ check_power_yint(xx, -1, 40)
538
+ check_power_yint(xx, -100, 40)
539
+ check_power_yint(xx, -400, 40)
540
+
541
+ check_power_yint(pi, 400, 40)
542
+ check_power_yint(pi, 100, 40)
543
+ check_power_yint(pi, 1, 40)
544
+ check_power_yint(pi, 0, 40)
545
+ check_power_yint(pi, -1, 40)
546
+ check_power_yint(pi, -100, 40)
547
+ check_power_yint(pi, -400, 40)
548
+
549
+ check_power_yint(sq, 400, 40)
550
+ check_power_yint(sq, 100, 40)
551
+ check_power_yint(sq, 1, 40)
552
+ check_power_yint(sq, 0, 40)
553
+ check_power_yint(sq, -1, 40)
554
+ check_power_yint(sq, -100, 40)
555
+ check_power_yint(sq, -400, 40)
556
+
557
+ end
558
+
559
+ #
560
+ # test LongMath.power for bases that can be expressed as integer
561
+ #
562
+ def test_lm_power_yhalfint
563
+ print "\ntest_lm_power_yhalfint [#{Time.now}] (10 min): "
564
+
565
+ xx = LongMath.log(3, 40)
566
+ pi = LongMath.pi(40)
567
+ sq = LongMath.sqrt(5, 40)
568
+
569
+ check_power_yhalfint(xx, 801, 10)
570
+ check_power_yhalfint(xx, 799, 10)
571
+ check_power_yhalfint(xx, 201, 10)
572
+ check_power_yhalfint(xx, 3, 10)
573
+ check_power_yhalfint(xx, 1, 10)
574
+ check_power_yhalfint(xx, -1, 10)
575
+ check_power_yhalfint(xx, -201, 10)
576
+ check_power_yhalfint(xx, -799, 10)
577
+ check_power_yhalfint(xx, -801, 10)
578
+
579
+ check_power_yhalfint(pi, 801, 10)
580
+ check_power_yhalfint(pi, 799, 10)
581
+ check_power_yhalfint(pi, 201, 10)
582
+ check_power_yhalfint(pi, 3, 10)
583
+ check_power_yhalfint(pi, 1, 10)
584
+ check_power_yhalfint(pi, -1, 10)
585
+ check_power_yhalfint(pi, -201, 10)
586
+ check_power_yhalfint(pi, -799, 10)
587
+ check_power_yhalfint(pi, -801, 10)
588
+
589
+ check_power_yhalfint(sq, 801, 10)
590
+ check_power_yhalfint(sq, 799, 10)
591
+ check_power_yhalfint(sq, 201, 10)
592
+ check_power_yhalfint(sq, 3, 10)
593
+ check_power_yhalfint(sq, 1, 10)
594
+ check_power_yhalfint(sq, -1, 10)
595
+ check_power_yhalfint(sq, -201, 10)
596
+ check_power_yhalfint(sq, -799, 10)
597
+ check_power_yhalfint(sq, -801, 10)
598
+
599
+ check_power_yhalfint(xx, 801, 40)
600
+ check_power_yhalfint(xx, 799, 40)
601
+ check_power_yhalfint(xx, 201, 40)
602
+ check_power_yhalfint(xx, 3, 40)
603
+ check_power_yhalfint(xx, 1, 40)
604
+ check_power_yhalfint(xx, -1, 40)
605
+ check_power_yhalfint(xx, -201, 40)
606
+ check_power_yhalfint(xx, -799, 40)
607
+ check_power_yhalfint(xx, -801, 40)
608
+
609
+ check_power_yhalfint(pi, 801, 40)
610
+ check_power_yhalfint(pi, 799, 40)
611
+ check_power_yhalfint(pi, 201, 40)
612
+ check_power_yhalfint(pi, 3, 40)
613
+ check_power_yhalfint(pi, 1, 40)
614
+ check_power_yhalfint(pi, -1, 40)
615
+ check_power_yhalfint(pi, -201, 40)
616
+ check_power_yhalfint(pi, -799, 40)
617
+ check_power_yhalfint(pi, -801, 40)
618
+
619
+ check_power_yhalfint(sq, 801, 40)
620
+ check_power_yhalfint(sq, 799, 40)
621
+ check_power_yhalfint(sq, 201, 40)
622
+ check_power_yhalfint(sq, 3, 40)
623
+ check_power_yhalfint(sq, 1, 40)
624
+ check_power_yhalfint(sq, -1, 40)
625
+ check_power_yhalfint(sq, -201, 40)
626
+ check_power_yhalfint(sq, -799, 40)
627
+ check_power_yhalfint(sq, -801, 40)
628
+
629
+ end
630
+
631
+ #
632
+ # test the calculation of the base-10-logarithm function
633
+ #
634
+ def test_log10
635
+ print "\ntest_log10 [#{Time.now}]: "
636
+ check_log10_floated(10**2000, 30)
637
+ check_log10_floated(100, 30)
638
+ check_log10_floated(1, 30)
639
+ check_log10_floated(0.01, 30)
640
+ check_log10_floated(1e-10, 30)
641
+ check_log10_floated(1e-90, 30)
642
+ check_log10_floated(1e-300, 30)
643
+ check_log10_floated(LongDecimal(1, 2000), 30)
644
+
645
+ check_log10_exact(10**2000, 2000, 30)
646
+ check_log10_exact(10**0, 0, 30)
647
+ check_log10_exact(10**1, 1, 30)
648
+ check_log10_exact(10**10, 10, 30)
649
+
650
+ # random tests that have failed
651
+ check_log10_floated(LongDecimal("587.00000000000000000095700000000000000000000000000000000000000000000000000000000000000000000001206"), 21)
652
+ check_log10_floated(LongDecimal("543.0000002480000900000000000000000000000000000000000000000000000000000000000000000000847"), 2)
653
+ check_log10_floated(LongDecimal("180.0000000000000000003570000000000000000000000000000000000000000000000577000000000000000000000000000637"), 2)
654
+ check_log10_floated(LongDecimal("0.0000000000000000000000000000000000000000180000000063000000000000000000000000000000000025"), 74)
655
+ check_log10_floated(LongDecimal("0.0000000000000000000000000006200000000000000000000000000000000000000000000000007940000015"), 74)
656
+ check_log10_floated(LongDecimal("0.00000000000000000000000000000000000000000032900000000000000000000233000000000000000000000000000000254"), 10)
657
+ check_log10_floated(LongDecimal("0.00000000000000000000000233000000094800000000000000000000000000000000000000000000000000000000000000682"), 100)
658
+ check_log10_floated(LongDecimal("0.000000000000000000000000000000000000097000000041500000000000000000784"), 97)
659
+ check_log10_floated(LongDecimal("185.000025300000000000000006320000000000000000000000000000737"), 27)
660
+ check_log10_floated(LongDecimal("0.00000000000000000000000000000302000000000000000000000000000000000000000000000000000000060673"), 100)
661
+ check_log10_floated(LongDecimal("442.000000000000045300000000000000000000000000000000000000000000000000000000000000000000000721000000000752"), 97)
662
+ check_log10_floated(LongDecimal("0.001030927835051546391752577284408545010096715910298651428936221023301883588097777204212461151695109779555577162172"), 62)
663
+
664
+ end
665
+
666
+ #
667
+ # test the calculation of the base-10-logarithm function
668
+ #
669
+ def test_log2
670
+ print "\ntest_log2 [#{Time.now}]: "
671
+ check_log2_floated(10**2000, 30)
672
+ check_log2_floated(2**2000, 30)
673
+ check_log2_floated(100, 30)
674
+ check_log2_floated(1, 30)
675
+ check_log2_floated(0.01, 30)
676
+ check_log2_floated(1e-10, 30)
677
+ check_log2_floated(1e-90, 30)
678
+ check_log2_floated(1e-300, 30)
679
+ check_log2_floated(LongDecimal(1, 2000), 30)
680
+
681
+ check_log2_exact(2**2000, 2000, 30)
682
+ check_log2_exact(2**0, 0, 30)
683
+ check_log2_exact(2**1, 1, 30)
684
+ check_log2_exact(2**10, 10, 30)
685
+
686
+ # random tests that have failed
687
+ check_log2_floated(LongDecimal("341.00000739000000000000000000000000000000000000000000000000000000000000171"), 3)
688
+ check_log2_floated(LongDecimal("504.00000000000000000000000000000000000000000000000000000000000000000000000000000000000327400000000000828"), 1)
689
+ check_log2_floated(LongDecimal("0.0033222591362126245847176079734219269102990032888157967351353737817463383406363175903135730345286354858609181999523961456225622835123748782987926188031081"), 48)
690
+ check_log2_floated(LongDecimal("0.000802000000000000000000197000000000000000000000302"), 84)
691
+ check_log2_floated(LongDecimal("0.00000000000000000000000000000000000000000000000000000000000000000000000452000000000069480"), 3)
692
+ check_log2_floated(LongDecimal("0.0000000000000000000000000000000000000000000000000000930000000000000000000000000983000000000000300"), 61)
693
+ check_log2_floated(LongDecimal("0.000000000000000000000000000000000000000000000000000000000086000133000000000000000000000000947"), 106)
694
+ check_log2_floated(LongDecimal("0.00000000000000000000000000000276000000000000000000000000000000000008560000000000000000000000000000161"), 81)
695
+
696
+ end
697
+
698
+ #
699
+ # test the calculation of the base-x-logarithm of sqrt(x)
700
+ #
701
+ def test_log_2_10_of_sqrt
702
+ print "\ntest_log_2_10_of_sqrt [#{Time.now}]: "
703
+ # n = 125
704
+ n = 30
705
+ m = 5
706
+ x2 = LongMath.sqrt(2, n)
707
+ x10 = LongMath.sqrt(10, n)
708
+
709
+ (2*m).times do |i|
710
+ check_log2_floated(x2, n+m-i)
711
+ check_log10_floated(x10, n+m-i)
712
+ end
713
+
714
+ y2 = check_log2_floated(x2, n)
715
+ assert((y2*2).one?, "xe=#{x2} ye=#{y2}")
716
+ y10 = check_log10_floated(x10, n)
717
+ assert((y10*2).one?, "xe=#{x10} ye=#{y10}")
718
+
719
+ end
720
+
721
+ #
722
+ # test LongMath.power with non-LongDecimal arguments
723
+ #
724
+ def test_non_ld_power
725
+ print "\ntest_non_ld_power [#{Time.now}]: "
726
+ xi = 77
727
+ yi = 88
728
+ zi = LongMath.power(xi, yi, 35)
729
+ wi = (LongMath.log(zi, 40) / LongMath.log(xi, 40)).round_to_scale(30, LongMath::ROUND_HALF_EVEN)
730
+ assert(wi.is_int?, "wi=#{wi} not int (zi=#{zi})")
731
+ assert_equal(yi, wi.to_i, "zi=#{zi} wi=#{wi}")
732
+ zj = LongMath.power_internal(xi, yi, 35)
733
+ assert_equal(zi, zj, "internal power should yield the same result zi=#{zi} zj=#{zj}")
734
+
735
+ xf = 77.0
736
+ yf = 88.0
737
+ zf = LongMath.power(xf, yf, 35)
738
+ wf = (LongMath.log(zf, 40) / LongMath.log(xf, 40)).round_to_scale(30, LongMath::ROUND_HALF_EVEN)
739
+ assert(wf.is_int?, "wf=#{wf} not int (zf=#{zf} wi=#{wi} zi=#{zi}")
740
+ assert_equal(yf, wf.to_i, "yf=#{yf} wf=#{yf}")
741
+
742
+ xr = Rational(224, 225)
743
+ yr = Rational(168, 169)
744
+ zr = LongMath.power(xr, yr, 35)
745
+ wr = (LongMath.log(zr, 40) / LongMath.log(xr, 40)).round_to_scale(30, LongMath::ROUND_HALF_EVEN)
746
+ assert((yr-wr).abs <= wr.unit, "wr-yr")
747
+ end
748
+
749
+ #
750
+ # test the calculation of the power-function of LongMath
751
+ #
752
+ def test_lm_power
753
+ print "\ntest_lm_power [#{Time.now}]: "
754
+ check_power_floated(1.001, 1.001, 10)
755
+ check_power_floated(1.001, 2.001, 10)
756
+ check_power_floated(2.001, 1.001, 10)
757
+ check_power_floated(2.001, 2.001, 10)
758
+ check_power_floated(100.001, 10.001, 10)
759
+ check_power_floated(10.001, 100.001, 10)
760
+ check_power_floated(10.001, 100.001, 100)
761
+ check_power_floated(1e-20, 1.01, 19)
762
+ check_power_floated(1.01, 1e-20, 19)
763
+ check_power_floated(1e-20, 1.01, 20)
764
+ check_power_floated(1.01, 1e-20, 20)
765
+ check_power_floated(1e-20, 1.01, 21)
766
+ check_power_floated(1.01, 1e-20, 21)
767
+
768
+ check_power_floated(1.001, -1.001, 10)
769
+ check_power_floated(1.001, -2.001, 10)
770
+ check_power_floated(2.001, -1.001, 10)
771
+ check_power_floated(2.001, -2.001, 10)
772
+ check_power_floated(100.001, -10.001, 10)
773
+ check_power_floated(10.001, -100.001, 10)
774
+ check_power_floated(1e-20, -1.01, 19)
775
+ check_power_floated(1.01, -1e-20, 19)
776
+ check_power_floated(1e-20, -1.01, 20)
777
+ check_power_floated(1.01, -1e-20, 20)
778
+ check_power_floated(1e-20, -1.01, 21)
779
+ check_power_floated(1.01, -1e-20, 21)
780
+
781
+ end
782
+
285
783
 
286
784
  #
287
785
  # test calculation of pi
@@ -331,15 +829,15 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
331
829
 
332
830
  l = LongDecimal(s)
333
831
  pi = LongMath.pi 200
334
- assert_equal(l.round_to_scale(200, LongMath::ROUND_HALF_EVEN), pi, "200 digits")
832
+ assert_equal(l.round_to_scale(200, ROUND_HALF_EVEN), pi, "200 digits")
335
833
  pi = LongMath.pi 201
336
- assert_equal(l.round_to_scale(201, LongMath::ROUND_HALF_EVEN), pi, "201 digits")
834
+ assert_equal(l.round_to_scale(201, ROUND_HALF_EVEN), pi, "201 digits")
337
835
  pi = LongMath.pi 199
338
- assert_equal(l.round_to_scale(199, LongMath::ROUND_HALF_EVEN), pi, "199 digits")
836
+ assert_equal(l.round_to_scale(199, ROUND_HALF_EVEN), pi, "199 digits")
339
837
  pi = LongMath.pi 201
340
- assert_equal(l.round_to_scale(201, LongMath::ROUND_HALF_EVEN), pi, "201 digits")
838
+ assert_equal(l.round_to_scale(201, ROUND_HALF_EVEN), pi, "201 digits")
341
839
  pi = LongMath.pi 1000
342
- assert_equal(l.round_to_scale(1000, LongMath::ROUND_HALF_EVEN), pi, "1000 digits")
840
+ assert_equal(l.round_to_scale(1000, ROUND_HALF_EVEN), pi, "1000 digits")
343
841
  end
344
842
 
345
843
  #
@@ -649,7 +1147,6 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
649
1147
  y = Complex(yr, yi)
650
1148
  z = x/y
651
1149
  msg = "x=#{x} y=#{y} z=#{z} xr=#{xr.inspect} (#{tw_c}) xi=#{xi.inspect} (#{fi_c}) yr=#{yr.inspect} (#{th_c}) yi=#{yi.inspect} (#{fo_c})"
652
- # puts msg
653
1150
  if (xr.kind_of? Integer) && (xi.kind_of? Integer) && (yr.kind_of? Integer) && (yi.kind_of? Integer) # && ! LongDecimal::RUNNING_19
654
1151
  # ruby 1.9 creates rational result even from integers, ruby 1.8 uses integers as results.
655
1152
  zc = (x.cdiv y)
@@ -733,7 +1230,12 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
733
1230
  zb = Complex(BigDecimal("2.4"),BigDecimal("-3.2"))
734
1231
  zf = Complex(2.4,-3.2)
735
1232
  zl = Complex(LongDecimal("2.4"),LongDecimal("-3.2"))
736
- zi = Complex(2, -4)
1233
+ zi = nil
1234
+ if ($test_type == :v20)
1235
+ zi = Complex(2, -4)
1236
+ else
1237
+ zi = zr
1238
+ end
737
1239
  twenties.each do |x|
738
1240
  threes.each do |yr|
739
1241
  fours.each do |yi|
@@ -930,7 +1432,7 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
930
1432
  f = 224.225
931
1433
  l = LongDecimal(f, 4)
932
1434
  assert_equal("0.0224225", l.to_s, "l=#{l.inspect} f=#{f.inspect}")
933
- assert_equal(l, (f/10000).to_ld(7), "to_ld")
1435
+ assert_equal(l, (f/10000).to_ld(7), "to_ld l=#{l} f=#{f}")
934
1436
  end
935
1437
 
936
1438
  #
@@ -1118,23 +1620,23 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1118
1620
  def test_round_to_scale_up
1119
1621
  print "\ntest_round_to_scale_up [#{Time.now}]: "
1120
1622
  l = LongDecimal("2.21")
1121
- r = l.round_to_scale(1, LongDecimal::ROUND_UP)
1623
+ r = l.round_to_scale(1, ROUND_UP)
1122
1624
  assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1123
1625
  assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1124
1626
  l = LongDecimal("-2.21")
1125
- r = l.round_to_scale(1, LongDecimal::ROUND_UP)
1627
+ r = l.round_to_scale(1, ROUND_UP)
1126
1628
  assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1127
1629
  assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1128
1630
  l = LongDecimal("2.20")
1129
- r = l.round_to_scale(1, LongDecimal::ROUND_UP)
1631
+ r = l.round_to_scale(1, ROUND_UP)
1130
1632
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1131
1633
  assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1132
1634
  l = LongDecimal("-2.20")
1133
- r = l.round_to_scale(1, LongDecimal::ROUND_UP)
1635
+ r = l.round_to_scale(1, ROUND_UP)
1134
1636
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1135
1637
  assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1136
1638
  l = LongDecimal("2.24")
1137
- r = l.round_to_scale(4, LongDecimal::ROUND_UP)
1639
+ r = l.round_to_scale(4, ROUND_UP)
1138
1640
  assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1139
1641
  end
1140
1642
 
@@ -1144,23 +1646,23 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1144
1646
  def test_round_to_scale_down
1145
1647
  print "\ntest_round_to_scale_down [#{Time.now}]: "
1146
1648
  l = LongDecimal("2.29")
1147
- r = l.round_to_scale(1, LongDecimal::ROUND_DOWN)
1649
+ r = l.round_to_scale(1, ROUND_DOWN)
1148
1650
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1149
1651
  assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1150
1652
  l = LongDecimal("-2.29")
1151
- r = l.round_to_scale(1, LongDecimal::ROUND_DOWN)
1653
+ r = l.round_to_scale(1, ROUND_DOWN)
1152
1654
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1153
1655
  assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1154
1656
  l = LongDecimal("2.20")
1155
- r = l.round_to_scale(1, LongDecimal::ROUND_DOWN)
1657
+ r = l.round_to_scale(1, ROUND_DOWN)
1156
1658
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1157
1659
  assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1158
1660
  l = LongDecimal("-2.20")
1159
- r = l.round_to_scale(1, LongDecimal::ROUND_DOWN)
1661
+ r = l.round_to_scale(1, ROUND_DOWN)
1160
1662
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1161
1663
  assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1162
1664
  l = LongDecimal("2.24")
1163
- r = l.round_to_scale(4, LongDecimal::ROUND_DOWN)
1665
+ r = l.round_to_scale(4, ROUND_DOWN)
1164
1666
  assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1165
1667
  end
1166
1668
 
@@ -1170,23 +1672,23 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1170
1672
  def test_round_to_scale_ceiling
1171
1673
  print "\ntest_round_to_scale_ceiling [#{Time.now}]: "
1172
1674
  l = LongDecimal("2.21")
1173
- r = l.round_to_scale(1, LongDecimal::ROUND_CEILING)
1675
+ r = l.round_to_scale(1, ROUND_CEILING)
1174
1676
  assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1175
1677
  assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1176
1678
  l = LongDecimal("-2.29")
1177
- r = l.round_to_scale(1, LongDecimal::ROUND_CEILING)
1679
+ r = l.round_to_scale(1, ROUND_CEILING)
1178
1680
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1179
1681
  assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1180
1682
  l = LongDecimal("2.20")
1181
- r = l.round_to_scale(1, LongDecimal::ROUND_CEILING)
1683
+ r = l.round_to_scale(1, ROUND_CEILING)
1182
1684
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1183
1685
  assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1184
1686
  l = LongDecimal("-2.20")
1185
- r = l.round_to_scale(1, LongDecimal::ROUND_CEILING)
1687
+ r = l.round_to_scale(1, ROUND_CEILING)
1186
1688
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1187
1689
  assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1188
1690
  l = LongDecimal("2.24")
1189
- r = l.round_to_scale(4, LongDecimal::ROUND_CEILING)
1691
+ r = l.round_to_scale(4, ROUND_CEILING)
1190
1692
  assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1191
1693
  end
1192
1694
 
@@ -1196,23 +1698,23 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1196
1698
  def test_round_to_scale_floor
1197
1699
  print "\ntest_round_to_scale_floor [#{Time.now}]: "
1198
1700
  l = LongDecimal("2.29")
1199
- r = l.round_to_scale(1, LongDecimal::ROUND_FLOOR)
1701
+ r = l.round_to_scale(1, ROUND_FLOOR)
1200
1702
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1201
1703
  assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1202
1704
  l = LongDecimal("-2.21")
1203
- r = l.round_to_scale(1, LongDecimal::ROUND_FLOOR)
1705
+ r = l.round_to_scale(1, ROUND_FLOOR)
1204
1706
  assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1205
1707
  assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1206
1708
  l = LongDecimal("2.20")
1207
- r = l.round_to_scale(1, LongDecimal::ROUND_FLOOR)
1709
+ r = l.round_to_scale(1, ROUND_FLOOR)
1208
1710
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1209
1711
  assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1210
1712
  l = LongDecimal("-2.20")
1211
- r = l.round_to_scale(1, LongDecimal::ROUND_FLOOR)
1713
+ r = l.round_to_scale(1, ROUND_FLOOR)
1212
1714
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1213
1715
  assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1214
1716
  l = LongDecimal("2.24")
1215
- r = l.round_to_scale(4, LongDecimal::ROUND_FLOOR)
1717
+ r = l.round_to_scale(4, ROUND_FLOOR)
1216
1718
  assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1217
1719
  end
1218
1720
 
@@ -1222,39 +1724,39 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1222
1724
  def test_round_to_scale_half_up
1223
1725
  print "\ntest_round_to_scale_half_up [#{Time.now}]: "
1224
1726
  l = LongDecimal("2.20")
1225
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
1727
+ r = l.round_to_scale(1, ROUND_HALF_UP)
1226
1728
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1227
1729
  assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1228
1730
  l = LongDecimal("2.21")
1229
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
1731
+ r = l.round_to_scale(1, ROUND_HALF_UP)
1230
1732
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1231
1733
  assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1232
1734
  l = LongDecimal("2.25")
1233
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
1735
+ r = l.round_to_scale(1, ROUND_HALF_UP)
1234
1736
  assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1235
1737
  assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1236
1738
  l = LongDecimal("2.29")
1237
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
1739
+ r = l.round_to_scale(1, ROUND_HALF_UP)
1238
1740
  assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1239
1741
  assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1240
1742
  l = LongDecimal("-2.20")
1241
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
1743
+ r = l.round_to_scale(1, ROUND_HALF_UP)
1242
1744
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1243
1745
  assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1244
1746
  l = LongDecimal("-2.21")
1245
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
1747
+ r = l.round_to_scale(1, ROUND_HALF_UP)
1246
1748
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1247
1749
  assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1248
1750
  l = LongDecimal("-2.25")
1249
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
1751
+ r = l.round_to_scale(1, ROUND_HALF_UP)
1250
1752
  assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1251
1753
  assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1252
1754
  l = LongDecimal("-2.29")
1253
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
1755
+ r = l.round_to_scale(1, ROUND_HALF_UP)
1254
1756
  assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1255
1757
  assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1256
1758
  l = LongDecimal("2.24")
1257
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_UP)
1759
+ r = l.round_to_scale(4, ROUND_HALF_UP)
1258
1760
  assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1259
1761
  end
1260
1762
 
@@ -1264,123 +1766,123 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1264
1766
  def test_round_to_scale_half_down
1265
1767
  print "\ntest_round_to_scale_half_down [#{Time.now}]: "
1266
1768
  l = LongDecimal("2.20")
1267
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
1769
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
1268
1770
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1269
1771
  assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1270
1772
  l = LongDecimal("2.21")
1271
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
1773
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
1272
1774
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1273
1775
  assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1274
1776
  l = LongDecimal("2.25")
1275
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
1777
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
1276
1778
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1277
1779
  assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1278
1780
  l = LongDecimal("2.29")
1279
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
1781
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
1280
1782
  assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1281
1783
  assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1282
1784
  l = LongDecimal("-2.20")
1283
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
1785
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
1284
1786
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1285
1787
  assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1286
1788
  l = LongDecimal("-2.21")
1287
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
1789
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
1288
1790
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1289
1791
  assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1290
1792
  l = LongDecimal("-2.25")
1291
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
1793
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
1292
1794
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1293
1795
  assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1294
1796
  l = LongDecimal("-2.29")
1295
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
1797
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
1296
1798
  assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1297
1799
  assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1298
1800
  l = LongDecimal("2.24")
1299
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_DOWN)
1801
+ r = l.round_to_scale(4, ROUND_HALF_DOWN)
1300
1802
  assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1301
1803
  end
1302
1804
 
1303
1805
  #
1304
1806
  # test rounding with ROUND_HALF_CEILING
1305
1807
  #
1306
- def test_round_to_scale_half_up
1307
- print "\ntest_round_to_scale_half_up [#{Time.now}]: "
1808
+ def test_round_to_scale_half_ceiling
1809
+ print "\ntest_round_to_scale_half_ceiling [#{Time.now}]: "
1308
1810
  l = LongDecimal("2.20")
1309
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1811
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
1310
1812
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1311
1813
  assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1312
1814
  l = LongDecimal("2.21")
1313
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1815
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
1314
1816
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1315
1817
  assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1316
1818
  l = LongDecimal("2.25")
1317
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1819
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
1318
1820
  assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1319
1821
  assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1320
1822
  l = LongDecimal("2.29")
1321
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1823
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
1322
1824
  assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1323
1825
  assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1324
1826
  l = LongDecimal("-2.20")
1325
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1827
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
1326
1828
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1327
1829
  assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1328
1830
  l = LongDecimal("-2.21")
1329
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1831
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
1330
1832
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1331
1833
  assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1332
1834
  l = LongDecimal("-2.25")
1333
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1835
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
1334
1836
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1335
1837
  assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1336
1838
  l = LongDecimal("-2.29")
1337
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1839
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
1338
1840
  assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1339
1841
  assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1340
1842
  l = LongDecimal("2.24")
1341
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_CEILING)
1843
+ r = l.round_to_scale(4, ROUND_HALF_CEILING)
1342
1844
  assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1343
1845
  end
1344
1846
 
1345
1847
  #
1346
1848
  # test rounding with ROUND_HALF_FLOOR
1347
1849
  #
1348
- def test_round_to_scale_half_down
1349
- print "\ntest_round_to_scale_half_down [#{Time.now}]: "
1850
+ def test_round_to_scale_half_floor
1851
+ print "\ntest_round_to_scale_half_floor [#{Time.now}]: "
1350
1852
  l = LongDecimal("2.20")
1351
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1853
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
1352
1854
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1353
1855
  assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1354
1856
  l = LongDecimal("2.21")
1355
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1857
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
1356
1858
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1357
1859
  assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1358
1860
  l = LongDecimal("2.25")
1359
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1861
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
1360
1862
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1361
1863
  assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1362
1864
  l = LongDecimal("2.29")
1363
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1865
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
1364
1866
  assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1365
1867
  assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1366
1868
  l = LongDecimal("-2.20")
1367
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1869
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
1368
1870
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1369
1871
  assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1370
1872
  l = LongDecimal("-2.21")
1371
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1873
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
1372
1874
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1373
1875
  assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1374
1876
  l = LongDecimal("-2.25")
1375
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1877
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
1376
1878
  assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1377
1879
  assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1378
1880
  l = LongDecimal("-2.29")
1379
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1881
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
1380
1882
  assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1381
1883
  assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1382
1884
  l = LongDecimal("2.24")
1383
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_FLOOR)
1885
+ r = l.round_to_scale(4, ROUND_HALF_FLOOR)
1384
1886
  assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1385
1887
  end
1386
1888
 
@@ -1390,64 +1892,755 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1390
1892
  def test_round_to_scale_half_even
1391
1893
  print "\ntest_round_to_scale_half_even [#{Time.now}]: "
1392
1894
  l = LongDecimal("2.20")
1393
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
1895
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
1394
1896
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1395
1897
  assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1396
1898
  l = LongDecimal("2.21")
1397
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
1899
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
1398
1900
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1399
1901
  assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1400
1902
  l = LongDecimal("2.25")
1401
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
1903
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
1402
1904
  assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1403
1905
  assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1404
1906
  l = LongDecimal("2.35")
1405
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
1907
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
1406
1908
  assert_equal("2.4", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1407
1909
  assert_equal("2.35", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1408
1910
  l = LongDecimal("2.29")
1409
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
1911
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
1410
1912
  assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1411
1913
  assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1412
1914
  l = LongDecimal("-2.20")
1413
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
1915
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
1414
1916
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1415
1917
  assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1416
1918
  l = LongDecimal("-2.21")
1417
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
1919
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
1418
1920
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1419
1921
  assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1420
1922
  l = LongDecimal("-2.25")
1421
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
1923
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
1422
1924
  assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1423
1925
  assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1424
1926
  l = LongDecimal("-2.35")
1425
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
1927
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
1426
1928
  assert_equal("-2.4", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1427
1929
  assert_equal("-2.35", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1428
1930
  l = LongDecimal("-2.29")
1429
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
1931
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
1430
1932
  assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1431
1933
  assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1432
1934
  l = LongDecimal("2.24")
1433
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_EVEN)
1935
+ r = l.round_to_scale(4, ROUND_HALF_EVEN)
1434
1936
  assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1435
1937
  end
1436
1938
 
1939
+ #
1940
+ # test rounding with ROUND_HALF_ODD
1941
+ #
1942
+ def test_round_to_scale_half_odd
1943
+ print "\ntest_round_to_scale_half_odd [#{Time.now}]: "
1944
+ l = LongDecimal("2.20")
1945
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
1946
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1947
+ assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1948
+ l = LongDecimal("2.21")
1949
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
1950
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1951
+ assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1952
+ l = LongDecimal("2.25")
1953
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
1954
+ assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1955
+ assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1956
+ l = LongDecimal("2.35")
1957
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
1958
+ assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1959
+ assert_equal("2.35", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1960
+ l = LongDecimal("2.29")
1961
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
1962
+ assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1963
+ assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1964
+ l = LongDecimal("-2.20")
1965
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
1966
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1967
+ assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1968
+ l = LongDecimal("-2.21")
1969
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
1970
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1971
+ assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1972
+ l = LongDecimal("-2.25")
1973
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
1974
+ assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1975
+ assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1976
+ l = LongDecimal("-2.35")
1977
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
1978
+ assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1979
+ assert_equal("-2.35", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1980
+ l = LongDecimal("-2.29")
1981
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
1982
+ assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1983
+ assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1984
+ l = LongDecimal("2.24")
1985
+ r = l.round_to_scale(4, ROUND_HALF_ODD)
1986
+ assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1987
+ end
1988
+
1989
+ #
1990
+ # test rounding with ROUND_GEOMETRIC_*
1991
+ #
1992
+ def test_round_to_scale_geometric_common
1993
+ print "\ntest_round_to_scale_geometric_common [#{Time.now}]: "
1994
+ ALL_ROUNDING_MODES.each do |rounding_mode|
1995
+ if (rounding_mode.major == MAJOR_GEOMETRIC)
1996
+ l = LongDecimal("0.00")
1997
+ r = l.round_to_scale(1, rounding_mode)
1998
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1999
+ assert_equal("0.00", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2000
+ l = LongDecimal("0.01")
2001
+ r = l.round_to_scale(1, rounding_mode)
2002
+ assert_equal("0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2003
+ assert_equal("0.01", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2004
+ l = LongDecimal("0.000001")
2005
+ r = l.round_to_scale(1, rounding_mode)
2006
+ assert_equal("0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2007
+ assert_equal("0.000001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2008
+ r = l.round_to_scale(0, rounding_mode)
2009
+ assert_equal("1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2010
+ assert_equal("0.000001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2011
+ l = LongDecimal("0.099999")
2012
+ r = l.round_to_scale(1, rounding_mode)
2013
+ assert_equal("0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2014
+ assert_equal("0.099999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2015
+ l = LongDecimal("-0.01")
2016
+ r = l.round_to_scale(1, rounding_mode)
2017
+ assert_equal("-0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2018
+ assert_equal("-0.01", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2019
+ l = LongDecimal("-0.000001")
2020
+ r = l.round_to_scale(1, rounding_mode)
2021
+ assert_equal("-0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2022
+ assert_equal("-0.000001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2023
+ r = l.round_to_scale(0, rounding_mode)
2024
+ assert_equal("-1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2025
+ l = LongDecimal("-0.099999")
2026
+ r = l.round_to_scale(1, rounding_mode)
2027
+ assert_equal("-0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2028
+ assert_equal("-0.099999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2029
+ l = LongDecimal("1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641")
2030
+ r = l.round_to_scale(0, rounding_mode)
2031
+ assert_equal("1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2032
+ assert_equal("1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2033
+ l = LongDecimal("1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327642")
2034
+ r = l.round_to_scale(0, rounding_mode)
2035
+ assert_equal("2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2036
+ assert_equal("1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327642", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2037
+ l = LongDecimal("-1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641")
2038
+ r = l.round_to_scale(0, rounding_mode)
2039
+ assert_equal("-1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2040
+ assert_equal("-1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2041
+ l = LongDecimal("-1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327642")
2042
+ r = l.round_to_scale(0, rounding_mode)
2043
+ assert_equal("-2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2044
+ assert_equal("-1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327642", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2045
+
2046
+ l = LongDecimal("2.20")
2047
+ r = l.round_to_scale(1, rounding_mode)
2048
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2049
+ assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2050
+ l = LongDecimal("2.21")
2051
+ r = l.round_to_scale(1, rounding_mode)
2052
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2053
+ assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2054
+ l = LongDecimal("2.25")
2055
+ r = l.round_to_scale(1, rounding_mode)
2056
+ assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2057
+ assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2058
+ l = LongDecimal("2.29")
2059
+ r = l.round_to_scale(1, rounding_mode)
2060
+ assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2061
+ assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2062
+ l = LongDecimal("-2.20")
2063
+ r = l.round_to_scale(1, rounding_mode)
2064
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2065
+ assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2066
+ l = LongDecimal("-2.21")
2067
+ r = l.round_to_scale(1, rounding_mode)
2068
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2069
+ assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2070
+ l = LongDecimal("-2.25")
2071
+ r = l.round_to_scale(1, rounding_mode)
2072
+ assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2073
+ assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2074
+ l = LongDecimal("-2.29")
2075
+ r = l.round_to_scale(1, rounding_mode)
2076
+ assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2077
+ assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2078
+ l = LongDecimal("2.24")
2079
+ r = l.round_to_scale(4, rounding_mode)
2080
+ assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2081
+ end
2082
+ end
2083
+ end
2084
+
2085
+ #
2086
+ # test rounding with ROUND_HARMONIC_*
2087
+ #
2088
+ def test_round_to_scale_harmonic_common
2089
+ print "\ntest_round_to_scale_harmonic_common [#{Time.now}]: "
2090
+ ALL_ROUNDING_MODES.each do |rounding_mode|
2091
+ if (rounding_mode.major == MAJOR_HARMONIC)
2092
+ l = LongDecimal("0.00")
2093
+ r = l.round_to_scale(1, rounding_mode)
2094
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2095
+ assert_equal("0.00", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2096
+ l = LongDecimal("0.01")
2097
+ r = l.round_to_scale(1, rounding_mode)
2098
+ assert_equal("0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2099
+ assert_equal("0.01", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2100
+ l = LongDecimal("0.000001")
2101
+ r = l.round_to_scale(1, rounding_mode)
2102
+ assert_equal("0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2103
+ assert_equal("0.000001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2104
+ r = l.round_to_scale(0, rounding_mode)
2105
+ assert_equal("1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2106
+ assert_equal("0.000001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2107
+ l = LongDecimal("0.099999")
2108
+ r = l.round_to_scale(1, rounding_mode)
2109
+ assert_equal("0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2110
+ assert_equal("0.099999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2111
+ l = LongDecimal("-0.01")
2112
+ r = l.round_to_scale(1, rounding_mode)
2113
+ assert_equal("-0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2114
+ assert_equal("-0.01", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2115
+ l = LongDecimal("-0.000001")
2116
+ r = l.round_to_scale(1, rounding_mode)
2117
+ assert_equal("-0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2118
+ assert_equal("-0.000001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2119
+ r = l.round_to_scale(0, rounding_mode)
2120
+ assert_equal("-1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2121
+ l = LongDecimal("-0.099999")
2122
+ r = l.round_to_scale(1, rounding_mode)
2123
+ assert_equal("-0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2124
+ assert_equal("-0.099999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2125
+
2126
+ # harmonic mean of 1 and 2 is 4/3
2127
+ l = LongDecimal("1.33333333333333333333333333333333333333333333")
2128
+ r = l.round_to_scale(0, rounding_mode)
2129
+ assert_equal("1", r.to_s, "l=#{l.inspect} r=#{r.inspect} rounding_mode=#{rounding_mode}")
2130
+ assert_equal("1.33333333333333333333333333333333333333333333", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2131
+ l = LongDecimal("1.33333333333333333333333333333333333333333334")
2132
+ r = l.round_to_scale(0, rounding_mode)
2133
+ assert_equal("2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2134
+ assert_equal("1.33333333333333333333333333333333333333333334", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2135
+ l = LongDecimal("-1.33333333333333333333333333333333333333333333")
2136
+ r = l.round_to_scale(0, rounding_mode)
2137
+ assert_equal("-1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2138
+ assert_equal("-1.33333333333333333333333333333333333333333333", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2139
+ l = LongDecimal("-1.33333333333333333333333333333333333333333334")
2140
+ r = l.round_to_scale(0, rounding_mode)
2141
+ assert_equal("-2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2142
+ assert_equal("-1.33333333333333333333333333333333333333333334", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2143
+
2144
+ l = LongDecimal("2.20")
2145
+ r = l.round_to_scale(1, rounding_mode)
2146
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2147
+ assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2148
+ l = LongDecimal("2.21")
2149
+ r = l.round_to_scale(1, rounding_mode)
2150
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2151
+ assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2152
+ l = LongDecimal("2.25")
2153
+ r = l.round_to_scale(1, rounding_mode)
2154
+ assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2155
+ assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2156
+ l = LongDecimal("2.29")
2157
+ r = l.round_to_scale(1, rounding_mode)
2158
+ assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2159
+ assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2160
+ l = LongDecimal("-2.20")
2161
+ r = l.round_to_scale(1, rounding_mode)
2162
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2163
+ assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2164
+ l = LongDecimal("-2.21")
2165
+ r = l.round_to_scale(1, rounding_mode)
2166
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2167
+ assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2168
+ l = LongDecimal("-2.25")
2169
+ r = l.round_to_scale(1, rounding_mode)
2170
+ assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2171
+ assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2172
+ l = LongDecimal("-2.29")
2173
+ r = l.round_to_scale(1, rounding_mode)
2174
+ assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2175
+ assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2176
+ l = LongDecimal("2.24")
2177
+ r = l.round_to_scale(4, rounding_mode)
2178
+ assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2179
+ end
2180
+ end
2181
+ end
2182
+
2183
+ #
2184
+ # test rounding with ROUND_HARMONIC_UP
2185
+ #
2186
+ def test_round_to_scale_harmonic_up
2187
+ print "\ntest_round_to_scale_harmonic_up [#{Time.now}]: "
2188
+ l = LongDecimal("2.39")
2189
+ r = l.round_to_scale(0, ROUND_HARMONIC_UP)
2190
+ assert_equal("2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2191
+ assert_equal("2.39", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2192
+ l = LongDecimal("2.40")
2193
+ r = l.round_to_scale(0, ROUND_HARMONIC_UP)
2194
+ assert_equal("3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2195
+ assert_equal("2.40", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2196
+ l = LongDecimal("2.41")
2197
+ r = l.round_to_scale(0, ROUND_HARMONIC_UP)
2198
+ assert_equal("3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2199
+ assert_equal("2.41", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2200
+ l = LongDecimal("-2.39")
2201
+ r = l.round_to_scale(0, ROUND_HARMONIC_UP)
2202
+ assert_equal("-2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2203
+ assert_equal("-2.39", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2204
+ l = LongDecimal("-2.40")
2205
+ r = l.round_to_scale(0, ROUND_HARMONIC_UP)
2206
+ assert_equal("-3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2207
+ assert_equal("-2.40", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2208
+ l = LongDecimal("12.47999")
2209
+ r = l.round_to_scale(0, ROUND_HARMONIC_UP)
2210
+ assert_equal("12", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2211
+ assert_equal("12.47999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2212
+ l = LongDecimal("12.48")
2213
+ r = l.round_to_scale(0, ROUND_HARMONIC_UP)
2214
+ assert_equal("13", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2215
+ assert_equal("12.48", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2216
+ l = LongDecimal("12.48001")
2217
+ r = l.round_to_scale(0, ROUND_HARMONIC_UP)
2218
+ assert_equal("13", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2219
+ assert_equal("12.48001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2220
+ end
2221
+
2222
+ #
2223
+ # test rounding with ROUND_HARMONIC_DOWN
2224
+ #
2225
+ def test_round_to_scale_harmonic_down
2226
+ print "\ntest_round_to_scale_harmonic_down [#{Time.now}]: "
2227
+ l = LongDecimal("2.39")
2228
+ r = l.round_to_scale(0, ROUND_HARMONIC_DOWN)
2229
+ assert_equal("2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2230
+ assert_equal("2.39", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2231
+ l = LongDecimal("2.40")
2232
+ r = l.round_to_scale(0, ROUND_HARMONIC_DOWN)
2233
+ assert_equal("2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2234
+ assert_equal("2.40", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2235
+ l = LongDecimal("2.41")
2236
+ r = l.round_to_scale(0, ROUND_HARMONIC_DOWN)
2237
+ assert_equal("3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2238
+ assert_equal("2.41", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2239
+ l = LongDecimal("-2.39")
2240
+ r = l.round_to_scale(0, ROUND_HARMONIC_DOWN)
2241
+ assert_equal("-2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2242
+ assert_equal("-2.39", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2243
+ l = LongDecimal("-2.40")
2244
+ r = l.round_to_scale(0, ROUND_HARMONIC_DOWN)
2245
+ assert_equal("-2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2246
+ assert_equal("-2.40", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2247
+ l = LongDecimal("12.47999")
2248
+ r = l.round_to_scale(0, ROUND_HARMONIC_DOWN)
2249
+ assert_equal("12", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2250
+ assert_equal("12.47999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2251
+ l = LongDecimal("12.48")
2252
+ r = l.round_to_scale(0, ROUND_HARMONIC_DOWN)
2253
+ assert_equal("12", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2254
+ assert_equal("12.48", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2255
+ l = LongDecimal("12.48001")
2256
+ r = l.round_to_scale(0, ROUND_HARMONIC_DOWN)
2257
+ assert_equal("13", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2258
+ assert_equal("12.48001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2259
+ end
2260
+
2261
+ #
2262
+ # test rounding with ROUND_HARMONIC_CEILING
2263
+ #
2264
+ def test_round_to_scale_harmonic_ceiling
2265
+ print "\ntest_round_to_scale_harmonic_ceiling [#{Time.now}]: "
2266
+ l = LongDecimal("2.39")
2267
+ r = l.round_to_scale(0, ROUND_HARMONIC_CEILING)
2268
+ assert_equal("2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2269
+ assert_equal("2.39", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2270
+ l = LongDecimal("2.40")
2271
+ r = l.round_to_scale(0, ROUND_HARMONIC_CEILING)
2272
+ assert_equal("3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2273
+ assert_equal("2.40", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2274
+ l = LongDecimal("2.41")
2275
+ r = l.round_to_scale(0, ROUND_HARMONIC_CEILING)
2276
+ assert_equal("3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2277
+ assert_equal("2.41", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2278
+ l = LongDecimal("-2.39")
2279
+ r = l.round_to_scale(0, ROUND_HARMONIC_CEILING)
2280
+ assert_equal("-2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2281
+ assert_equal("-2.39", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2282
+ l = LongDecimal("-2.40")
2283
+ r = l.round_to_scale(0, ROUND_HARMONIC_CEILING)
2284
+ assert_equal("-2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2285
+ assert_equal("-2.40", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2286
+ l = LongDecimal("12.47999")
2287
+ r = l.round_to_scale(0, ROUND_HARMONIC_CEILING)
2288
+ assert_equal("12", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2289
+ assert_equal("12.47999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2290
+ l = LongDecimal("12.48")
2291
+ r = l.round_to_scale(0, ROUND_HARMONIC_CEILING)
2292
+ assert_equal("13", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2293
+ assert_equal("12.48", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2294
+ l = LongDecimal("12.48001")
2295
+ r = l.round_to_scale(0, ROUND_HARMONIC_CEILING)
2296
+ assert_equal("13", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2297
+ assert_equal("12.48001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2298
+ end
2299
+
2300
+ #
2301
+ # test rounding with ROUND_HARMONIC_FLOOR
2302
+ #
2303
+ def test_round_to_scale_harmonic_floor
2304
+ print "\ntest_round_to_scale_harmonic_floor [#{Time.now}]: "
2305
+ l = LongDecimal("2.39")
2306
+ r = l.round_to_scale(0, ROUND_HARMONIC_FLOOR)
2307
+ assert_equal("2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2308
+ assert_equal("2.39", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2309
+ l = LongDecimal("2.40")
2310
+ r = l.round_to_scale(0, ROUND_HARMONIC_FLOOR)
2311
+ assert_equal("2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2312
+ assert_equal("2.40", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2313
+ l = LongDecimal("2.41")
2314
+ r = l.round_to_scale(0, ROUND_HARMONIC_FLOOR)
2315
+ assert_equal("3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2316
+ assert_equal("2.41", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2317
+ l = LongDecimal("-2.39")
2318
+ r = l.round_to_scale(0, ROUND_HARMONIC_FLOOR)
2319
+ assert_equal("-2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2320
+ assert_equal("-2.39", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2321
+ l = LongDecimal("-2.40")
2322
+ r = l.round_to_scale(0, ROUND_HARMONIC_FLOOR)
2323
+ assert_equal("-3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2324
+ assert_equal("-2.40", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2325
+ l = LongDecimal("12.47999")
2326
+ r = l.round_to_scale(0, ROUND_HARMONIC_FLOOR)
2327
+ assert_equal("12", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2328
+ assert_equal("12.47999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2329
+ l = LongDecimal("12.48")
2330
+ r = l.round_to_scale(0, ROUND_HARMONIC_FLOOR)
2331
+ assert_equal("12", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2332
+ assert_equal("12.48", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2333
+ l = LongDecimal("12.48001")
2334
+ r = l.round_to_scale(0, ROUND_HARMONIC_FLOOR)
2335
+ assert_equal("13", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2336
+ assert_equal("12.48001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2337
+ end
2338
+
2339
+ #
2340
+ # test rounding with ROUND_HARMONIC_EVEN
2341
+ #
2342
+ def test_round_to_scale_harmonic_even
2343
+ print "\ntest_round_to_scale_harmonic_even [#{Time.now}]: "
2344
+ l = LongDecimal("2.39")
2345
+ r = l.round_to_scale(0, ROUND_HARMONIC_EVEN)
2346
+ assert_equal("2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2347
+ assert_equal("2.39", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2348
+ l = LongDecimal("2.40")
2349
+ r = l.round_to_scale(0, ROUND_HARMONIC_EVEN)
2350
+ assert_equal("2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2351
+ assert_equal("2.40", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2352
+ l = LongDecimal("2.41")
2353
+ r = l.round_to_scale(0, ROUND_HARMONIC_EVEN)
2354
+ assert_equal("3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2355
+ assert_equal("2.41", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2356
+ l = LongDecimal("-2.39")
2357
+ r = l.round_to_scale(0, ROUND_HARMONIC_EVEN)
2358
+ assert_equal("-2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2359
+ assert_equal("-2.39", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2360
+ l = LongDecimal("-2.40")
2361
+ r = l.round_to_scale(0, ROUND_HARMONIC_EVEN)
2362
+ assert_equal("-2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2363
+ assert_equal("-2.40", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2364
+ l = LongDecimal("12.47999")
2365
+ r = l.round_to_scale(0, ROUND_HARMONIC_EVEN)
2366
+ assert_equal("12", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2367
+ assert_equal("12.47999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2368
+ l = LongDecimal("12.48")
2369
+ r = l.round_to_scale(0, ROUND_HARMONIC_EVEN)
2370
+ assert_equal("12", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2371
+ assert_equal("12.48", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2372
+ l = LongDecimal("12.48001")
2373
+ r = l.round_to_scale(0, ROUND_HARMONIC_EVEN)
2374
+ assert_equal("13", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2375
+ assert_equal("12.48001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2376
+ end
2377
+
2378
+ #
2379
+ # test rounding with ROUND_HARMONIC_ODD
2380
+ #
2381
+ def test_round_to_scale_harmonic_even
2382
+ print "\ntest_round_to_scale_harmonic_even [#{Time.now}]: "
2383
+ l = LongDecimal("2.39")
2384
+ r = l.round_to_scale(0, ROUND_HARMONIC_ODD)
2385
+ assert_equal("2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2386
+ assert_equal("2.39", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2387
+ l = LongDecimal("2.40")
2388
+ r = l.round_to_scale(0, ROUND_HARMONIC_ODD)
2389
+ assert_equal("3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2390
+ assert_equal("2.40", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2391
+ l = LongDecimal("2.41")
2392
+ r = l.round_to_scale(0, ROUND_HARMONIC_ODD)
2393
+ assert_equal("3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2394
+ assert_equal("2.41", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2395
+ l = LongDecimal("-2.39")
2396
+ r = l.round_to_scale(0, ROUND_HARMONIC_ODD)
2397
+ assert_equal("-2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2398
+ assert_equal("-2.39", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2399
+ l = LongDecimal("-2.40")
2400
+ r = l.round_to_scale(0, ROUND_HARMONIC_ODD)
2401
+ assert_equal("-3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2402
+ assert_equal("-2.40", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2403
+ l = LongDecimal("12.47999")
2404
+ r = l.round_to_scale(0, ROUND_HARMONIC_ODD)
2405
+ assert_equal("12", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2406
+ assert_equal("12.47999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2407
+ l = LongDecimal("12.48")
2408
+ r = l.round_to_scale(0, ROUND_HARMONIC_ODD)
2409
+ assert_equal("13", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2410
+ assert_equal("12.48", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2411
+ l = LongDecimal("12.48001")
2412
+ r = l.round_to_scale(0, ROUND_HARMONIC_ODD)
2413
+ assert_equal("13", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2414
+ assert_equal("12.48001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2415
+ end
2416
+
2417
+ #
2418
+ # test rounding with ROUND_QUADRATIC_*
2419
+ #
2420
+ def test_round_to_scale_quadratic_common
2421
+ print "\ntest_round_to_scale_quadratic_common [#{Time.now}]: "
2422
+ ALL_ROUNDING_MODES.each do |rounding_mode|
2423
+ if (rounding_mode.major == MAJOR_QUADRATIC)
2424
+ l = LongDecimal("0.00")
2425
+ r = l.round_to_scale(1, rounding_mode)
2426
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2427
+ assert_equal("0.00", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2428
+ l = LongDecimal("0.01")
2429
+ r = l.round_to_scale(1, rounding_mode)
2430
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2431
+ assert_equal("0.01", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2432
+ l = LongDecimal("0.000001")
2433
+ r = l.round_to_scale(1, rounding_mode)
2434
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2435
+ assert_equal("0.000001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2436
+ r = l.round_to_scale(0, rounding_mode)
2437
+ assert_equal("0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2438
+ assert_equal("0.000001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2439
+ l = LongDecimal("0.099999")
2440
+ r = l.round_to_scale(1, rounding_mode)
2441
+ assert_equal("0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2442
+ assert_equal("0.099999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2443
+ l = LongDecimal("-0.01")
2444
+ r = l.round_to_scale(1, rounding_mode)
2445
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2446
+ assert_equal("-0.01", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2447
+ l = LongDecimal("-0.000001")
2448
+ r = l.round_to_scale(1, rounding_mode)
2449
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2450
+ assert_equal("-0.000001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2451
+ r = l.round_to_scale(0, rounding_mode)
2452
+ assert_equal("0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2453
+ l = LongDecimal("-0.099999")
2454
+ r = l.round_to_scale(1, rounding_mode)
2455
+ assert_equal("-0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2456
+ assert_equal("-0.099999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2457
+
2458
+ # sqrt(2) is the quadratic mean of 0 and 2: 0.7071067811865475244008443621048490392848359376884740365883398689953662392310535194251937671638207864
2459
+ l = LongDecimal("0.7071067811")
2460
+ r = l.round_to_scale(0, rounding_mode)
2461
+ assert_equal("0", r.to_s, "l=#{l.inspect} r=#{r.inspect} rounding_mode=#{rounding_mode}")
2462
+ assert_equal("0.7071067811", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2463
+ l = LongDecimal("0.7071067812")
2464
+ r = l.round_to_scale(0, rounding_mode)
2465
+ assert_equal("1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2466
+ assert_equal("0.7071067812", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2467
+ l = LongDecimal("-0.7071067811")
2468
+ r = l.round_to_scale(0, rounding_mode)
2469
+ assert_equal("0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2470
+ assert_equal("-0.7071067811", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2471
+ l = LongDecimal("-0.7071067812")
2472
+ r = l.round_to_scale(0, rounding_mode)
2473
+ assert_equal("-1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2474
+ assert_equal("-0.7071067812", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2475
+
2476
+ l = LongDecimal("1.5811388300")
2477
+ r = l.round_to_scale(0, rounding_mode)
2478
+ assert_equal("1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2479
+ assert_equal("1.5811388300", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2480
+ l = LongDecimal("1.5811388301")
2481
+ r = l.round_to_scale(0, rounding_mode)
2482
+ assert_equal("2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2483
+ assert_equal("1.5811388301", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2484
+
2485
+ l = LongDecimal("2.20")
2486
+ r = l.round_to_scale(1, rounding_mode)
2487
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2488
+ assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2489
+ l = LongDecimal("2.21")
2490
+ r = l.round_to_scale(1, rounding_mode)
2491
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2492
+ assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2493
+ l = LongDecimal("2.25")
2494
+ r = l.round_to_scale(1, rounding_mode)
2495
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2496
+ assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2497
+ l = LongDecimal("2.29")
2498
+ r = l.round_to_scale(1, rounding_mode)
2499
+ assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2500
+ assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2501
+ l = LongDecimal("-2.20")
2502
+ r = l.round_to_scale(1, rounding_mode)
2503
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2504
+ assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2505
+ l = LongDecimal("-2.21")
2506
+ r = l.round_to_scale(1, rounding_mode)
2507
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2508
+ assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2509
+ l = LongDecimal("-2.25")
2510
+ r = l.round_to_scale(1, rounding_mode)
2511
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2512
+ assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2513
+ l = LongDecimal("-2.29")
2514
+ r = l.round_to_scale(1, rounding_mode)
2515
+ assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2516
+ assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2517
+ l = LongDecimal("2.24")
2518
+ r = l.round_to_scale(4, rounding_mode)
2519
+ assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2520
+ end
2521
+ end
2522
+ end
2523
+
2524
+ #
2525
+ # test rounding with ROUND_CUBIC_*
2526
+ #
2527
+ def test_round_to_scale_cubic_common
2528
+ print "\ntest_round_to_scale_cubic_common [#{Time.now}]: "
2529
+ ALL_ROUNDING_MODES.each do |rounding_mode|
2530
+ if (rounding_mode.major == MAJOR_CUBIC)
2531
+ l = LongDecimal("0.00")
2532
+ r = l.round_to_scale(1, rounding_mode)
2533
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2534
+ assert_equal("0.00", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2535
+ l = LongDecimal("0.01")
2536
+ r = l.round_to_scale(1, rounding_mode)
2537
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2538
+ assert_equal("0.01", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2539
+ l = LongDecimal("0.000001")
2540
+ r = l.round_to_scale(1, rounding_mode)
2541
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2542
+ assert_equal("0.000001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2543
+ r = l.round_to_scale(0, rounding_mode)
2544
+ assert_equal("0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2545
+ assert_equal("0.000001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2546
+ l = LongDecimal("0.099999")
2547
+ r = l.round_to_scale(1, rounding_mode)
2548
+ assert_equal("0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2549
+ assert_equal("0.099999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2550
+ l = LongDecimal("-0.01")
2551
+ r = l.round_to_scale(1, rounding_mode)
2552
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2553
+ assert_equal("-0.01", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2554
+ l = LongDecimal("-0.000001")
2555
+ r = l.round_to_scale(1, rounding_mode)
2556
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2557
+ assert_equal("-0.000001", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2558
+ r = l.round_to_scale(0, rounding_mode)
2559
+ assert_equal("0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2560
+ l = LongDecimal("-0.099999")
2561
+ r = l.round_to_scale(1, rounding_mode)
2562
+ assert_equal("-0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2563
+ assert_equal("-0.099999", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2564
+
2565
+ l = LongDecimal("0.7937005259")
2566
+ r = l.round_to_scale(0, rounding_mode)
2567
+ assert_equal("0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2568
+ assert_equal("0.7937005259", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2569
+ l = LongDecimal("0.7937005260")
2570
+ r = l.round_to_scale(0, rounding_mode)
2571
+ assert_equal("1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2572
+ assert_equal("0.7937005260", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2573
+ l = LongDecimal("-0.7937005259")
2574
+ r = l.round_to_scale(0, rounding_mode)
2575
+ assert_equal("0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2576
+ assert_equal("-0.7937005259", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2577
+ l = LongDecimal("-0.7937005260")
2578
+ r = l.round_to_scale(0, rounding_mode)
2579
+ assert_equal("-1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2580
+ assert_equal("-0.7937005260", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2581
+
2582
+ l = LongDecimal("1.6509636244")
2583
+ r = l.round_to_scale(0, rounding_mode)
2584
+ assert_equal("1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2585
+ assert_equal("1.6509636244", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2586
+ l = LongDecimal("1.6509636245")
2587
+ r = l.round_to_scale(0, rounding_mode)
2588
+ assert_equal("2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2589
+ assert_equal("1.6509636245", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2590
+
2591
+ l = LongDecimal("2.20")
2592
+ r = l.round_to_scale(1, rounding_mode)
2593
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2594
+ assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2595
+ l = LongDecimal("2.21")
2596
+ r = l.round_to_scale(1, rounding_mode)
2597
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2598
+ assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2599
+ l = LongDecimal("2.25")
2600
+ r = l.round_to_scale(1, rounding_mode)
2601
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2602
+ assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2603
+ l = LongDecimal("2.29")
2604
+ r = l.round_to_scale(1, rounding_mode)
2605
+ assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2606
+ assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2607
+ l = LongDecimal("-2.20")
2608
+ r = l.round_to_scale(1, rounding_mode)
2609
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2610
+ assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2611
+ l = LongDecimal("-2.21")
2612
+ r = l.round_to_scale(1, rounding_mode)
2613
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2614
+ assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2615
+ l = LongDecimal("-2.25")
2616
+ r = l.round_to_scale(1, rounding_mode)
2617
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2618
+ assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2619
+ l = LongDecimal("-2.29")
2620
+ r = l.round_to_scale(1, rounding_mode)
2621
+ assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2622
+ assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2623
+ l = LongDecimal("2.24")
2624
+ r = l.round_to_scale(4, rounding_mode)
2625
+ assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2626
+ end
2627
+ end
2628
+ end
2629
+
1437
2630
  #
1438
2631
  # test rounding with ROUND_UNNECESSARY
1439
2632
  #
1440
2633
  def test_round_to_scale_unnecessary
1441
2634
  print "\ntest_round_to_scale_unnecessary [#{Time.now}]: "
1442
2635
  l = LongDecimal("2.24")
1443
- r = l.round_to_scale(4, LongDecimal::ROUND_UNNECESSARY)
2636
+ r = l.round_to_scale(4, ROUND_UNNECESSARY)
1444
2637
  assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1445
2638
  l = LongDecimal("2.2400")
1446
- r = l.round_to_scale(2, LongDecimal::ROUND_UNNECESSARY)
2639
+ r = l.round_to_scale(2, ROUND_UNNECESSARY)
1447
2640
  assert_equal("2.24", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1448
2641
  begin
1449
2642
  l = LongDecimal("2.24")
1450
- r = l.round_to_scale(1, LongDecimal::ROUND_UNNECESSARY)
2643
+ r = l.round_to_scale(1, ROUND_UNNECESSARY)
1451
2644
  assert_fail("should not have succeeded l=#{l.inspect} r=#{r.inspect}")
1452
2645
  rescue ArgumentError
1453
2646
  # ignored
@@ -1458,23 +2651,23 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1458
2651
  # test rounding of int to remainder set
1459
2652
  #
1460
2653
  def test_int_round_to_one_allowed_remainder
1461
- print "\ntest_int_round_to_one_allowed_remainder [#{Time.now}] (20min): "
2654
+ print "\ntest_int_round_to_one_allowed_remainder [#{Time.now}] (20sec): "
1462
2655
  $stdout.flush
1463
2656
  2.upto 20 do |modulus|
1464
2657
  0.upto modulus-1 do |r|
2658
+ print "."
1465
2659
  n = 3*modulus
1466
2660
  (-n).upto n do |i|
1467
2661
  text = "i=#{i} n=#{n} m=#{modulus} r=#{r}"
1468
- print ":"
1469
2662
  $stdout.flush
1470
2663
 
1471
- i_rounded = check_round_to_one_remainder(i, r, modulus, LongDecimalRoundingMode::ROUND_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2664
+ i_rounded = check_round_to_one_remainder(i, r, modulus, ROUND_UP, ZERO_ROUND_TO_PLUS)
1472
2665
  assert(i_rounded.abs >= i.abs, "i_r=#{i_rounded} " + text)
1473
2666
  if (i == 0) then
1474
2667
  assert(i_rounded >= 0, "i_r=#{i_rounded} " + text)
1475
2668
  end
1476
2669
 
1477
- i_rounded = check_round_to_one_remainder(i, r, modulus, LongDecimalRoundingMode::ROUND_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2670
+ i_rounded = check_round_to_one_remainder(i, r, modulus, ROUND_DOWN, ZERO_ROUND_TO_PLUS)
1478
2671
  if (i > 0)
1479
2672
  assert(i_rounded <= i, "i_r=#{i_rounded} " + text)
1480
2673
  elsif (i < 0)
@@ -1485,39 +2678,75 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1485
2678
  raise("i=#{i} i_r=#{i_rounded}")
1486
2679
  end
1487
2680
 
1488
- i_rounded = check_round_to_one_remainder(i, r, modulus, LongDecimalRoundingMode::ROUND_CEILING, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2681
+ i_rounded = check_round_to_one_remainder(i, r, modulus, ROUND_CEILING, ZERO_ROUND_TO_PLUS)
1489
2682
  assert(i_rounded >= i, "i_r=#{i_rounded} " + text)
1490
2683
 
1491
- i_rounded = check_round_to_one_remainder(i, r, modulus, LongDecimalRoundingMode::ROUND_FLOOR, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2684
+ i_rounded = check_round_to_one_remainder(i, r, modulus, ROUND_FLOOR, ZERO_ROUND_TO_PLUS)
1492
2685
  assert(i_rounded <= i, "i_r=#{i_rounded} " + text)
1493
2686
 
1494
- i_rounded = check_round_to_one_remainder(i, r, modulus, LongDecimalRoundingMode::ROUND_HALF_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2687
+ i_rounded = check_round_to_one_remainder(i, r, modulus, ROUND_HALF_UP, ZERO_ROUND_TO_PLUS)
1495
2688
  dd = 2*(i_rounded - i).abs
1496
2689
  assert(dd <= modulus, "i_r=#{i_rounded} " + text)
1497
2690
  if (i_rounded.abs < i.abs || i_rounded.sgn == - i.sgn)
1498
2691
  assert(dd < modulus, "i_r=#{i_rounded} " + text)
1499
2692
  end
1500
2693
 
1501
- i_rounded = check_round_to_one_remainder(i, r, modulus, LongDecimalRoundingMode::ROUND_HALF_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2694
+ i_rounded = check_round_to_one_remainder(i, r, modulus, ROUND_HALF_DOWN, ZERO_ROUND_TO_PLUS)
1502
2695
  dd = 2*(i_rounded - i).abs
1503
2696
  assert(dd <= modulus, "i_r=#{i_rounded} " + text)
1504
2697
  if (i_rounded.abs > i.abs && i_rounded.sgn == i.sgn)
1505
2698
  assert(dd < modulus, "i_r=#{i_rounded} " + text)
1506
2699
  end
1507
2700
 
1508
- i_rounded = check_round_to_one_remainder(i, r, modulus, LongDecimalRoundingMode::ROUND_HALF_CEILING, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2701
+ i_rounded = check_round_to_one_remainder(i, r, modulus, ROUND_HALF_CEILING, ZERO_ROUND_TO_PLUS)
1509
2702
  dd = 2*(i_rounded - i).abs
1510
2703
  assert(dd <= modulus, "i_r=#{i_rounded} " + text)
1511
2704
  if (i_rounded < i)
1512
2705
  assert(dd < modulus, "i_r=#{i_rounded} " + text)
1513
2706
  end
1514
2707
 
1515
- i_rounded = check_round_to_one_remainder(i, r, modulus, LongDecimalRoundingMode::ROUND_HALF_FLOOR, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2708
+ i_rounded = check_round_to_one_remainder(i, r, modulus, ROUND_HALF_FLOOR, ZERO_ROUND_TO_PLUS)
1516
2709
  dd = 2*(i_rounded - i).abs
1517
2710
  assert(dd <= modulus, "i_r=#{i_rounded} " + text)
1518
2711
  if (i_rounded > i && i != 0)
1519
2712
  assert(dd < modulus, "i_r=#{i_rounded} " + text)
1520
2713
  end
2714
+
2715
+ ALL_ROUNDING_MODES.each do |rounding_mode|
2716
+ unless (rounding_mode.major == MAJOR_GEOMETRIC \
2717
+ || rounding_mode.major == MAJOR_HARMONIC \
2718
+ || rounding_mode.major == MAJOR_QUADRATIC \
2719
+ || rounding_mode.major == MAJOR_CUBIC)
2720
+ next;
2721
+ end
2722
+ if (rounding_mode.minor == MINOR_EVEN || rounding_mode.minor == MINOR_ODD)
2723
+ next
2724
+ end
2725
+ i_rounded = check_round_to_one_remainder(i, r, modulus, rounding_mode, ZERO_ROUND_TO_PLUS)
2726
+ end
2727
+ end
2728
+ end
2729
+ end
2730
+ end
2731
+
2732
+ #
2733
+ # test rounding of int to remainder set
2734
+ #
2735
+ def test_zero_round_to_zero_as_allowed_remainder
2736
+ print "\ntest_zero_round_to_zero_as_allowed_remainder [#{Time.now}]: "
2737
+
2738
+ 2.upto 20 do |modulus|
2739
+ text = "m=#{modulus}"
2740
+ ALL_ROUNDING_MODES.each do |rounding_mode|
2741
+ if (rounding_mode.minor == MINOR_EVEN || rounding_mode.minor == MINOR_ODD)
2742
+ next
2743
+ end
2744
+ if (rounding_mode.major == MAJOR_UNNECESSARY)
2745
+ next
2746
+ end
2747
+ ALL_ZERO_MODES.each do |zero_mode|
2748
+ zero_rounded = 0.round_to_allowed_remainders([0], modulus, rounding_mode, zero_mode)
2749
+ assert_equal(0, zero_rounded)
1521
2750
  end
1522
2751
  end
1523
2752
  end
@@ -1532,104 +2761,91 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1532
2761
  0.upto modulus-1 do |r|
1533
2762
  text = "m=#{modulus} r=#{r}"
1534
2763
 
1535
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2764
+ zero_r = check_round_to_one_remainder(0, r, modulus, ROUND_UP, ZERO_ROUND_TO_PLUS)
1536
2765
  assert(zero_r >= 0, "0_r=#{zero_r} " + text)
1537
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_MINUS)
2766
+ zero_r = check_round_to_one_remainder(0, r, modulus, ROUND_UP, ZERO_ROUND_TO_MINUS)
1538
2767
  assert(zero_r <= 0, "0_r=#{zero_r} " + text)
1539
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
2768
+ zero_r = check_round_to_one_remainder(0, r, modulus, ROUND_UP, ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
1540
2769
  dd = 2*zero_r.abs
1541
2770
  assert(dd <= modulus, "0_r=#{zero_r} " + text)
1542
2771
  if (zero_r < 0)
1543
2772
  assert(dd < modulus, "0_r=#{zero_r} " + text)
1544
2773
  end
1545
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
2774
+ zero_r = check_round_to_one_remainder(0, r, modulus, ROUND_UP, ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
1546
2775
  dd = 2*zero_r.abs
1547
2776
  assert(dd <= modulus, "0_r=#{zero_r} " + text)
1548
2777
  if (zero_r > 0)
1549
2778
  assert(dd < modulus, "0_r=#{zero_r} " + text)
1550
2779
  end
1551
2780
 
1552
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2781
+ zero_r = check_round_to_one_remainder(0, r, modulus, ROUND_DOWN, ZERO_ROUND_TO_PLUS)
1553
2782
  assert(zero_r >= 0, "0_r=#{zero_r} " + text)
1554
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_MINUS)
2783
+ zero_r = check_round_to_one_remainder(0, r, modulus, ROUND_DOWN, ZERO_ROUND_TO_MINUS)
1555
2784
  assert(zero_r <= 0, "0_r=#{zero_r} " + text)
1556
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
2785
+ zero_r = check_round_to_one_remainder(0, r, modulus, ROUND_DOWN, ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
1557
2786
  dd = 2*zero_r.abs
1558
2787
  assert(dd <= modulus, "0_r=#{zero_r} " + text)
1559
2788
  if (zero_r < 0)
1560
2789
  assert(dd < modulus, "0_r=#{zero_r} " + text)
1561
2790
  end
1562
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
2791
+ zero_r = check_round_to_one_remainder(0, r, modulus, ROUND_DOWN, ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
1563
2792
  dd = 2*zero_r.abs
1564
2793
  assert(dd <= modulus, "0_r=#{zero_r} " + text)
1565
2794
  if (zero_r > 0)
1566
2795
  assert(dd < modulus, "0_r=#{zero_r} " + text)
1567
2796
  end
1568
2797
 
1569
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_CEILING, LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY)
2798
+ # ceiling always rounds toward positive infinity, so 0 does not need any special handling and zero_rounding_mode is ignored
2799
+ zero_r = check_round_to_one_remainder(0, r, modulus, ROUND_CEILING, ZERO_ROUND_UNNECESSARY)
1570
2800
  assert(zero_r >= 0, "0_r=#{zero_r} " + text)
1571
2801
 
1572
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_FLOOR, LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY)
2802
+ # ceiling always rounds toward negative infinity, so 0 does not need any special handling and zero_rounding_mode is ignored
2803
+ zero_r = check_round_to_one_remainder(0, r, modulus, ROUND_FLOOR, ZERO_ROUND_UNNECESSARY)
1573
2804
  assert(zero_r <= 0, "0_r=#{zero_r} " + text)
1574
2805
 
1575
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_HALF_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
1576
- dd = 2*zero_r.abs
1577
- assert(dd <= modulus, "0_r=#{zero_r} " + text)
1578
- if (zero_r < 0)
1579
- assert(dd < modulus, "0_r=#{zero_r} " + text)
1580
- end
1581
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_HALF_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
1582
- dd = 2*zero_r.abs
1583
- assert(dd <= modulus, "0_r=#{zero_r} " + text)
1584
- if (zero_r < 0)
1585
- assert(dd < modulus, "0_r=#{zero_r} " + text)
1586
- end
1587
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_HALF_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_MINUS)
1588
- dd = 2*zero_r.abs
1589
- assert(dd <= modulus, "0_r=#{zero_r} " + text)
1590
- if (zero_r > 0)
1591
- assert(dd < modulus, "0_r=#{zero_r} " + text)
1592
- end
1593
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_HALF_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
1594
- dd = 2*zero_r.abs
1595
- assert(dd <= modulus, "0_r=#{zero_r} " + text)
1596
- if (zero_r > 0)
1597
- assert(dd < modulus, "0_r=#{zero_r} " + text)
1598
- end
1599
-
1600
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_HALF_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
1601
- dd = 2*zero_r.abs
1602
- assert(dd <= modulus, "0_r=#{zero_r} " + text)
1603
- if (zero_r < 0)
1604
- assert(dd < modulus, "0_r=#{zero_r} " + text)
1605
- end
1606
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_HALF_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
1607
- dd = 2*zero_r.abs
1608
- assert(dd <= modulus, "0_r=#{zero_r} " + text)
1609
- if (zero_r < 0)
1610
- assert(dd < modulus, "0_r=#{zero_r} " + text)
1611
- end
1612
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_HALF_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_MINUS)
1613
- dd = 2*zero_r.abs
1614
- assert(dd <= modulus, "0_r=#{zero_r} " + text)
1615
- if (zero_r > 0)
1616
- assert(dd < modulus, "0_r=#{zero_r} " + text)
1617
- end
1618
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_HALF_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
1619
- dd = 2*zero_r.abs
1620
- assert(dd <= modulus, "0_r=#{zero_r} " + text)
1621
- if (zero_r > 0)
1622
- assert(dd < modulus, "0_r=#{zero_r} " + text)
2806
+ ALL_ROUNDING_MODES.each do |rounding_mode|
2807
+ unless (rounding_mode.minor == MINOR_UP || rounding_mode.minor == MINOR_DOWN)
2808
+ next
2809
+ end
2810
+ unless (rounding_mode.major == MAJOR_HALF \
2811
+ || rounding_mode.major == MAJOR_HARMONIC \
2812
+ || rounding_mode.major == MAJOR_GEOMETRIC \
2813
+ || rounding_mode.major == MAJOR_QUADRATIC \
2814
+ || rounding_mode.major == MAJOR_CUBIC)
2815
+ next
2816
+ end
2817
+ [ZERO_ROUND_TO_PLUS,ZERO_ROUND_TO_CLOSEST_PREFER_PLUS].each do |zero_rounding_mode|
2818
+ zero_r = check_round_to_one_remainder(0, r, modulus, rounding_mode, zero_rounding_mode)
2819
+ if (rounding_mode.major == MAJOR_HALF)
2820
+ dd = 2*zero_r.abs
2821
+ text2 = text + " dd=#{dd} rm=#{rounding_mode} zm=#{zero_rounding_mode}"
2822
+ assert(dd <= modulus, "0_r=#{zero_r} " + text2)
2823
+ if (zero_r < 0)
2824
+ assert(dd < modulus, "0_r=#{zero_r} " + text2)
2825
+ end
2826
+ end
2827
+ end
2828
+ [ZERO_ROUND_TO_MINUS,ZERO_ROUND_TO_CLOSEST_PREFER_MINUS].each do |zero_rounding_mode|
2829
+ zero_r = check_round_to_one_remainder(0, r, modulus, rounding_mode, ZERO_ROUND_TO_MINUS)
2830
+ if (rounding_mode.major == MAJOR_HALF)
2831
+ dd = 2*zero_r.abs
2832
+ text2 = text + " dd=#{dd} rm=#{rounding_mode}"
2833
+ assert(dd <= modulus, "0_r=#{zero_r} " + text2)
2834
+ if (zero_r > 0)
2835
+ assert(dd < modulus, "0_r=#{zero_r} " + text2)
2836
+ end
2837
+ end
2838
+ end
1623
2839
  end
1624
2840
 
1625
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_HALF_CEILING, LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY)
2841
+ zero_r = check_round_to_one_remainder(0, r, modulus, ROUND_HALF_CEILING, ZERO_ROUND_UNNECESSARY)
1626
2842
  dd = 2*zero_r.abs
1627
2843
  assert(dd <= modulus, "0_r=#{zero_r} " + text)
1628
2844
  if (zero_r < 0)
1629
2845
  assert(dd < modulus, "0_r=#{zero_r} " + text)
1630
2846
  end
1631
2847
 
1632
- zero_r = check_round_to_one_remainder(0, r, modulus, LongDecimalRoundingMode::ROUND_HALF_FLOOR, LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY)
2848
+ zero_r = check_round_to_one_remainder(0, r, modulus, ROUND_HALF_FLOOR, ZERO_ROUND_UNNECESSARY)
1633
2849
  dd = 2*zero_r.abs
1634
2850
  assert(dd <= modulus, "0_r=#{zero_r} " + text)
1635
2851
  if (zero_r > 0)
@@ -1641,19 +2857,20 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1641
2857
 
1642
2858
  def check_round_to_one_remainder(i, r, modulus, rounding_mode, zero_rounding_mode)
1643
2859
 
1644
- zero_modes = [ LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS,\
1645
- LongDecimalRoundingMode::ZERO_ROUND_TO_MINUS,\
1646
- LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_PLUS,\
1647
- LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_MINUS,\
1648
- LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY ];
1649
2860
  remainders = [ r ]
1650
2861
  i_rounded = i.round_to_allowed_remainders(remainders, modulus, rounding_mode, zero_rounding_mode)
1651
- if (i != 0 || zero_rounding_mode == LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY)
1652
- zero_modes.each do |zm|
2862
+ text = "i_r=#{i_rounded} i=#{i} m=#{modulus} r=#{r} mode=#{rounding_mode} zm=#{zero_rounding_mode}"
2863
+
2864
+ # if i is not zero or zero_rounding_mode is ZERO_ROUND_UNNECESSARY, using another zero_rounding_mode should not influence the result:
2865
+ if (i != 0 || zero_rounding_mode == ZERO_ROUND_UNNECESSARY)
2866
+ ALL_ZERO_MODES.each do |zm|
1653
2867
  assert_equal(i_rounded, i.round_to_allowed_remainders(remainders, modulus, rounding_mode, zm), "i=#{i} i_r=#{i_rounded} m=#{modulus} zm=#{zm} r=#{r}")
1654
2868
  end
1655
2869
  end
1656
- assert_equal(0, (i_rounded - r) % modulus)
2870
+
2871
+ # make sure that the result is congruent r modulo the modulus and within less than modulus away from i:
2872
+ assert(! (i_rounded.nil?), text)
2873
+ assert_equal(0, (i_rounded - r) % modulus, text)
1657
2874
  assert(i - modulus < i_rounded)
1658
2875
  assert(i_rounded < i + modulus)
1659
2876
  i_rounded
@@ -1663,94 +2880,148 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1663
2880
  # test rounding of int to remainder set
1664
2881
  #
1665
2882
  def test_int_round_to_allowed_remainders
1666
- print "\ntest_int_round_to_allowed_remainders [#{Time.now}] (45 min): "
2883
+ print "\ntest_int_round_to_allowed_remainders [#{Time.now}] (15 sec): "
1667
2884
  $stdout.flush
1668
2885
  # 2.upto 8 do |modulus|
1669
2886
  2.upto 7 do |modulus|
1670
2887
  xx = (1<< modulus) - 1
1671
2888
  xx.times do |x|
1672
2889
  remainders = make_set(x + 1, modulus)
2890
+ min_remainder = remainders.min
2891
+ max_remainder = remainders.max
2892
+ max_neg_remainder = max_remainder - modulus
2893
+ closest_remainder_prefer_plus = nil
2894
+ closest_remainder_prefer_minus = nil
2895
+ minus_remainder = if (min_remainder == 0)
2896
+ min_remainder
2897
+ else
2898
+ max_neg_remainder
2899
+ end
2900
+ if (-max_neg_remainder > min_remainder)
2901
+ closest_remainder_prefer_minus = min_remainder
2902
+ closest_remainder_prefer_plus = min_remainder
2903
+ elsif (-max_neg_remainder < min_remainder)
2904
+ closest_remainder_prefer_minus = max_neg_remainder
2905
+ closest_remainder_prefer_plus = max_neg_remainder
2906
+ else
2907
+ closest_remainder_prefer_minus = max_neg_remainder
2908
+ closest_remainder_prefer_plus = min_remainder
2909
+ end
2910
+
1673
2911
  text0 = "m=#{modulus} x=#{x} s=#{remainders.inspect}"
1674
- # puts text0
1675
- print ":"
2912
+ print "."
1676
2913
  $stdout.flush
1677
2914
  n = 3*modulus
1678
2915
  (-n).upto n do |i|
1679
2916
  text = "i=#{i} n=#{n} " + text0
1680
- i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, LongDecimalRoundingMode::ROUND_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2917
+ i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, ROUND_UP, ZERO_ROUND_TO_PLUS)
2918
+ assert(above.empty?)
2919
+ assert(below.empty?)
1681
2920
  assert(i_rounded.abs >= i.abs, "i_r=#{i_rounded} " + text)
1682
2921
  if (i == 0) then
1683
2922
  assert(i_rounded >= 0, "i_r=#{i_rounded} " + text)
1684
- assert_equal(above.length, 0, "i_r=#{i_rounded} " + text)
2923
+ assert_equal(min_remainder, i_rounded)
2924
+ # assert_equal(above.length, 0, "i_r=#{i_rounded} " + text)
1685
2925
  elsif (i > 0) then
1686
2926
  # rounded away from 0, so for positive i to value >= i
1687
- assert_equal(above.length, 0, text)
2927
+ # assert_equal(above.length, 0, text)
1688
2928
  assert(i_rounded >= i, "i_r=#{i_rounded} " + text)
2929
+ assert(i_rounded >= min_remainder)
1689
2930
  else
1690
2931
  # i < 0
1691
- # rounded away from 0, so for positive i to value <= i
2932
+ # rounded away from 0, so for negative i to value <= i
1692
2933
  assert_equal(below.length, 0, text)
1693
2934
  assert(i_rounded <= i, "i_r=#{i_rounded} " + text)
2935
+ assert(i_rounded <= max_neg_remainder)
1694
2936
  end
1695
2937
 
1696
- i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, LongDecimalRoundingMode::ROUND_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2938
+ i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, ROUND_DOWN, ZERO_ROUND_TO_PLUS)
2939
+ assert(above.empty?)
2940
+ assert(below.empty?)
1697
2941
  if (i > 0)
1698
2942
  assert(i_rounded <= i, "i_r=#{i_rounded} " + text)
1699
- assert_equal(below.length, 0, "i_r=#{i_rounded} " + text)
2943
+ assert(i_rounded >= max_neg_remainder, "i_r=#{i_rounded} " + text)
2944
+ # assert_equal(below.length, 0, "i_r=#{i_rounded} " + text)
1700
2945
  elsif (i < 0)
1701
2946
  assert(i_rounded >= i, "i_r=#{i_rounded} " + text)
1702
- assert_equal(above.length, 0, "i_r=#{i_rounded} " + text)
2947
+ assert(i_rounded <= min_remainder, "i_r=#{i_rounded} " + text)
2948
+ # assert_equal(above.length, 0, "i_r=#{i_rounded} " + text)
1703
2949
  elsif (i == 0) then
1704
2950
  assert(i_rounded >= 0, "i_r=#{i_rounded} " + text)
1705
- assert_equal(above.length, 0, "i_r=#{i_rounded} " + text)
2951
+ assert_equal(min_remainder, i_rounded, "i_r=#{i_rounded} " + text)
2952
+ # assert_equal(above.length, 0, "i_r=#{i_rounded} " + text)
1706
2953
  else
1707
2954
  raise("i=#{i} i_r=#{i_rounded}")
1708
2955
  end
1709
2956
 
1710
- i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, LongDecimalRoundingMode::ROUND_CEILING, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2957
+ i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, ROUND_CEILING, ZERO_ROUND_TO_PLUS)
2958
+ assert(above.empty?)
2959
+ assert(below.empty?)
1711
2960
  assert(i_rounded >= i, "i_r=#{i_rounded} " + text)
1712
- assert_equal(above.length, 0, "i_r=#{i_rounded} " + text)
2961
+ # assert_equal(above.length, 0, "i_r=#{i_rounded} " + text)
1713
2962
 
1714
- i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, LongDecimalRoundingMode::ROUND_FLOOR, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2963
+ i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, ROUND_FLOOR, ZERO_ROUND_TO_PLUS)
2964
+ assert(above.empty?)
2965
+ assert(below.empty?)
1715
2966
  assert(i_rounded <= i, "i_r=#{i_rounded} " + text)
1716
- assert_equal(below.length, 0, "i_r=#{i_rounded} " + text)
2967
+ # assert_equal(below.length, 0, "i_r=#{i_rounded} " + text)
1717
2968
 
1718
- i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2969
+ i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, ROUND_HALF_UP, ZERO_ROUND_TO_PLUS)
2970
+ assert(above.empty?)
2971
+ assert(below.empty?)
1719
2972
  dd = 2*(i_rounded - i).abs
1720
2973
  assert(dd <= modulus, "i_r=#{i_rounded} " + text)
1721
2974
  if (i_rounded.abs < i.abs || i_rounded.sgn == - i.sgn)
1722
2975
  assert(dd < modulus, "i_r=#{i_rounded} " + text)
1723
2976
  end
1724
- assert_equal(below.length, 0, "i_r=#{i_rounded} " + text)
1725
- assert_equal(above.length, 0, "i_r=#{i_rounded} " + text)
1726
2977
 
1727
- i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2978
+ i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, ROUND_HALF_DOWN, ZERO_ROUND_TO_PLUS)
2979
+ assert(above.empty?)
2980
+ assert(below.empty?)
1728
2981
  dd = 2*(i_rounded - i).abs
1729
2982
  assert(dd <= modulus, "i_r=#{i_rounded} " + text)
1730
2983
  if (i_rounded.abs > i.abs && i_rounded.sgn == i.sgn)
1731
2984
  assert(dd < modulus, "i_r=#{i_rounded} " + text)
1732
2985
  end
1733
- assert_equal(below.length, 0, "i_r=#{i_rounded} " + text)
1734
- assert_equal(above.length, 0, "i_r=#{i_rounded} " + text)
1735
2986
 
1736
- i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_CEILING, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2987
+ i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, ROUND_HALF_CEILING, ZERO_ROUND_TO_PLUS)
2988
+ assert(above.empty?)
2989
+ assert(below.empty?)
1737
2990
  dd = 2*(i_rounded - i).abs
1738
2991
  assert(dd <= modulus, "i_r=#{i_rounded} " + text)
1739
2992
  if (i_rounded < i)
1740
2993
  assert(dd < modulus, "i_r=#{i_rounded} " + text)
1741
2994
  end
1742
- assert_equal(below.length, 0, "i_r=#{i_rounded} " + text)
1743
- assert_equal(above.length, 0, "i_r=#{i_rounded} " + text)
1744
2995
 
1745
- i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_FLOOR, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
2996
+ i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, ROUND_HALF_FLOOR, ZERO_ROUND_TO_PLUS)
2997
+ assert(above.empty?)
2998
+ assert(below.empty?)
1746
2999
  dd = 2*(i_rounded - i).abs
1747
3000
  assert(dd <= modulus, "i_r=#{i_rounded} " + text)
1748
3001
  if (i_rounded > i && i != 0)
1749
3002
  assert(dd < modulus, "i_r=#{i_rounded} " + text)
1750
3003
  end
1751
- assert_equal(below.length, 0, "i_r=#{i_rounded} " + text)
1752
- assert_equal(above.length, 0, "i_r=#{i_rounded} " + text)
1753
3004
 
3005
+ ALL_ROUNDING_MODES.each do |rounding_mode|
3006
+ unless (rounding_mode.major == MAJOR_GEOMETRIC \
3007
+ || rounding_mode.major == MAJOR_HARMONIC \
3008
+ || rounding_mode.major == MAJOR_QUADRATIC \
3009
+ || rounding_mode.major == MAJOR_CUBIC)
3010
+ next;
3011
+ end
3012
+ if (rounding_mode.minor == MINOR_EVEN || rounding_mode.minor == MINOR_ODD)
3013
+ next
3014
+ end
3015
+ i_rounded, set, above, below = check_round_to_remainders(i, remainders, modulus, rounding_mode, ZERO_ROUND_TO_PLUS)
3016
+ if (rounding_mode.major != MAJOR_CUBIC)
3017
+ if (i < 0)
3018
+ assert(i_rounded <= 0, "i_r=#{i_rounded} " + text)
3019
+ end
3020
+ if (i > 0)
3021
+ assert(i_rounded >= 0, "i_r=#{i_rounded} " + text)
3022
+ end
3023
+ end
3024
+ end
1754
3025
  end
1755
3026
  end
1756
3027
  end
@@ -1760,134 +3031,271 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1760
3031
  # test rounding of 0 to remainder set
1761
3032
  #
1762
3033
  def test_zero_round_to_allowed_remainders
1763
- print "\ntest_zero_round_to_allowed_remainders [#{Time.now}] (long): "
3034
+ print "\ntest_zero_round_to_allowed_remainders [#{Time.now}]: "
1764
3035
  $stdout.flush
1765
3036
 
1766
3037
  2.upto 7 do |modulus|
1767
3038
  xx = (1<< modulus) - 1
1768
3039
  xx.times do |x|
1769
3040
  remainders = make_set(x + 1, modulus)
3041
+
3042
+ min_remainder = remainders.min
3043
+ max_remainder = remainders.max
3044
+ max_neg_remainder = max_remainder - modulus
3045
+ closest_remainder_prefer_plus = nil
3046
+ closest_remainder_prefer_minus = nil
3047
+ minus_remainder = if (min_remainder == 0)
3048
+ min_remainder
3049
+ else
3050
+ max_neg_remainder
3051
+ end
3052
+ if (-max_neg_remainder > min_remainder)
3053
+ closest_remainder_prefer_minus = min_remainder
3054
+ closest_remainder_prefer_plus = min_remainder
3055
+ elsif (-max_neg_remainder < min_remainder)
3056
+ closest_remainder_prefer_minus = max_neg_remainder
3057
+ closest_remainder_prefer_plus = max_neg_remainder
3058
+ else
3059
+ closest_remainder_prefer_minus = max_neg_remainder
3060
+ closest_remainder_prefer_plus = min_remainder
3061
+ end
3062
+
1770
3063
  text = "m=#{modulus} x=#{x} s=#{remainders.inspect}"
1771
- # puts text
1772
3064
  print "."
1773
3065
  $stdout.flush
1774
3066
 
1775
3067
  # ROUND_UP and ROUND_DOWN have the same effect for 0
1776
- zero_r1, set1, above1, below1 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
1777
- zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
3068
+ zero_r1, set1, above1, below1 = check_round_to_remainders(0, remainders, modulus, ROUND_UP, ZERO_ROUND_TO_PLUS)
3069
+ zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, ROUND_DOWN, ZERO_ROUND_TO_PLUS)
3070
+ assert(above1.empty?)
3071
+ assert(below1.empty?)
3072
+ assert(above2.empty?)
3073
+ assert(below2.empty?)
1778
3074
  assert_equal(zero_r1, zero_r2, text)
1779
- assert_equal(above1, above2, text)
1780
- assert_equal(below1, below2, text)
1781
3075
  assert(zero_r1 >= 0, "0_r=#{zero_r1} " + text)
1782
- assert_equal(above1.length, 0, text)
1783
-
1784
- zero_r1, set1, above1, below1 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_MINUS)
1785
- zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_MINUS)
3076
+ assert_equal(min_remainder, zero_r1, "0_r=#{zero_r1} " + text)
3077
+
3078
+ zero_r1, set1, above1, below1 = check_round_to_remainders(0, remainders, modulus, ROUND_UP, ZERO_ROUND_TO_MINUS)
3079
+ zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, ROUND_DOWN, ZERO_ROUND_TO_MINUS)
3080
+ assert(above1.empty?)
3081
+ assert(below1.empty?)
3082
+ assert(above2.empty?)
3083
+ assert(below2.empty?)
1786
3084
  assert_equal(zero_r1, zero_r2, text)
1787
- assert_equal(above1, above2, text)
1788
- assert_equal(below1, below2, text)
1789
3085
  assert(zero_r1 <= 0, "0_r=#{zero_r1} " + text)
1790
- assert_equal(below1.length, 0, text)
1791
-
1792
- zero_r1, set1, above1, below1 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
1793
- zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
3086
+ assert_equal(minus_remainder, zero_r1, "0_r=#{zero_r1} " + text)
3087
+
3088
+ zero_r1, set1, above1, below1 = check_round_to_remainders(0, remainders, modulus, ROUND_UP, ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
3089
+ zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, ROUND_DOWN, ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
3090
+ assert(above1.empty?)
3091
+ assert(below1.empty?)
3092
+ assert(above2.empty?)
3093
+ assert(below2.empty?)
1794
3094
  assert_equal(zero_r1, zero_r2, text)
1795
- assert_equal(above1, above2, text)
1796
- assert_equal(below1, below2, text)
3095
+ assert_equal(closest_remainder_prefer_plus, zero_r1, text)
1797
3096
  dd = 2*zero_r1.abs
1798
3097
  assert(dd <= modulus, "0_r=#{zero_r1} dd=#{dd} " + text)
1799
3098
  if (zero_r1 < 0)
1800
3099
  assert(dd < modulus, "0_r=#{zero_r1} dd=#{dd} " + text)
1801
3100
  end
1802
- if (below1.length > 0)
1803
- assert(below1.max.abs >= zero_r1.abs, text)
1804
- end
1805
- if (above1.length > 0)
1806
- assert(above1.min.abs >= zero_r1.abs, text)
1807
- end
1808
-
1809
- zero_r1, set1, above1, below1 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
1810
- zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
3101
+ #if (below1.length > 0)
3102
+ # assert(below1.max.abs >= zero_r1.abs, text)
3103
+ #end
3104
+ #if (above1.length > 0)
3105
+ # assert(above1.min.abs >= zero_r1.abs, text)
3106
+ #end
3107
+
3108
+ zero_r1, set1, above1, below1 = check_round_to_remainders(0, remainders, modulus, ROUND_UP, ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
3109
+ zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, ROUND_DOWN, ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
3110
+ assert(above1.empty?)
3111
+ assert(below1.empty?)
3112
+ assert(above2.empty?)
3113
+ assert(below2.empty?)
1811
3114
  assert_equal(zero_r1, zero_r2, text)
1812
- assert_equal(above1, above2, text)
1813
- assert_equal(below1, below2, text)
3115
+ assert_equal(closest_remainder_prefer_minus, zero_r1, text)
3116
+ # assert_equal(above1, above2, text)
3117
+ # assert_equal(below1, below2, text)
1814
3118
  dd = 2*zero_r1.abs
1815
3119
  assert(dd <= modulus, "0_r=#{zero_r1} dd=#{dd} " + text)
1816
3120
  if (zero_r1 > 0)
1817
3121
  assert(dd < modulus, "0_r=#{zero_r1} dd=#{dd} " + text)
1818
3122
  end
1819
- if (below1.length > 0)
1820
- assert(below1.max.abs >= zero_r1.abs, text)
1821
- end
1822
- assert_equal(above1.length, 0, text)
1823
-
1824
- zero_r0, set0, above0, below0 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_CEILING, LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY)
1825
- assert(zero_r0 >= 0, "0_r=#{zero_r0} " + text)
1826
- assert_equal(above0.length, 0, text)
1827
-
1828
- zero_r0, set0, above0, below0 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_FLOOR, LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY)
1829
- assert(zero_r0 <= 0, "0_r=#{zero_r0} " + text)
1830
- assert_equal(below0.length, 0, text)
1831
-
1832
- zero_r1, set1, above1, below1 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
1833
- zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS)
3123
+ #if (below1.length > 0)
3124
+ # assert(below1.max.abs >= zero_r1.abs, text)
3125
+ #end
3126
+ #assert_equal(above1.length, 0, text)
3127
+
3128
+ zero_rounded, set0, above0, below0 = check_round_to_remainders(0, remainders, modulus, ROUND_CEILING, ZERO_ROUND_UNNECESSARY)
3129
+ assert(above0.empty?)
3130
+ assert(below0.empty?)
3131
+ assert(zero_rounded >= 0, "0_r=#{zero_rounded} " + text)
3132
+ assert_equal(min_remainder, zero_rounded, text)
3133
+ # assert_equal(above0.length, 0, text)
3134
+
3135
+ zero_rounded, set0, above0, below0 = check_round_to_remainders(0, remainders, modulus, ROUND_FLOOR, ZERO_ROUND_UNNECESSARY)
3136
+ assert(above0.empty?)
3137
+ assert(below0.empty?)
3138
+ assert(zero_rounded <= 0, "0_r=#{zero_rounded} " + text)
3139
+ assert_equal(minus_remainder, zero_rounded, text)
3140
+ # assert_equal(below0.length, 0, text)
3141
+
3142
+ zero_r1, set1, above1, below1 = check_round_to_remainders(0, remainders, modulus, ROUND_HALF_UP, ZERO_ROUND_TO_PLUS)
3143
+ zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, ROUND_HALF_DOWN, ZERO_ROUND_TO_PLUS)
3144
+ assert(above1.empty?)
3145
+ assert(below1.empty?)
3146
+ assert(above2.empty?)
3147
+ assert(below2.empty?)
1834
3148
  assert_equal(zero_r1, zero_r2, text)
1835
- assert_equal(above1, above2, text)
1836
- assert_equal(below1, below2, text)
1837
- zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
3149
+ if (zero_r1 < 0)
3150
+ assert_equal(max_neg_remainder, zero_r1)
3151
+ else
3152
+ assert_equal(min_remainder, zero_r1)
3153
+ end
3154
+ # assert_equal(above1, above2, text)
3155
+ # assert_equal(below1, below2, text)
3156
+ zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, ROUND_HALF_UP, ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
3157
+ assert(above1.empty?)
3158
+ assert(below1.empty?)
3159
+ assert(above2.empty?)
3160
+ assert(below2.empty?)
1838
3161
  assert_equal(zero_r1, zero_r2, text)
1839
- assert_equal(above1, above2, text)
1840
- assert_equal(below1, below2, text)
1841
- zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
3162
+ if (zero_r1 < 0)
3163
+ assert_equal(max_neg_remainder, zero_r1)
3164
+ else
3165
+ assert_equal(min_remainder, zero_r1)
3166
+ end
3167
+ #assert_equal(above1, above2, text)
3168
+ #assert_equal(below1, below2, text)
3169
+ zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, ROUND_HALF_DOWN, ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
3170
+ assert(above1.empty?)
3171
+ assert(below1.empty?)
3172
+ assert(above2.empty?)
3173
+ assert(below2.empty?)
1842
3174
  assert_equal(zero_r1, zero_r2, text)
1843
- assert_equal(above1, above2, text)
1844
- assert_equal(below1, below2, text)
3175
+ # assert_equal(above1, above2, text)
3176
+ # assert_equal(below1, below2, text)
1845
3177
  dd = 2*zero_r1.abs
1846
3178
  assert(dd <= modulus, "0_r=#{zero_r1} dd=#{dd} " + text)
1847
3179
  if (zero_r1 < 0)
1848
3180
  assert(dd < modulus, "0_r=#{zero_r1} dd=#{dd} " + text)
3181
+ assert_equal(max_neg_remainder, zero_r1)
3182
+ else
3183
+ assert_equal(min_remainder, zero_r1)
1849
3184
  end
1850
- assert_equal(below1.length, 0, text)
1851
- assert_equal(above1.length, 0, text)
1852
-
1853
- zero_r1, set1, above1, below1 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_MINUS)
1854
- zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_MINUS)
3185
+ # assert_equal(below1.length, 0, text)
3186
+ # assert_equal(above1.length, 0, text)
3187
+
3188
+ zero_r1, set1, above1, below1 = check_round_to_remainders(0, remainders, modulus, ROUND_HALF_UP, ZERO_ROUND_TO_MINUS)
3189
+ zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, ROUND_HALF_DOWN, ZERO_ROUND_TO_MINUS)
3190
+ assert(above1.empty?)
3191
+ assert(below1.empty?)
3192
+ assert(above2.empty?)
3193
+ assert(below2.empty?)
1855
3194
  assert_equal(zero_r1, zero_r2, text)
1856
- assert_equal(above1, above2, text)
1857
- assert_equal(below1, below2, text)
1858
- zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_UP, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
3195
+ if (zero_r1 < 0)
3196
+ assert_equal(max_neg_remainder, zero_r1)
3197
+ else
3198
+ assert_equal(min_remainder, zero_r1)
3199
+ end
3200
+ # assert_equal(above1, above2, text)
3201
+ # assert_equal(below1, below2, text)
3202
+ zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, ROUND_HALF_UP, ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
3203
+ assert(above1.empty?)
3204
+ assert(below1.empty?)
3205
+ assert(above2.empty?)
3206
+ assert(below2.empty?)
1859
3207
  assert_equal(zero_r1, zero_r2, text)
1860
- assert_equal(above1, above2, text)
1861
- assert_equal(below1, below2, text)
1862
- zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_DOWN, LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
3208
+ # assert_equal(above1, above2, text)
3209
+ # assert_equal(below1, below2, text)
3210
+ zero_r2, set2, above2, below2 = check_round_to_remainders(0, remainders, modulus, ROUND_HALF_DOWN, ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
3211
+ assert(above1.empty?)
3212
+ assert(below1.empty?)
3213
+ assert(above2.empty?)
3214
+ assert(below2.empty?)
1863
3215
  assert_equal(zero_r1, zero_r2, text)
1864
- assert_equal(above1, above2, text)
1865
- assert_equal(below1, below2, text)
3216
+ # assert_equal(above1, above2, text)
3217
+ # assert_equal(below1, below2, text)
1866
3218
  dd = 2*zero_r1.abs
1867
3219
  assert(dd <= modulus, "0_r=#{zero_r1} dd=#{dd} " + text)
1868
3220
  if (zero_r1 > 0)
1869
3221
  assert(dd < modulus, "0_r=#{zero_r1} dd=#{dd} " + text)
3222
+ assert_equal(min_remainder, zero_r1)
3223
+ else
3224
+ assert_equal(minus_remainder, zero_r1)
1870
3225
  end
1871
- assert_equal(below1.length, 0, text)
1872
- assert_equal(above1.length, 0, text)
1873
-
1874
- zero_r0, set0, above0, below0 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_CEILING, LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY)
1875
- dd = 2*zero_r0.abs
1876
- assert(dd <= modulus, "0_r=#{zero_r0} dd=#{dd} " + text)
1877
- if (zero_r0 < 0)
1878
- assert(dd < modulus, "0_r=#{zero_r0} dd=#{dd} " + text)
3226
+ # assert_equal(below1.length, 0, text)
3227
+ # assert_equal(above1.length, 0, text)
3228
+
3229
+ zero_rounded, set0, above0, below0 = check_round_to_remainders(0, remainders, modulus, ROUND_HALF_CEILING, ZERO_ROUND_UNNECESSARY)
3230
+ assert(above0.empty?)
3231
+ assert(below0.empty?)
3232
+ dd = 2*zero_rounded.abs
3233
+ assert(dd <= modulus, "0_r=#{zero_rounded} dd=#{dd} " + text)
3234
+ if (zero_rounded < 0)
3235
+ assert_equal(max_neg_remainder, zero_rounded)
3236
+ assert(dd < modulus, "0_r=#{zero_rounded} dd=#{dd} " + text)
3237
+ else
3238
+ assert_equal(min_remainder, zero_rounded)
1879
3239
  end
1880
- assert_equal(below0.length, 0, text)
1881
- assert_equal(above0.length, 0, text)
1882
-
1883
- zero_r0, set0, above0, below0 = check_round_to_remainders(0, remainders, modulus, LongDecimalRoundingMode::ROUND_HALF_FLOOR, LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY)
1884
- dd = 2*zero_r0.abs
1885
- assert(dd <= modulus, "0_r=#{zero_r0} " + text)
1886
- if (zero_r0 > 0)
1887
- assert(dd < modulus, "0_r=#{zero_r0} " + text)
3240
+ # assert_equal(below0.length, 0, text)
3241
+ # assert_equal(above0.length, 0, text)
3242
+
3243
+ zero_rounded, set0, above0, below0 = check_round_to_remainders(0, remainders, modulus, ROUND_HALF_FLOOR, ZERO_ROUND_UNNECESSARY)
3244
+ assert(above0.empty?)
3245
+ assert(below0.empty?)
3246
+ dd = 2*zero_rounded.abs
3247
+ assert(dd <= modulus, "0_r=#{zero_rounded} " + text)
3248
+ if (zero_rounded > 0)
3249
+ assert_equal(min_remainder, zero_r1)
3250
+ assert(dd < modulus, "0_r=#{zero_rounded} " + text)
3251
+ else
3252
+ assert_equal(minus_remainder, zero_r1)
3253
+ end
3254
+ # assert_equal(below0.length, 0, text)
3255
+ # assert_equal(above0.length, 0, text)
3256
+
3257
+ ALL_ROUNDING_MODES.each do |rounding_mode|
3258
+ unless (rounding_mode.major == MAJOR_GEOMETRIC \
3259
+ || rounding_mode.major == MAJOR_HARMONIC \
3260
+ || rounding_mode.major == MAJOR_QUADRATIC \
3261
+ || rounding_mode.major == MAJOR_CUBIC)
3262
+ next;
3263
+ end
3264
+ if (rounding_mode.minor == MINOR_EVEN || rounding_mode.minor == MINOR_ODD)
3265
+ next
3266
+ end
3267
+
3268
+ if (rounding_mode == ROUND_CUBIC_CEILING)
3269
+ i_rounded, set, above, below = check_round_to_remainders(0, remainders, modulus, rounding_mode, ZERO_ROUND_UNNECESSARY)
3270
+ if (min_remainder+max_neg_remainder > 0)
3271
+ assert_equal(minus_remainder, i_rounded, text+" i_rounded=#{i_rounded} rounding_mode=#{rounding_mode}")
3272
+ else
3273
+ assert_equal(min_remainder, i_rounded, text+" i_rounded=#{i_rounded} rounding_mode=#{rounding_mode}")
3274
+ end
3275
+ elsif (rounding_mode == ROUND_CUBIC_FLOOR)
3276
+ i_rounded, set, above, below = check_round_to_remainders(0, remainders, modulus, rounding_mode, ZERO_ROUND_UNNECESSARY)
3277
+ if (min_remainder+max_neg_remainder < 0)
3278
+ assert_equal(min_remainder, i_rounded, text+" i_rounded=#{i_rounded} rounding_mode=#{rounding_mode}")
3279
+ else
3280
+ assert_equal(minus_remainder, i_rounded, text+" i_rounded=#{i_rounded} rounding_mode=#{rounding_mode}")
3281
+ end
3282
+ elsif ((rounding_mode == ROUND_CUBIC_DOWN || rounding_mode == ROUND_CUBIC_UP) && min_remainder+max_neg_remainder != 0)
3283
+ assert_equal(closest_remainder_prefer_minus, closest_remainder_prefer_plus)
3284
+ i_rounded = 0.round_to_allowed_remainders(remainders, modulus, rounding_mode, ZERO_ROUND_UNNECESSARY)
3285
+ assert_equal(closest_remainder_prefer_plus, i_rounded, text+" i_rounded=#{i_rounded} rounding_mode=#{rounding_mode}")
3286
+ i_rounded, set, above, below = check_round_to_remainders(0, remainders, modulus, rounding_mode, ZERO_ROUND_UNNECESSARY)
3287
+ assert_equal(closest_remainder_prefer_plus, i_rounded, text+" i_rounded=#{i_rounded} rounding_mode=#{rounding_mode}")
3288
+ else
3289
+ i_rounded, set, above, below = check_round_to_remainders(0, remainders, modulus, rounding_mode, ZERO_ROUND_TO_PLUS)
3290
+ assert_equal(min_remainder, i_rounded, text+" i_rounded=#{i_rounded} rounding_mode=#{rounding_mode}")
3291
+ i_rounded, set, above, below = check_round_to_remainders(0, remainders, modulus, rounding_mode, ZERO_ROUND_TO_MINUS)
3292
+ assert_equal(minus_remainder, i_rounded, text+" i_rounded=#{i_rounded} rounding_mode=#{rounding_mode}")
3293
+ i_rounded, set, above, below = check_round_to_remainders(0, remainders, modulus, rounding_mode, ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
3294
+ assert_equal(closest_remainder_prefer_plus, i_rounded, text+" i_rounded=#{i_rounded} rounding_mode=#{rounding_mode}")
3295
+ i_rounded, set, above, below = check_round_to_remainders(0, remainders, modulus, rounding_mode, ZERO_ROUND_TO_CLOSEST_PREFER_MINUS)
3296
+ assert_equal(closest_remainder_prefer_minus, i_rounded, text+" i_rounded=#{i_rounded} rounding_mode=#{rounding_mode}")
3297
+ end
1888
3298
  end
1889
- assert_equal(below0.length, 0, text)
1890
- assert_equal(above0.length, 0, text)
1891
3299
 
1892
3300
  end
1893
3301
  end
@@ -1907,27 +3315,36 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1907
3315
 
1908
3316
  def check_round_to_remainders(i, remainders, modulus, rounding_mode, zero_rounding_mode)
1909
3317
 
1910
- zero_modes = [ LongDecimalRoundingMode::ZERO_ROUND_TO_PLUS,\
1911
- LongDecimalRoundingMode::ZERO_ROUND_TO_MINUS,\
1912
- LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_PLUS,\
1913
- LongDecimalRoundingMode::ZERO_ROUND_TO_CLOSEST_PREFER_MINUS,\
1914
- LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY ];
3318
+ # do the rounding
3319
+ i_rounded = i.round_to_allowed_remainders(remainders.clone, modulus, rounding_mode, zero_rounding_mode)
1915
3320
 
1916
- i_rounded = i.round_to_allowed_remainders(remainders, modulus, rounding_mode, zero_rounding_mode)
1917
- if (i != 0 || zero_rounding_mode == LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY)
1918
- zero_modes.each do |zm|
1919
- assert_equal(i_rounded, i.round_to_allowed_remainders(remainders, modulus, rounding_mode, zm), "i=#{i} i_r=#{i_rounded} m=#{modulus} zm=#{zm}")
3321
+ # make sure that the zero_rounding_mode does not matter if i is not zero or if ZERO_ROUND_UNNECESSARY is provided
3322
+ if (i != 0 || zero_rounding_mode == ZERO_ROUND_UNNECESSARY)
3323
+ ALL_ZERO_MODES.each do |zm|
3324
+ assert_equal(i_rounded, i.round_to_allowed_remainders(remainders.clone, modulus, rounding_mode, zm), "i=#{i} i_r=#{i_rounded} m=#{modulus} zm=#{zm}")
1920
3325
  end
1921
3326
  end
3327
+
3328
+ # make sure there is exactly one remainder matching
1922
3329
  one_remainder = remainders.select do |r|
1923
3330
  (i_rounded - r) % modulus == 0
1924
3331
  end
1925
- assert_equal(1, one_remainder.length, "i_r=#{i_rounded} i=#{i} m=#{modulus} r=#{remainders} or=#{one_remainder.to_s}")
3332
+ assert_equal(1, one_remainder.length, "i_r=#{i_rounded} i=#{i} m=#{modulus} r=#{remainders} or=#{one_remainder.to_s} rm=#{rounding_mode} zm=#{zero_rounding_mode}")
3333
+
3334
+ # make sure that i_rounded is less than modulus away from i
1926
3335
  assert(i - modulus < i_rounded)
1927
3336
  assert(i_rounded < i + modulus)
3337
+
3338
+ # run the test with each single remainder:
1928
3339
  set = remainders.map do |r|
1929
- check_round_to_one_remainder(i, r, modulus, rounding_mode, zero_rounding_mode)
3340
+ if (zero_rounding_mode == ZERO_ROUND_UNNECESSARY)
3341
+ check_round_to_one_remainder(i, r, modulus, rounding_mode, ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
3342
+ else
3343
+ check_round_to_one_remainder(i, r, modulus, rounding_mode, zero_rounding_mode)
3344
+ end
1930
3345
  end
3346
+
3347
+ # find members which are closer than i_rounded above and below from the results of rounding to a single remainder
1931
3348
  closer_above = []
1932
3349
  closer_below = []
1933
3350
  found = false
@@ -1941,16 +3358,20 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1941
3358
  assert(i_rounded < i_r)
1942
3359
  if closer
1943
3360
  closer_above.push(i_r)
3361
+ # raise ArgumentError, "i=#{i} ir=#{i_r} i_rounded=#{i_rounded} remainders=#{remainders.inspect} m=#{modulus} rm=#{rounding_mode} zm=#{zero_rounding_mode} closer_above"
1944
3362
  end
1945
3363
  else
1946
3364
  # i_r < i
1947
3365
  assert(i_r < i_rounded)
1948
3366
  if closer
1949
3367
  closer_below.push(i_r)
3368
+ # raise ArgumentError, "i=#{i} ir=#{i_r} i_rounded=#{i_rounded} remainders=#{remainders.inspect} m=#{modulus} rm=#{rounding_mode} zm=#{zero_rounding_mode} closer_below"
1950
3369
  end
1951
3370
  end
1952
3371
  end
1953
3372
  end
3373
+ # assert(closer_below.empty?)
3374
+ # assert(closer_above.empty?)
1954
3375
  return i_rounded, set, closer_above, closer_below
1955
3376
 
1956
3377
  end # check_round_to_remainders
@@ -1959,6 +3380,228 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1959
3380
  #
1960
3381
  # ROUND_UNNECESSARY/ROUND_HALF_EVEN
1961
3382
 
3383
+ def test_minor_major_rounding_modes
3384
+ print "\ntest_minor_major_rounding_modes [#{Time.now}]: "
3385
+ $stdout.flush
3386
+ [[ ROUND_CEILING, MAJOR_CEILING, MINOR_UNUSED ],
3387
+ [ ROUND_UNNECESSARY, MAJOR_UNNECESSARY, MINOR_UNUSED ],
3388
+ [ ROUND_UP, MAJOR_UP, MINOR_UNUSED ],
3389
+ [ ROUND_DOWN, MAJOR_DOWN, MINOR_UNUSED ],
3390
+ [ ROUND_FLOOR, MAJOR_FLOOR, MINOR_UNUSED ],
3391
+ [ ROUND_CUBIC_CEILING, MAJOR_CUBIC, MINOR_CEILING ],
3392
+ [ ROUND_CUBIC_DOWN, MAJOR_CUBIC, MINOR_DOWN ],
3393
+ [ ROUND_CUBIC_EVEN, MAJOR_CUBIC, MINOR_EVEN ],
3394
+ [ ROUND_CUBIC_ODD, MAJOR_CUBIC, MINOR_ODD ],
3395
+ [ ROUND_CUBIC_FLOOR, MAJOR_CUBIC, MINOR_FLOOR ],
3396
+ [ ROUND_CUBIC_UP, MAJOR_CUBIC, MINOR_UP ],
3397
+ [ ROUND_GEOMETRIC_CEILING, MAJOR_GEOMETRIC, MINOR_CEILING ],
3398
+ [ ROUND_GEOMETRIC_DOWN, MAJOR_GEOMETRIC, MINOR_DOWN ],
3399
+ [ ROUND_GEOMETRIC_EVEN, MAJOR_GEOMETRIC, MINOR_EVEN ],
3400
+ [ ROUND_GEOMETRIC_ODD, MAJOR_GEOMETRIC, MINOR_ODD ],
3401
+ [ ROUND_GEOMETRIC_FLOOR, MAJOR_GEOMETRIC, MINOR_FLOOR ],
3402
+ [ ROUND_GEOMETRIC_UP, MAJOR_GEOMETRIC, MINOR_UP ],
3403
+ [ ROUND_HALF_CEILING, MAJOR_HALF, MINOR_CEILING ],
3404
+ [ ROUND_HALF_DOWN, MAJOR_HALF, MINOR_DOWN ],
3405
+ [ ROUND_HALF_EVEN, MAJOR_HALF, MINOR_EVEN ],
3406
+ [ ROUND_HALF_ODD, MAJOR_HALF, MINOR_ODD ],
3407
+ [ ROUND_HALF_FLOOR, MAJOR_HALF, MINOR_FLOOR ],
3408
+ [ ROUND_HALF_UP, MAJOR_HALF, MINOR_UP ],
3409
+ [ ROUND_HARMONIC_CEILING, MAJOR_HARMONIC, MINOR_CEILING ],
3410
+ [ ROUND_HARMONIC_DOWN, MAJOR_HARMONIC, MINOR_DOWN ],
3411
+ [ ROUND_HARMONIC_EVEN, MAJOR_HARMONIC, MINOR_EVEN ],
3412
+ [ ROUND_HARMONIC_ODD, MAJOR_HARMONIC, MINOR_ODD ],
3413
+ [ ROUND_HARMONIC_FLOOR, MAJOR_HARMONIC, MINOR_FLOOR ],
3414
+ [ ROUND_HARMONIC_UP, MAJOR_HARMONIC, MINOR_UP ],
3415
+ [ ROUND_QUADRATIC_CEILING, MAJOR_QUADRATIC, MINOR_CEILING ],
3416
+ [ ROUND_QUADRATIC_DOWN, MAJOR_QUADRATIC, MINOR_DOWN ],
3417
+ [ ROUND_QUADRATIC_EVEN, MAJOR_QUADRATIC, MINOR_EVEN ],
3418
+ [ ROUND_QUADRATIC_ODD, MAJOR_QUADRATIC, MINOR_ODD ],
3419
+ [ ROUND_QUADRATIC_FLOOR, MAJOR_QUADRATIC, MINOR_FLOOR ],
3420
+ [ ROUND_QUADRATIC_UP, MAJOR_QUADRATIC, MINOR_UP ]].each do |triple|
3421
+ mode = triple[0]
3422
+ major = triple[1]
3423
+ minor = triple[2]
3424
+ found = MODE_LOOKUP[[major, minor]]
3425
+ assert_equal(mode, found)
3426
+ assert_same(mode, found)
3427
+ assert_equal(major, mode.major)
3428
+ assert_equal(major, found.major)
3429
+ assert_equal(minor, mode.minor)
3430
+ assert_equal(minor, found.minor)
3431
+ end
3432
+ end
3433
+
3434
+ # test remainder rounding half with exact boundary
3435
+ #
3436
+ def test_int_round_half_int_param_to_two_allowed_remainders
3437
+ print "\ntest_int_round_half_to_two_allowed_remainders [#{Time.now}]: "
3438
+ $stdout.flush
3439
+ check_int_round_major_to_two_allowed_remainders([[1, 3], [1, 5], [2, 4], [2, 6], [3, 5], [3, 7]], true, MAJOR_HALF) do |x, y|
3440
+ LongMath.arithmetic_mean(0, ROUND_FLOOR, x, y).to_i
3441
+ end
3442
+ end
3443
+
3444
+ # test remainder rounding half with exact boundary
3445
+ #
3446
+ def test_int_round_half_non_int_param_to_two_allowed_remainders
3447
+ print "\ntest_int_round_half_to_two_allowed_remainders [#{Time.now}] (long): "
3448
+ $stdout.flush
3449
+ check_int_round_major_to_two_allowed_remainders([[1, 2], [1, 4], [1, 6], [2, 3], [2, 5], [2, 7], [3, 4], [3, 6], [3, 8], [4, 5], [4, 7]], false, MAJOR_HALF) do |x, y|
3450
+ LongMath.arithmetic_mean(0, ROUND_FLOOR, x, y).to_i
3451
+ end
3452
+ end
3453
+
3454
+ # test remainder rounding geometric with exact boundary
3455
+ #
3456
+ def test_int_round_geometric_int_param_to_two_allowed_remainders
3457
+ print "\ntest_int_round_geometric_to_two_allowed_remainders [#{Time.now}]: "
3458
+ $stdout.flush
3459
+ check_int_round_major_to_two_allowed_remainders([[1, 4], [1, 9], [2, 8]], true, MAJOR_GEOMETRIC) do |x, y|
3460
+ LongMath.geometric_mean(0, ROUND_FLOOR, x, y).to_i
3461
+ end
3462
+ end
3463
+
3464
+ # test remainder rounding geometric with exact boundary
3465
+ #
3466
+ def test_int_round_geometric_non_int_param_to_two_allowed_remainders
3467
+ print "\ntest_int_round_geometric_to_two_allowed_remainders [#{Time.now}] (long): "
3468
+ $stdout.flush
3469
+ check_int_round_major_to_two_allowed_remainders([[1, 2], [1, 3], [1, 5], [1, 6], [1, 7], [1, 8], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7]], false, MAJOR_GEOMETRIC) do |x, y|
3470
+ LongMath.geometric_mean(0, ROUND_FLOOR, x, y).to_i
3471
+ end
3472
+ end
3473
+
3474
+ # test remainder rounding harmonic with exact boundary
3475
+ #
3476
+ def test_int_round_harmonic_int_param_to_two_allowed_remainders
3477
+ print "\ntest_int_round_harmonic_to_two_allowed_remainders [#{Time.now}]: "
3478
+ $stdout.flush
3479
+ check_int_round_major_to_two_allowed_remainders([[2, 6], [3, 6]], true, MAJOR_HARMONIC) do |x, y|
3480
+ LongMath.harmonic_mean(0, ROUND_FLOOR, x, y).to_i
3481
+ end
3482
+ end
3483
+
3484
+ # test remainder rounding harmonic with exact boundary
3485
+ #
3486
+ def test_int_round_harmonic_non_int_param_to_two_allowed_remainders
3487
+ print "\ntest_int_round_harmonic_to_two_allowed_remainders [#{Time.now}] (long): "
3488
+ $stdout.flush
3489
+ check_int_round_major_to_two_allowed_remainders([[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [2, 3], [2, 4], [2, 5], [2, 7]], false, MAJOR_HARMONIC) do |x, y|
3490
+ LongMath.harmonic_mean(0, ROUND_FLOOR, x, y).to_i
3491
+ end
3492
+ end
3493
+
3494
+ # test remainder rounding quadratic with exact boundary
3495
+ #
3496
+ def test_int_round_quadratic_int_param_to_two_allowed_remainders
3497
+ print "\ntest_int_round_quadratic_to_two_allowed_remainders [#{Time.now}]: "
3498
+ $stdout.flush
3499
+ check_int_round_major_to_two_allowed_remainders([[1, 7]], true, MAJOR_QUADRATIC) do |x, y|
3500
+ LongMath.quadratic_mean(0, ROUND_FLOOR, x, y).to_i
3501
+ end
3502
+ end
3503
+
3504
+ # test remainder rounding quadratic with exact boundary
3505
+ #
3506
+ def test_int_round_quadratic_non_int_param_to_two_allowed_remainders
3507
+ print "\ntest_int_round_quadratic_to_two_allowed_remainders [#{Time.now}] (long): "
3508
+ $stdout.flush
3509
+ check_int_round_major_to_two_allowed_remainders([[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 8], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 4], [3, 5], [3, 6], [3, 7]], false, MAJOR_QUADRATIC) do |x, y|
3510
+ LongMath.quadratic_mean(0, ROUND_FLOOR, x, y).to_i
3511
+ end
3512
+ end
3513
+
3514
+ # test remainder rounding cubic with exact boundary
3515
+ #
3516
+ def test_int_round_cubic_non_int_param_to_two_allowed_remainders
3517
+ print "\ntest_int_round_cubic_non_int_param_to_two_allowed_remainders [#{Time.now}]: "
3518
+ $stdout.flush
3519
+ check_int_round_major_to_two_allowed_remainders([[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [2, 3], [2, 4], [2, 5], [2, 7]], false, MAJOR_CUBIC) do |x, y|
3520
+ LongMath.cubic_mean(0, ROUND_FLOOR, x, y).to_i
3521
+ end
3522
+ end
3523
+
3524
+ # TODO: round to zero, away from zero to negative, away from zero to positive, across zero to negative, across zero to positive
3525
+
3526
+ # test remainder rounding geometric
3527
+ #
3528
+ def check_int_round_major_to_two_allowed_remainders(remainder_sets, boundary_exact_integral, major_mode, &block)
3529
+
3530
+ mode_up = MODE_LOOKUP[[major_mode, MINOR_UP]]
3531
+ mode_down = MODE_LOOKUP[[major_mode, MINOR_DOWN]]
3532
+ mode_floor = MODE_LOOKUP[[major_mode, MINOR_FLOOR]]
3533
+ mode_ceiling = MODE_LOOKUP[[major_mode, MINOR_CEILING]]
3534
+
3535
+ 20.upto 25 do |modulus|
3536
+ remainder_sets.each do |remainders|
3537
+ print "."
3538
+ $stdout.flush
3539
+
3540
+ lower_remainder = remainders[0]
3541
+ upper_remainder = remainders[1]
3542
+
3543
+ text = "m=#{modulus} x=#{0} s=#{remainders.inspect}"
3544
+
3545
+ zero_rounded = 0.round_to_allowed_remainders(remainders, modulus, mode_up, ZERO_ROUND_TO_PLUS)
3546
+ assert_equal(lower_remainder, zero_rounded, text + " zero_rounded=#{zero_rounded}")
3547
+ zero_rounded = 0.round_to_allowed_remainders(remainders, modulus, mode_down, ZERO_ROUND_TO_PLUS)
3548
+ assert_equal(lower_remainder, zero_rounded, text + " zero_rounded=#{zero_rounded}")
3549
+ zero_rounded = 0.round_to_allowed_remainders(remainders, modulus, mode_up, ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
3550
+ assert_equal(lower_remainder, zero_rounded, text + " zero_rounded=#{zero_rounded}")
3551
+ zero_rounded = 0.round_to_allowed_remainders(remainders, modulus, mode_down, ZERO_ROUND_TO_CLOSEST_PREFER_PLUS)
3552
+ assert_equal(lower_remainder, zero_rounded, text + " zero_rounded=#{zero_rounded}")
3553
+ zero_rounded = 0.round_to_allowed_remainders(remainders, modulus, mode_ceiling, ZERO_ROUND_TO_PLUS)
3554
+ assert_equal(lower_remainder, zero_rounded, text)
3555
+
3556
+ # zero_r1 = 0.round_to_allowed_remainders(remainders, modulus, mode_up, ZERO_ROUND_TO_MINUS)
3557
+ # zero_r2 = 0.round_to_allowed_remainders(remainders, modulus, mode_down, ZERO_ROUND_TO_MINUS)
3558
+ # assert_equal(zero_r1, zero_r2, text + " zero_r1=#{zero_r1} zero_r2=#{zero_r2}")
3559
+ # assert_equal(upper_remainder - modulus, zero_r1, text + " zero_r1=#{zero_r1} zero_r2=#{zero_r2}")
3560
+
3561
+ # zero_r0 = 0.round_to_allowed_remainders(remainders, modulus, mode_floor, ZERO_ROUND_TO_MINUS)
3562
+ # assert_equal(upper_remainder - modulus, zero_r0, "zero_r0=#{zero_r0} < 0 " + text)
3563
+
3564
+ param = block.yield(lower_remainder, upper_remainder)
3565
+ boundary_lower = nil
3566
+ boundary_upper = nil
3567
+ if (boundary_exact_integral)
3568
+ boundary_lower = param - 1
3569
+ else
3570
+ boundary_lower = param
3571
+ end
3572
+ boundary_upper = param +1
3573
+
3574
+ 1.upto boundary_lower do |x|
3575
+ ALL_ROUNDING_MODES.each do |rm|
3576
+ if (rm.major == major_mode && rm.minor != MINOR_EVEN && rm.minor != MINOR_ODD)
3577
+ text = "m=#{modulus} x=#{x} rm=#{rm} s=#{remainders.inspect} param=#{param}"
3578
+ one_r0 = x.round_to_allowed_remainders(remainders, modulus, rm, ZERO_ROUND_UNNECESSARY)
3579
+ assert_equal(lower_remainder, one_r0, text)
3580
+ end
3581
+ end
3582
+ end
3583
+ if (boundary_exact_integral)
3584
+ ALL_ROUNDING_MODES.each do |rm|
3585
+ if (rm.major == major_mode && rm.minor != MINOR_EVEN && rm.minor != MINOR_ODD)
3586
+ text = "m=#{modulus} x=#{param} rm=#{rm} s=#{remainders.inspect}"
3587
+ x_r0 = param.round_to_allowed_remainders(remainders, modulus, rm, ZERO_ROUND_UNNECESSARY)
3588
+ assert(remainders.member?(x_r0), "x_r0=#{x_r0} " + text)
3589
+ end
3590
+ end
3591
+ end
3592
+ boundary_upper.upto upper_remainder do |x|
3593
+ ALL_ROUNDING_MODES.each do |rm|
3594
+ if (rm.major == major_mode && rm.minor != MINOR_EVEN && rm.minor != MINOR_ODD)
3595
+ text = "m=#{modulus} x=#{x} rm=#{rm} s=#{remainders.inspect}"
3596
+ other_r0 = x.round_to_allowed_remainders(remainders, modulus, rm, ZERO_ROUND_UNNECESSARY)
3597
+ assert_equal(upper_remainder, other_r0, text)
3598
+ end
3599
+ end
3600
+ end
3601
+ end
3602
+ end
3603
+ end
3604
+
1962
3605
  #
1963
3606
  # test conversion to String
1964
3607
  #
@@ -1995,53 +3638,53 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
1995
3638
  l = LongDecimal(224, 0)
1996
3639
  s = l.to_s(5)
1997
3640
  assert_equal("224.00000", s, "l=#{l.inspect} 5")
1998
- s = l.to_s(5, LongDecimal::ROUND_UNNECESSARY, 16)
3641
+ s = l.to_s(5, ROUND_UNNECESSARY, 16)
1999
3642
  assert_equal("e0.00000", s, "l=#{l.inspect} 5 ROUND_UNNECESSARY 16")
2000
3643
 
2001
3644
  l = LongDecimal(224, 1)
2002
- s = l.to_s(0, LongDecimal::ROUND_HALF_UP)
3645
+ s = l.to_s(0, ROUND_HALF_UP)
2003
3646
  assert_equal("22", s, "l=#{l.inspect} 0 ROUND_HALF_UP")
2004
- s = l.to_s(5, LongDecimal::ROUND_HALF_UP)
3647
+ s = l.to_s(5, ROUND_HALF_UP)
2005
3648
  assert_equal("22.40000", s, "l=#{l.inspect} 5 ROUND_HALF_UP")
2006
- s = l.to_s(5, LongDecimal::ROUND_HALF_UP, 16)
3649
+ s = l.to_s(5, ROUND_HALF_UP, 16)
2007
3650
  assert_equal("16.66666", s, "l=#{l.inspect} 5 ROUND_HALF_UP")
2008
- s = l.to_s(5, LongDecimal::ROUND_HALF_DOWN, 16)
3651
+ s = l.to_s(5, ROUND_HALF_DOWN, 16)
2009
3652
  assert_equal("16.66666", s, "l=#{l.inspect} 5 ROUND_HALF_DOWN")
2010
3653
 
2011
3654
  l = LongDecimal(224, 2)
2012
- s = l.to_s(0, LongDecimal::ROUND_HALF_UP)
3655
+ s = l.to_s(0, ROUND_HALF_UP)
2013
3656
  assert_equal("2", s, "l=#{l.inspect} 0 ROUND_HALF_UP")
2014
- s = l.to_s(5, LongDecimal::ROUND_HALF_UP)
3657
+ s = l.to_s(5, ROUND_HALF_UP)
2015
3658
  assert_equal("2.24000", s, "l=#{l.inspect} 5 ROUND_HALF_UP")
2016
- s = l.to_s(5, LongDecimal::ROUND_HALF_UP, 16)
3659
+ s = l.to_s(5, ROUND_HALF_UP, 16)
2017
3660
  assert_equal("2.3d70a", s, "l=#{l.inspect} 5 ROUND_HALF_UP")
2018
- s = l.to_s(5, LongDecimal::ROUND_HALF_DOWN, 16)
3661
+ s = l.to_s(5, ROUND_HALF_DOWN, 16)
2019
3662
  assert_equal("2.3d70a", s, "l=#{l.inspect} 5 ROUND_HALF_DOWN")
2020
3663
 
2021
3664
  l = LongDecimal(-224, 0)
2022
3665
  s = l.to_s(5)
2023
3666
  assert_equal("-224.00000", s, "l=#{l.inspect} 5")
2024
- s = l.to_s(5, LongDecimal::ROUND_UNNECESSARY, 16)
3667
+ s = l.to_s(5, ROUND_UNNECESSARY, 16)
2025
3668
  assert_equal("-e0.00000", s, "l=#{l.inspect} 5 ROUND_UNNECESSARY 16")
2026
3669
 
2027
3670
  l = LongDecimal(-224, 1)
2028
- s = l.to_s(0, LongDecimal::ROUND_HALF_UP)
3671
+ s = l.to_s(0, ROUND_HALF_UP)
2029
3672
  assert_equal("-22", s, "l=#{l.inspect} 0 ROUND_HALF_UP")
2030
- s = l.to_s(5, LongDecimal::ROUND_HALF_UP)
3673
+ s = l.to_s(5, ROUND_HALF_UP)
2031
3674
  assert_equal("-22.40000", s, "l=#{l.inspect} 5 ROUND_HALF_UP")
2032
- s = l.to_s(5, LongDecimal::ROUND_HALF_UP, 16)
3675
+ s = l.to_s(5, ROUND_HALF_UP, 16)
2033
3676
  assert_equal("-16.66666", s, "l=#{l.inspect} 5 ROUND_HALF_UP")
2034
- s = l.to_s(5, LongDecimal::ROUND_HALF_DOWN, 16)
3677
+ s = l.to_s(5, ROUND_HALF_DOWN, 16)
2035
3678
  assert_equal("-16.66666", s, "l=#{l.inspect} 5 ROUND_HALF_DOWN")
2036
3679
 
2037
3680
  l = LongDecimal(-224, 2)
2038
- s = l.to_s(0, LongDecimal::ROUND_HALF_UP)
3681
+ s = l.to_s(0, ROUND_HALF_UP)
2039
3682
  assert_equal("-2", s, "l=#{l.inspect} 0 ROUND_HALF_UP")
2040
- s = l.to_s(5, LongDecimal::ROUND_HALF_UP)
3683
+ s = l.to_s(5, ROUND_HALF_UP)
2041
3684
  assert_equal("-2.24000", s, "l=#{l.inspect} 5 ROUND_HALF_UP")
2042
- s = l.to_s(5, LongDecimal::ROUND_HALF_UP, 16)
3685
+ s = l.to_s(5, ROUND_HALF_UP, 16)
2043
3686
  assert_equal("-2.3d70a", s, "l=#{l.inspect} 5 ROUND_HALF_UP")
2044
- s = l.to_s(5, LongDecimal::ROUND_HALF_DOWN, 16)
3687
+ s = l.to_s(5, ROUND_HALF_DOWN, 16)
2045
3688
  assert_equal("-2.3d70a", s, "l=#{l.inspect} 5 ROUND_HALF_DOWN")
2046
3689
  end
2047
3690
 
@@ -2070,11 +3713,11 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
2070
3713
  def test_to_ld
2071
3714
  print "\ntest_to_ld [#{Time.now}]: "
2072
3715
  x = LongDecimal(123, 100)
2073
- y = x.to_ld(20, LongMath::ROUND_UP)
3716
+ y = x.to_ld(20, ROUND_UP)
2074
3717
  z = LongDecimal(1, 20)
2075
3718
  assert_kind_of(LongDecimal, y, "must be ld")
2076
3719
  assert_equal(y, z, "x=#{x} y=#{y}")
2077
- y = x.to_ld(20, LongMath::ROUND_HALF_UP)
3720
+ y = x.to_ld(20, ROUND_HALF_UP)
2078
3721
  z = LongDecimal(0, 20)
2079
3722
  assert_kind_of(LongDecimal, y, "must be ld")
2080
3723
  assert_equal(y, z, "x=#{x} y=#{y}")
@@ -2340,11 +3983,11 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
2340
3983
  print "\ntest_int_mul [#{Time.now}] (90 sec): "
2341
3984
  $stdout.flush
2342
3985
  65.times do |i|
2343
- x0 = (1<<i)-1
3986
+ x0 = (1 << i)-1
2344
3987
  3.times do |k|
2345
3988
  x = x0+k
2346
3989
  65.times do |j|
2347
- y0 = (1<<j)-1
3990
+ y0 = (1 << j)-1
2348
3991
  3.times do |l|
2349
3992
  y = y0+l
2350
3993
  z = x*y
@@ -2366,7 +4009,7 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
2366
4009
  # test multiplication which uses internally multiplication of fixnum, which is buggy in JRuby and has been fixed here.
2367
4010
  #
2368
4011
  def test_mul2
2369
- print "\ntest_mul2 [#{Time.now}] (25 min): "
4012
+ print "\ntest_mul2 [#{Time.now}]: "
2370
4013
  $stdout.flush
2371
4014
 
2372
4015
  map = {}
@@ -2383,7 +4026,6 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
2383
4026
  end
2384
4027
  end
2385
4028
  map.each do |x, x1|
2386
- # puts "x=#{x} x1=#{x1}"
2387
4029
  print ":"
2388
4030
  $stdout.flush
2389
4031
  map.each do |y, y1|
@@ -2765,248 +4407,248 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
2765
4407
 
2766
4408
  y = LongDecimal(3, 1) # 0.3 dy=0 sy=1
2767
4409
  # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = -3 -> use 0
2768
- z = x.divide(y, LongMath::ROUND_DOWN)
2769
- zz = Rational(224, 30).to_ld(0, LongMath::ROUND_DOWN)
4410
+ z = x.divide(y, ROUND_DOWN)
4411
+ zz = Rational(224, 30).to_ld(0, ROUND_DOWN)
2770
4412
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2771
4413
  assert_equal(zz, z, "z=#{z.inspect}")
2772
- z = x.divide(y, LongMath::ROUND_UP)
2773
- zz = Rational(224, 30).to_ld(0, LongMath::ROUND_UP)
4414
+ z = x.divide(y, ROUND_UP)
4415
+ zz = Rational(224, 30).to_ld(0, ROUND_UP)
2774
4416
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2775
4417
  assert_equal(zz, z, "z=#{z.inspect}")
2776
4418
  # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = -1 -> use 0
2777
- z = y.divide(x, LongMath::ROUND_DOWN)
2778
- zz = Rational(30, 224).to_ld(0, LongMath::ROUND_DOWN)
4419
+ z = y.divide(x, ROUND_DOWN)
4420
+ zz = Rational(30, 224).to_ld(0, ROUND_DOWN)
2779
4421
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2780
4422
  assert_equal(zz, z, "z=#{z.inspect}")
2781
- z = y.divide(x, LongMath::ROUND_UP)
2782
- zz = Rational(30, 224).to_ld(0, LongMath::ROUND_UP)
4423
+ z = y.divide(x, ROUND_UP)
4424
+ zz = Rational(30, 224).to_ld(0, ROUND_UP)
2783
4425
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2784
4426
  assert_equal(zz, z, "z=#{z.inspect}")
2785
4427
 
2786
4428
  # x= 2.24 dx=1 sx=2
2787
4429
  y = LongDecimal(30000000, 8) # 0.30000000 dy=0 sy=8
2788
4430
  # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = -1 -> use 0
2789
- z = x.divide(y, LongMath::ROUND_DOWN)
2790
- zz = Rational(224, 30).to_ld(0, LongMath::ROUND_DOWN)
4431
+ z = x.divide(y, ROUND_DOWN)
4432
+ zz = Rational(224, 30).to_ld(0, ROUND_DOWN)
2791
4433
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2792
4434
  assert_equal(zz, z, "z=#{z.inspect}")
2793
- z = x.divide(y, LongMath::ROUND_UP)
2794
- zz = Rational(224, 30).to_ld(0, LongMath::ROUND_UP)
4435
+ z = x.divide(y, ROUND_UP)
4436
+ zz = Rational(224, 30).to_ld(0, ROUND_UP)
2795
4437
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2796
4438
  assert_equal(zz, z, "z=#{z.inspect}")
2797
4439
  # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = 1
2798
- z = y.divide(x, LongMath::ROUND_DOWN)
2799
- zz = Rational(30, 224).to_ld(1, LongMath::ROUND_DOWN)
4440
+ z = y.divide(x, ROUND_DOWN)
4441
+ zz = Rational(30, 224).to_ld(1, ROUND_DOWN)
2800
4442
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2801
4443
  assert_equal(zz, z, "z=#{z.inspect}")
2802
- z = y.divide(x, LongMath::ROUND_UP)
2803
- zz = Rational(30, 224).to_ld(1, LongMath::ROUND_UP)
4444
+ z = y.divide(x, ROUND_UP)
4445
+ zz = Rational(30, 224).to_ld(1, ROUND_UP)
2804
4446
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2805
4447
  assert_equal(zz, z, "z=#{z.inspect}")
2806
4448
 
2807
4449
  # x= 2.24 dx=1 sx=2
2808
4450
  y = LongDecimal(3, 4) # 0.0003 dy=-4 sy=4
2809
4451
  # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = -8 -> use 0
2810
- z = x.divide(y, LongMath::ROUND_DOWN)
2811
- zz = Rational(22400, 3).to_ld(0, LongMath::ROUND_DOWN)
4452
+ z = x.divide(y, ROUND_DOWN)
4453
+ zz = Rational(22400, 3).to_ld(0, ROUND_DOWN)
2812
4454
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2813
4455
  assert_equal(zz, z, "z=#{z.inspect}")
2814
- z = x.divide(y, LongMath::ROUND_UP)
2815
- zz = Rational(22400, 3).to_ld(0, LongMath::ROUND_UP)
4456
+ z = x.divide(y, ROUND_UP)
4457
+ zz = Rational(22400, 3).to_ld(0, ROUND_UP)
2816
4458
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2817
4459
  assert_equal(zz, z, "z=#{z.inspect}")
2818
4460
  # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = 2
2819
- z = y.divide(x, LongMath::ROUND_DOWN)
2820
- zz = Rational(3, 22400).to_ld(2, LongMath::ROUND_DOWN)
4461
+ z = y.divide(x, ROUND_DOWN)
4462
+ zz = Rational(3, 22400).to_ld(2, ROUND_DOWN)
2821
4463
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2822
4464
  assert_equal(zz, z, "z=#{z.inspect}")
2823
- z = y.divide(x, LongMath::ROUND_UP)
2824
- zz = Rational(3, 22400).to_ld(2, LongMath::ROUND_UP)
4465
+ z = y.divide(x, ROUND_UP)
4466
+ zz = Rational(3, 22400).to_ld(2, ROUND_UP)
2825
4467
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2826
4468
  assert_equal(zz, z, "z=#{z.inspect}")
2827
4469
 
2828
4470
  # x= 2.24 dx=1 sx=2
2829
4471
  y = LongDecimal(3333, 2) # 33.33 dy=2 sy=2
2830
4472
  # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = 1
2831
- z = x.divide(y, LongMath::ROUND_DOWN)
2832
- zz = Rational(224, 3333).to_ld(1, LongMath::ROUND_DOWN)
4473
+ z = x.divide(y, ROUND_DOWN)
4474
+ zz = Rational(224, 3333).to_ld(1, ROUND_DOWN)
2833
4475
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2834
4476
  assert_equal(zz, z, "z=#{z.inspect}")
2835
- z = x.divide(y, LongMath::ROUND_UP)
2836
- zz = Rational(224, 3333).to_ld(1, LongMath::ROUND_UP)
4477
+ z = x.divide(y, ROUND_UP)
4478
+ zz = Rational(224, 3333).to_ld(1, ROUND_UP)
2837
4479
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2838
4480
  assert_equal(zz, z, "z=#{z.inspect}")
2839
4481
  # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = -1 -> use 0
2840
- z = y.divide(x, LongMath::ROUND_DOWN)
2841
- zz = Rational(3333, 224).to_ld(0, LongMath::ROUND_DOWN)
4482
+ z = y.divide(x, ROUND_DOWN)
4483
+ zz = Rational(3333, 224).to_ld(0, ROUND_DOWN)
2842
4484
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2843
4485
  assert_equal(zz, z, "z=#{z.inspect}")
2844
- z = y.divide(x, LongMath::ROUND_UP)
2845
- zz = Rational(3333, 224).to_ld(0, LongMath::ROUND_UP)
4486
+ z = y.divide(x, ROUND_UP)
4487
+ zz = Rational(3333, 224).to_ld(0, ROUND_UP)
2846
4488
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2847
4489
  assert_equal(zz, z, "z=#{z.inspect}")
2848
4490
 
2849
4491
  # x= 2.24 dx=1 sx=2
2850
4492
  y = LongDecimal(33333, 2) # 333.33 dy=3 sy=2
2851
4493
  # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = 2
2852
- z = x.divide(y, LongMath::ROUND_DOWN)
2853
- zz = Rational(224, 33333).to_ld(2, LongMath::ROUND_DOWN)
4494
+ z = x.divide(y, ROUND_DOWN)
4495
+ zz = Rational(224, 33333).to_ld(2, ROUND_DOWN)
2854
4496
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2855
4497
  assert_equal(zz, z, "z=#{z.inspect}")
2856
- z = x.divide(y, LongMath::ROUND_UP)
2857
- zz = Rational(224, 33333).to_ld(2, LongMath::ROUND_UP)
4498
+ z = x.divide(y, ROUND_UP)
4499
+ zz = Rational(224, 33333).to_ld(2, ROUND_UP)
2858
4500
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2859
4501
  assert_equal(zz, z, "z=#{z.inspect}")
2860
4502
  # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = -2 -> use 0
2861
- z = y.divide(x, LongMath::ROUND_DOWN)
2862
- zz = Rational(33333, 224).to_ld(0, LongMath::ROUND_DOWN)
4503
+ z = y.divide(x, ROUND_DOWN)
4504
+ zz = Rational(33333, 224).to_ld(0, ROUND_DOWN)
2863
4505
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2864
4506
  assert_equal(zz, z, "z=#{z.inspect}")
2865
- z = y.divide(x, LongMath::ROUND_UP)
2866
- zz = Rational(33333, 224).to_ld(0, LongMath::ROUND_UP)
4507
+ z = y.divide(x, ROUND_UP)
4508
+ zz = Rational(33333, 224).to_ld(0, ROUND_UP)
2867
4509
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2868
4510
  assert_equal(zz, z, "z=#{z.inspect}")
2869
4511
 
2870
4512
  # x= 2.24 dx=1 sx=2
2871
4513
  y = LongDecimal(33333, 3) # 33.333 dy=2 sy=3
2872
4514
  # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = 1
2873
- z = x.divide(y, LongMath::ROUND_DOWN)
2874
- zz = Rational(2240, 33333).to_ld(1, LongMath::ROUND_DOWN)
4515
+ z = x.divide(y, ROUND_DOWN)
4516
+ zz = Rational(2240, 33333).to_ld(1, ROUND_DOWN)
2875
4517
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2876
4518
  assert_equal(zz, z, "z=#{z.inspect}")
2877
- z = x.divide(y, LongMath::ROUND_UP)
2878
- zz = Rational(2240, 33333).to_ld(1, LongMath::ROUND_UP)
4519
+ z = x.divide(y, ROUND_UP)
4520
+ zz = Rational(2240, 33333).to_ld(1, ROUND_UP)
2879
4521
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2880
4522
  assert_equal(zz, z, "z=#{z.inspect}")
2881
4523
  # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = -1 -> use 0
2882
- z = y.divide(x, LongMath::ROUND_DOWN)
2883
- zz = Rational(33333, 2240).to_ld(0, LongMath::ROUND_DOWN)
4524
+ z = y.divide(x, ROUND_DOWN)
4525
+ zz = Rational(33333, 2240).to_ld(0, ROUND_DOWN)
2884
4526
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2885
4527
  assert_equal(zz, z, "z=#{z.inspect}")
2886
- z = y.divide(x, LongMath::ROUND_UP)
2887
- zz = Rational(33333, 2240).to_ld(0, LongMath::ROUND_UP)
4528
+ z = y.divide(x, ROUND_UP)
4529
+ zz = Rational(33333, 2240).to_ld(0, ROUND_UP)
2888
4530
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2889
4531
  assert_equal(zz, z, "z=#{z.inspect}")
2890
4532
 
2891
4533
  # x= 2.24 dx=1 sx=2
2892
4534
  y = LongDecimal(3333, 3) # 3.333 dy=1 sy=3
2893
4535
  # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = 0
2894
- z = x.divide(y, LongMath::ROUND_DOWN)
2895
- zz = Rational(2240, 3333).to_ld(0, LongMath::ROUND_DOWN)
4536
+ z = x.divide(y, ROUND_DOWN)
4537
+ zz = Rational(2240, 3333).to_ld(0, ROUND_DOWN)
2896
4538
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2897
4539
  assert_equal(zz, z, "z=#{z.inspect}")
2898
- z = x.divide(y, LongMath::ROUND_UP)
2899
- zz = Rational(2240, 3333).to_ld(0, LongMath::ROUND_UP)
4540
+ z = x.divide(y, ROUND_UP)
4541
+ zz = Rational(2240, 3333).to_ld(0, ROUND_UP)
2900
4542
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2901
4543
  assert_equal(zz, z, "z=#{z.inspect}")
2902
4544
  # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = 0
2903
- z = y.divide(x, LongMath::ROUND_DOWN)
2904
- zz = Rational(3333, 2240).to_ld(0, LongMath::ROUND_DOWN)
4545
+ z = y.divide(x, ROUND_DOWN)
4546
+ zz = Rational(3333, 2240).to_ld(0, ROUND_DOWN)
2905
4547
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2906
4548
  assert_equal(zz, z, "z=#{z.inspect}")
2907
- z = y.divide(x, LongMath::ROUND_UP)
2908
- zz = Rational(3333, 2240).to_ld(0, LongMath::ROUND_UP)
4549
+ z = y.divide(x, ROUND_UP)
4550
+ zz = Rational(3333, 2240).to_ld(0, ROUND_UP)
2909
4551
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2910
4552
  assert_equal(zz, z, "z=#{z.inspect}")
2911
4553
 
2912
4554
  # x= 2.24 dx=1 sx=2
2913
4555
  y = LongDecimal(123456789, 3) # 123456.789 dy=6 sy=3
2914
4556
  # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = 5
2915
- z = x.divide(y, LongMath::ROUND_DOWN)
2916
- zz = Rational(2240, 123456789).to_ld(5, LongMath::ROUND_DOWN)
4557
+ z = x.divide(y, ROUND_DOWN)
4558
+ zz = Rational(2240, 123456789).to_ld(5, ROUND_DOWN)
2917
4559
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2918
4560
  assert_equal(zz, z, "z=#{z.inspect}")
2919
- z = x.divide(y, LongMath::ROUND_UP)
2920
- zz = Rational(2240, 123456789).to_ld(5, LongMath::ROUND_UP)
4561
+ z = x.divide(y, ROUND_UP)
4562
+ zz = Rational(2240, 123456789).to_ld(5, ROUND_UP)
2921
4563
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2922
4564
  assert_equal(zz, z, "z=#{z.inspect}")
2923
4565
  # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = -5 -> use 0
2924
- z = y.divide(x, LongMath::ROUND_DOWN)
2925
- zz = Rational(123456789, 2240).to_ld(0, LongMath::ROUND_DOWN)
4566
+ z = y.divide(x, ROUND_DOWN)
4567
+ zz = Rational(123456789, 2240).to_ld(0, ROUND_DOWN)
2926
4568
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2927
4569
  assert_equal(zz, z, "z=#{z.inspect}")
2928
- z = y.divide(x, LongMath::ROUND_UP)
2929
- zz = Rational(123456789, 2240).to_ld(0, LongMath::ROUND_UP)
4570
+ z = y.divide(x, ROUND_UP)
4571
+ zz = Rational(123456789, 2240).to_ld(0, ROUND_UP)
2930
4572
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2931
4573
  assert_equal(zz, z, "z=#{z.inspect}")
2932
4574
 
2933
4575
  # x= 2.24 dx=1 sx=2
2934
4576
  y = 5.to_ld # 5 dy=1 sy=0
2935
4577
  # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = -2 -> use 0
2936
- z = x.divide(y, LongMath::ROUND_DOWN)
2937
- zz = Rational(224, 500).to_ld(0, LongMath::ROUND_DOWN)
4578
+ z = x.divide(y, ROUND_DOWN)
4579
+ zz = Rational(224, 500).to_ld(0, ROUND_DOWN)
2938
4580
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2939
4581
  assert_equal(zz, z, "z=#{z.inspect}")
2940
- z = x.divide(y, LongMath::ROUND_UP)
2941
- zz = Rational(224, 500).to_ld(0, LongMath::ROUND_UP)
4582
+ z = x.divide(y, ROUND_UP)
4583
+ zz = Rational(224, 500).to_ld(0, ROUND_UP)
2942
4584
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2943
4585
  assert_equal(zz, z, "z=#{z.inspect}")
2944
4586
  # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = -2 -> use 0
2945
- z = y.divide(x, LongMath::ROUND_DOWN)
2946
- zz = Rational(500, 224).to_ld(0, LongMath::ROUND_DOWN)
4587
+ z = y.divide(x, ROUND_DOWN)
4588
+ zz = Rational(500, 224).to_ld(0, ROUND_DOWN)
2947
4589
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2948
4590
  assert_equal(zz, z, "z=#{z.inspect}")
2949
- z = y.divide(x, LongMath::ROUND_UP)
2950
- zz = Rational(500, 224).to_ld(0, LongMath::ROUND_UP)
4591
+ z = y.divide(x, ROUND_UP)
4592
+ zz = Rational(500, 224).to_ld(0, ROUND_UP)
2951
4593
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2952
4594
  assert_equal(zz, z, "z=#{z.inspect}")
2953
4595
 
2954
4596
  # x= 2.24 dx=1 sx=2
2955
4597
  y = 5.001.to_ld # dy=1 sy=3
2956
4598
  # 2dy+sy+sx-max(dx+sx,dy+sy)-3 = 0
2957
- z = x.divide(y, LongMath::ROUND_DOWN)
2958
- zz = Rational(224, 500).to_ld(0, LongMath::ROUND_DOWN)
4599
+ z = x.divide(y, ROUND_DOWN)
4600
+ zz = Rational(224, 500).to_ld(0, ROUND_DOWN)
2959
4601
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2960
4602
  assert_equal(zz, z, "z=#{z.inspect}")
2961
- z = x.divide(y, LongMath::ROUND_UP)
2962
- zz = Rational(224, 500).to_ld(0, LongMath::ROUND_UP)
4603
+ z = x.divide(y, ROUND_UP)
4604
+ zz = Rational(224, 500).to_ld(0, ROUND_UP)
2963
4605
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2964
4606
  assert_equal(zz, z, "z=#{z.inspect}")
2965
4607
  # 2dx+sx+sy-max(dx+sx,dy+sy)-3 = 0
2966
- z = y.divide(x, LongMath::ROUND_DOWN)
2967
- zz = Rational(500, 224).to_ld(0, LongMath::ROUND_DOWN)
4608
+ z = y.divide(x, ROUND_DOWN)
4609
+ zz = Rational(500, 224).to_ld(0, ROUND_DOWN)
2968
4610
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2969
4611
  assert_equal(zz, z, "z=#{z.inspect}")
2970
- z = y.divide(x, LongMath::ROUND_UP)
2971
- zz = Rational(500, 224).to_ld(0, LongMath::ROUND_UP)
4612
+ z = y.divide(x, ROUND_UP)
4613
+ zz = Rational(500, 224).to_ld(0, ROUND_UP)
2972
4614
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2973
4615
  assert_equal(zz, z, "z=#{z.inspect}")
2974
4616
 
2975
4617
  y = Rational(5, 3).to_ld
2976
4618
  # y is has no scale, use scale of x
2977
- z = x.divide(y, LongMath::ROUND_DOWN)
2978
- zz = Rational(224*3, 500).to_ld(0, LongMath::ROUND_DOWN)
4619
+ z = x.divide(y, ROUND_DOWN)
4620
+ zz = Rational(224*3, 500).to_ld(0, ROUND_DOWN)
2979
4621
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2980
4622
  assert_equal(zz, z, "z=#{z.inspect}")
2981
- z = x.divide(y, LongMath::ROUND_UP)
2982
- zz = Rational(224*3, 500).to_ld(0, LongMath::ROUND_UP)
4623
+ z = x.divide(y, ROUND_UP)
4624
+ zz = Rational(224*3, 500).to_ld(0, ROUND_UP)
2983
4625
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2984
4626
  assert_equal(zz, z, "z=#{z.inspect}")
2985
4627
  # y is has no scale, use scale of x
2986
- z = y.divide(x, LongMath::ROUND_DOWN)
2987
- zz = Rational(500, 224*3).to_ld(0, LongMath::ROUND_DOWN)
4628
+ z = y.divide(x, ROUND_DOWN)
4629
+ zz = Rational(500, 224*3).to_ld(0, ROUND_DOWN)
2988
4630
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2989
4631
  assert_equal(zz, z, "z=#{z.inspect}")
2990
- z = y.divide(x, LongMath::ROUND_UP)
2991
- zz = Rational(500, 224*3).to_ld(0, LongMath::ROUND_UP)
4632
+ z = y.divide(x, ROUND_UP)
4633
+ zz = Rational(500, 224*3).to_ld(0, ROUND_UP)
2992
4634
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2993
4635
  assert_equal(zz, z, "z=#{z.inspect}")
2994
4636
 
2995
4637
  y = LongDecimalQuot(Rational(5, 3), 3).to_ld
2996
- z = x.divide(y, LongMath::ROUND_DOWN)
2997
- zz = Rational(224*3, 500).to_ld(0, LongMath::ROUND_DOWN)
4638
+ z = x.divide(y, ROUND_DOWN)
4639
+ zz = Rational(224*3, 500).to_ld(0, ROUND_DOWN)
2998
4640
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
2999
4641
  assert_equal(zz, z, "z=#{z.inspect}")
3000
- z = x.divide(y, LongMath::ROUND_UP)
3001
- zz = Rational(224*3, 500).to_ld(0, LongMath::ROUND_UP)
4642
+ z = x.divide(y, ROUND_UP)
4643
+ zz = Rational(224*3, 500).to_ld(0, ROUND_UP)
3002
4644
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3003
4645
  assert_equal(zz, z, "z=#{z.inspect}")
3004
- z = y.divide(x, LongMath::ROUND_DOWN)
3005
- zz = Rational(500, 224*3).to_ld(0, LongMath::ROUND_DOWN)
4646
+ z = y.divide(x, ROUND_DOWN)
4647
+ zz = Rational(500, 224*3).to_ld(0, ROUND_DOWN)
3006
4648
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3007
4649
  assert_equal(zz, z, "z=#{z.inspect}")
3008
- z = y.divide(x, LongMath::ROUND_UP)
3009
- zz = Rational(500, 224*3).to_ld(0, LongMath::ROUND_UP)
4650
+ z = y.divide(x, ROUND_UP)
4651
+ zz = Rational(500, 224*3).to_ld(0, ROUND_UP)
3010
4652
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3011
4653
  assert_equal(zz, z, "z=#{z.inspect}")
3012
4654
  end
@@ -3020,7 +4662,7 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
3020
4662
 
3021
4663
  y = Complex(5, 3)
3022
4664
  puts("x=#{x.inspect} y=#{y.inspect}")
3023
- z = x.divide(y, LongMath::ROUND_DOWN)
4665
+ z = x.divide(y, ROUND_DOWN)
3024
4666
  zz = 2.24 / Complex(5, 3)
3025
4667
  assert_kind_of(Complex, z, "z=#{z.inspect}")
3026
4668
  assert((zz-z).abs < 1e-9, "z=#{z.inspect}")
@@ -3035,219 +4677,219 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
3035
4677
  x = LongDecimal(224, 2) # 2.24
3036
4678
 
3037
4679
  y = LongDecimal(3, 1) # 0.3
3038
- z = x.divide_s(y, 1, LongMath::ROUND_DOWN)
3039
- zz = Rational(224, 30).to_ld(1, LongMath::ROUND_DOWN)
4680
+ z = x.divide_s(y, 1, ROUND_DOWN)
4681
+ zz = Rational(224, 30).to_ld(1, ROUND_DOWN)
3040
4682
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3041
4683
  assert_equal(zz, z, "z=#{z.inspect}")
3042
- z = x.divide_s(y, 1, LongMath::ROUND_UP)
3043
- zz = Rational(224, 30).to_ld(1, LongMath::ROUND_UP)
4684
+ z = x.divide_s(y, 1, ROUND_UP)
4685
+ zz = Rational(224, 30).to_ld(1, ROUND_UP)
3044
4686
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3045
4687
  assert_equal(zz, z, "z=#{z.inspect}")
3046
- z = y.divide_s(x, 1, LongMath::ROUND_DOWN)
3047
- zz = Rational(30, 224).to_ld(1, LongMath::ROUND_DOWN)
4688
+ z = y.divide_s(x, 1, ROUND_DOWN)
4689
+ zz = Rational(30, 224).to_ld(1, ROUND_DOWN)
3048
4690
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3049
4691
  assert_equal(zz, z, "z=#{z.inspect}")
3050
- z = y.divide_s(x, 1, LongMath::ROUND_UP)
3051
- zz = Rational(30, 224).to_ld(1, LongMath::ROUND_UP)
4692
+ z = y.divide_s(x, 1, ROUND_UP)
4693
+ zz = Rational(30, 224).to_ld(1, ROUND_UP)
3052
4694
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3053
4695
  assert_equal(zz, z, "z=#{z.inspect}")
3054
4696
 
3055
4697
  y = LongDecimal(30000000, 8) # 0.30000000
3056
- z = x.divide_s(y, 1, LongMath::ROUND_DOWN)
3057
- zz = Rational(224, 30).to_ld(1, LongMath::ROUND_DOWN)
4698
+ z = x.divide_s(y, 1, ROUND_DOWN)
4699
+ zz = Rational(224, 30).to_ld(1, ROUND_DOWN)
3058
4700
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3059
4701
  assert_equal(zz, z, "z=#{z.inspect}")
3060
- z = x.divide_s(y, 1, LongMath::ROUND_UP)
3061
- zz = Rational(224, 30).to_ld(1, LongMath::ROUND_UP)
4702
+ z = x.divide_s(y, 1, ROUND_UP)
4703
+ zz = Rational(224, 30).to_ld(1, ROUND_UP)
3062
4704
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3063
4705
  assert_equal(zz, z, "z=#{z.inspect}")
3064
- z = y.divide_s(x, 2, LongMath::ROUND_DOWN)
3065
- zz = Rational(30, 224).to_ld(2, LongMath::ROUND_DOWN)
4706
+ z = y.divide_s(x, 2, ROUND_DOWN)
4707
+ zz = Rational(30, 224).to_ld(2, ROUND_DOWN)
3066
4708
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3067
4709
  assert_equal(zz, z, "z=#{z.inspect}")
3068
- z = y.divide_s(x, 20, LongMath::ROUND_UP)
3069
- zz = Rational(30, 224).to_ld(20, LongMath::ROUND_UP)
4710
+ z = y.divide_s(x, 20, ROUND_UP)
4711
+ zz = Rational(30, 224).to_ld(20, ROUND_UP)
3070
4712
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3071
4713
  assert_equal(zz, z, "z=#{z.inspect}")
3072
4714
 
3073
4715
  y = LongDecimal(3, 4) # 0.0003
3074
- z = x.divide_s(y, 2, LongMath::ROUND_DOWN)
3075
- zz = Rational(22400, 3).to_ld(2, LongMath::ROUND_DOWN)
4716
+ z = x.divide_s(y, 2, ROUND_DOWN)
4717
+ zz = Rational(22400, 3).to_ld(2, ROUND_DOWN)
3076
4718
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3077
4719
  assert_equal(zz, z, "z=#{z.inspect}")
3078
- z = x.divide_s(y, 2, LongMath::ROUND_UP)
3079
- zz = Rational(22400, 3).to_ld(2, LongMath::ROUND_UP)
4720
+ z = x.divide_s(y, 2, ROUND_UP)
4721
+ zz = Rational(22400, 3).to_ld(2, ROUND_UP)
3080
4722
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3081
4723
  assert_equal(zz, z, "z=#{z.inspect}")
3082
- z = y.divide_s(x, 3, LongMath::ROUND_DOWN)
3083
- zz = Rational(3, 22400).to_ld(3, LongMath::ROUND_DOWN)
4724
+ z = y.divide_s(x, 3, ROUND_DOWN)
4725
+ zz = Rational(3, 22400).to_ld(3, ROUND_DOWN)
3084
4726
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3085
4727
  assert_equal(zz, z, "z=#{z.inspect}")
3086
- z = y.divide_s(x, 2, LongMath::ROUND_UP)
3087
- zz = Rational(3, 22400).to_ld(2, LongMath::ROUND_UP)
4728
+ z = y.divide_s(x, 2, ROUND_UP)
4729
+ zz = Rational(3, 22400).to_ld(2, ROUND_UP)
3088
4730
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3089
4731
  assert_equal(zz, z, "z=#{z.inspect}")
3090
4732
 
3091
4733
  y = LongDecimal(3333, 2) # 33.33
3092
- z = x.divide_s(y, 4, LongMath::ROUND_DOWN)
3093
- zz = Rational(224, 3333).to_ld(4, LongMath::ROUND_DOWN)
4734
+ z = x.divide_s(y, 4, ROUND_DOWN)
4735
+ zz = Rational(224, 3333).to_ld(4, ROUND_DOWN)
3094
4736
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3095
4737
  assert_equal(zz, z, "z=#{z.inspect}")
3096
- z = x.divide_s(y, 30, LongMath::ROUND_UP)
3097
- zz = Rational(224, 3333).to_ld(30, LongMath::ROUND_UP)
4738
+ z = x.divide_s(y, 30, ROUND_UP)
4739
+ zz = Rational(224, 3333).to_ld(30, ROUND_UP)
3098
4740
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3099
4741
  assert_equal(zz, z, "z=#{z.inspect}")
3100
- z = y.divide_s(x, 4, LongMath::ROUND_DOWN)
3101
- zz = Rational(3333, 224).to_ld(4, LongMath::ROUND_DOWN)
4742
+ z = y.divide_s(x, 4, ROUND_DOWN)
4743
+ zz = Rational(3333, 224).to_ld(4, ROUND_DOWN)
3102
4744
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3103
4745
  assert_equal(zz, z, "z=#{z.inspect}")
3104
- z = y.divide_s(x, 1, LongMath::ROUND_UP)
3105
- zz = Rational(3333, 224).to_ld(1, LongMath::ROUND_UP)
4746
+ z = y.divide_s(x, 1, ROUND_UP)
4747
+ zz = Rational(3333, 224).to_ld(1, ROUND_UP)
3106
4748
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3107
4749
  assert_equal(zz, z, "z=#{z.inspect}")
3108
4750
 
3109
4751
  y = LongDecimal(33333, 2) # 333.33
3110
- z = x.divide_s(y, 3, LongMath::ROUND_DOWN)
3111
- zz = Rational(224, 33333).to_ld(3, LongMath::ROUND_DOWN)
4752
+ z = x.divide_s(y, 3, ROUND_DOWN)
4753
+ zz = Rational(224, 33333).to_ld(3, ROUND_DOWN)
3112
4754
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3113
4755
  assert_equal(zz, z, "z=#{z.inspect}")
3114
- z = x.divide_s(y, 3, LongMath::ROUND_UP)
3115
- zz = Rational(224, 33333).to_ld(3, LongMath::ROUND_UP)
4756
+ z = x.divide_s(y, 3, ROUND_UP)
4757
+ zz = Rational(224, 33333).to_ld(3, ROUND_UP)
3116
4758
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3117
4759
  assert_equal(zz, z, "z=#{z.inspect}")
3118
- z = y.divide_s(x, 33, LongMath::ROUND_DOWN)
3119
- zz = Rational(33333, 224).to_ld(33, LongMath::ROUND_DOWN)
4760
+ z = y.divide_s(x, 33, ROUND_DOWN)
4761
+ zz = Rational(33333, 224).to_ld(33, ROUND_DOWN)
3120
4762
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3121
4763
  assert_equal(zz, z, "z=#{z.inspect}")
3122
- z = y.divide_s(x, 4, LongMath::ROUND_UP)
3123
- zz = Rational(33333, 224).to_ld(4, LongMath::ROUND_UP)
4764
+ z = y.divide_s(x, 4, ROUND_UP)
4765
+ zz = Rational(33333, 224).to_ld(4, ROUND_UP)
3124
4766
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3125
4767
  assert_equal(zz, z, "z=#{z.inspect}")
3126
4768
 
3127
4769
  y = LongDecimal(33333, 3) # 33.333
3128
- z = x.divide_s(y, 2, LongMath::ROUND_DOWN)
3129
- zz = Rational(2240, 33333).to_ld(2, LongMath::ROUND_DOWN)
4770
+ z = x.divide_s(y, 2, ROUND_DOWN)
4771
+ zz = Rational(2240, 33333).to_ld(2, ROUND_DOWN)
3130
4772
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3131
4773
  assert_equal(zz, z, "z=#{z.inspect}")
3132
- z = x.divide_s(y, 2, LongMath::ROUND_UP)
3133
- zz = Rational(2240, 33333).to_ld(2, LongMath::ROUND_UP)
4774
+ z = x.divide_s(y, 2, ROUND_UP)
4775
+ zz = Rational(2240, 33333).to_ld(2, ROUND_UP)
3134
4776
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3135
4777
  assert_equal(zz, z, "z=#{z.inspect}")
3136
- z = y.divide_s(x, 2, LongMath::ROUND_DOWN)
3137
- zz = Rational(33333, 2240).to_ld(2, LongMath::ROUND_DOWN)
4778
+ z = y.divide_s(x, 2, ROUND_DOWN)
4779
+ zz = Rational(33333, 2240).to_ld(2, ROUND_DOWN)
3138
4780
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3139
4781
  assert_equal(zz, z, "z=#{z.inspect}")
3140
- z = y.divide_s(x, 1, LongMath::ROUND_UP)
3141
- zz = Rational(33333, 2240).to_ld(1, LongMath::ROUND_UP)
4782
+ z = y.divide_s(x, 1, ROUND_UP)
4783
+ zz = Rational(33333, 2240).to_ld(1, ROUND_UP)
3142
4784
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3143
4785
  assert_equal(zz, z, "z=#{z.inspect}")
3144
4786
 
3145
4787
  y = LongDecimal(3333, 3) # 3.333
3146
- z = x.divide_s(y, 1, LongMath::ROUND_DOWN)
3147
- zz = Rational(2240, 3333).to_ld(1, LongMath::ROUND_DOWN)
4788
+ z = x.divide_s(y, 1, ROUND_DOWN)
4789
+ zz = Rational(2240, 3333).to_ld(1, ROUND_DOWN)
3148
4790
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3149
4791
  assert_equal(zz, z, "z=#{z.inspect}")
3150
- z = x.divide_s(y, 1, LongMath::ROUND_UP)
3151
- zz = Rational(2240, 3333).to_ld(1, LongMath::ROUND_UP)
4792
+ z = x.divide_s(y, 1, ROUND_UP)
4793
+ zz = Rational(2240, 3333).to_ld(1, ROUND_UP)
3152
4794
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3153
4795
  assert_equal(zz, z, "z=#{z.inspect}")
3154
- z = y.divide_s(x, 1, LongMath::ROUND_DOWN)
3155
- zz = Rational(3333, 2240).to_ld(1, LongMath::ROUND_DOWN)
4796
+ z = y.divide_s(x, 1, ROUND_DOWN)
4797
+ zz = Rational(3333, 2240).to_ld(1, ROUND_DOWN)
3156
4798
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3157
4799
  assert_equal(zz, z, "z=#{z.inspect}")
3158
- z = y.divide_s(x, 1, LongMath::ROUND_UP)
3159
- zz = Rational(3333, 2240).to_ld(1, LongMath::ROUND_UP)
4800
+ z = y.divide_s(x, 1, ROUND_UP)
4801
+ zz = Rational(3333, 2240).to_ld(1, ROUND_UP)
3160
4802
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3161
4803
  assert_equal(zz, z, "z=#{z.inspect}")
3162
4804
 
3163
4805
  y = LongDecimal(123456789, 3) # 123456.789
3164
- z = x.divide_s(y, 3, LongMath::ROUND_DOWN)
3165
- zz = Rational(2240, 123456789).to_ld(3, LongMath::ROUND_DOWN)
4806
+ z = x.divide_s(y, 3, ROUND_DOWN)
4807
+ zz = Rational(2240, 123456789).to_ld(3, ROUND_DOWN)
3166
4808
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3167
4809
  assert_equal(zz, z, "z=#{z.inspect}")
3168
- z = x.divide_s(y, 7, LongMath::ROUND_UP)
3169
- zz = Rational(2240, 123456789).to_ld(7, LongMath::ROUND_UP)
4810
+ z = x.divide_s(y, 7, ROUND_UP)
4811
+ zz = Rational(2240, 123456789).to_ld(7, ROUND_UP)
3170
4812
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3171
4813
  assert_equal(zz, z, "z=#{z.inspect}")
3172
- z = y.divide_s(x, 0, LongMath::ROUND_DOWN)
3173
- zz = Rational(123456789, 2240).to_ld(0, LongMath::ROUND_DOWN)
4814
+ z = y.divide_s(x, 0, ROUND_DOWN)
4815
+ zz = Rational(123456789, 2240).to_ld(0, ROUND_DOWN)
3174
4816
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3175
4817
  assert_equal(zz, z, "z=#{z.inspect}")
3176
- z = y.divide_s(x, 9, LongMath::ROUND_UP)
3177
- zz = Rational(123456789, 2240).to_ld(9, LongMath::ROUND_UP)
4818
+ z = y.divide_s(x, 9, ROUND_UP)
4819
+ zz = Rational(123456789, 2240).to_ld(9, ROUND_UP)
3178
4820
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3179
4821
  assert_equal(zz, z, "z=#{z.inspect}")
3180
4822
 
3181
4823
  y = 5.to_ld # 5
3182
- z = x.divide_s(y, 1, LongMath::ROUND_DOWN)
3183
- zz = Rational(224, 500).to_ld(1, LongMath::ROUND_DOWN)
4824
+ z = x.divide_s(y, 1, ROUND_DOWN)
4825
+ zz = Rational(224, 500).to_ld(1, ROUND_DOWN)
3184
4826
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3185
4827
  assert_equal(zz, z, "z=#{z.inspect}")
3186
- z = x.divide_s(y, 1, LongMath::ROUND_UP)
3187
- zz = Rational(224, 500).to_ld(1, LongMath::ROUND_UP)
4828
+ z = x.divide_s(y, 1, ROUND_UP)
4829
+ zz = Rational(224, 500).to_ld(1, ROUND_UP)
3188
4830
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3189
4831
  assert_equal(zz, z, "z=#{z.inspect}")
3190
- z = y.divide_s(x, 1, LongMath::ROUND_DOWN)
3191
- zz = Rational(500, 224).to_ld(1, LongMath::ROUND_DOWN)
4832
+ z = y.divide_s(x, 1, ROUND_DOWN)
4833
+ zz = Rational(500, 224).to_ld(1, ROUND_DOWN)
3192
4834
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3193
4835
  assert_equal(zz, z, "z=#{z.inspect}")
3194
- z = y.divide_s(x, 1, LongMath::ROUND_UP)
3195
- zz = Rational(500, 224).to_ld(1, LongMath::ROUND_UP)
4836
+ z = y.divide_s(x, 1, ROUND_UP)
4837
+ zz = Rational(500, 224).to_ld(1, ROUND_UP)
3196
4838
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3197
4839
  assert_equal(zz, z, "z=#{z.inspect}")
3198
4840
 
3199
4841
  y = 5.001.to_ld # 5.001
3200
- z = x.divide_s(y, 1, LongMath::ROUND_DOWN)
3201
- zz = Rational(224, 500).to_ld(1, LongMath::ROUND_DOWN)
4842
+ z = x.divide_s(y, 1, ROUND_DOWN)
4843
+ zz = Rational(224, 500).to_ld(1, ROUND_DOWN)
3202
4844
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3203
4845
  assert_equal(zz, z, "z=#{z.inspect}")
3204
- z = x.divide_s(y, 1, LongMath::ROUND_UP)
3205
- zz = Rational(224, 500).to_ld(1, LongMath::ROUND_UP)
4846
+ z = x.divide_s(y, 1, ROUND_UP)
4847
+ zz = Rational(224, 500).to_ld(1, ROUND_UP)
3206
4848
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3207
4849
  assert_equal(zz, z, "z=#{z.inspect}")
3208
- z = y.divide_s(x, 1, LongMath::ROUND_DOWN)
3209
- zz = Rational(500, 224).to_ld(1, LongMath::ROUND_DOWN)
4850
+ z = y.divide_s(x, 1, ROUND_DOWN)
4851
+ zz = Rational(500, 224).to_ld(1, ROUND_DOWN)
3210
4852
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3211
4853
  assert_equal(zz, z, "z=#{z.inspect}")
3212
- z = y.divide_s(x, 1, LongMath::ROUND_UP)
3213
- zz = Rational(500, 224).to_ld(1, LongMath::ROUND_UP)
4854
+ z = y.divide_s(x, 1, ROUND_UP)
4855
+ zz = Rational(500, 224).to_ld(1, ROUND_UP)
3214
4856
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3215
4857
  assert_equal(zz, z, "z=#{z.inspect}")
3216
4858
 
3217
4859
  y = Rational(5, 3).to_ld(3) # 1.667
3218
- z = x.divide_s(y, 4, LongMath::ROUND_DOWN)
3219
- zz = Rational(2240, 1667).to_ld(4, LongMath::ROUND_DOWN)
4860
+ z = x.divide_s(y, 4, ROUND_DOWN)
4861
+ zz = Rational(2240, 1667).to_ld(4, ROUND_DOWN)
3220
4862
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3221
4863
  assert_equal(zz, z, "x=#{x} y=#{y} z=#{z} z=#{z.inspect}")
3222
- z = x.divide_s(y, 1, LongMath::ROUND_UP)
3223
- zz = Rational(2240, 1667).to_ld(1, LongMath::ROUND_UP)
4864
+ z = x.divide_s(y, 1, ROUND_UP)
4865
+ zz = Rational(2240, 1667).to_ld(1, ROUND_UP)
3224
4866
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3225
4867
  assert_equal(zz, z, "z=#{z.inspect}")
3226
4868
  # y is has no scale, use scale of x
3227
- z = y.divide_s(x, 1, LongMath::ROUND_DOWN)
3228
- zz = Rational(1667, 2240).to_ld(1, LongMath::ROUND_DOWN)
4869
+ z = y.divide_s(x, 1, ROUND_DOWN)
4870
+ zz = Rational(1667, 2240).to_ld(1, ROUND_DOWN)
3229
4871
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3230
4872
  assert_equal(zz, z, "z=#{z.inspect}")
3231
- z = y.divide_s(x, 1, LongMath::ROUND_UP)
3232
- zz = Rational(1667, 2240).to_ld(1, LongMath::ROUND_UP)
4873
+ z = y.divide_s(x, 1, ROUND_UP)
4874
+ zz = Rational(1667, 2240).to_ld(1, ROUND_UP)
3233
4875
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3234
4876
  assert_equal(zz, z, "z=#{z.inspect}")
3235
4877
 
3236
4878
  y = LongDecimalQuot(Rational(5, 3), 3).to_ld
3237
- z = x.divide_s(y, 1, LongMath::ROUND_DOWN)
3238
- zz = Rational(2240, 1667).to_ld(1, LongMath::ROUND_DOWN)
4879
+ z = x.divide_s(y, 1, ROUND_DOWN)
4880
+ zz = Rational(2240, 1667).to_ld(1, ROUND_DOWN)
3239
4881
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3240
4882
  assert_equal(zz, z, "z=#{z.inspect}")
3241
- z = x.divide_s(y, 1, LongMath::ROUND_UP)
3242
- zz = Rational(2240, 1667).to_ld(1, LongMath::ROUND_UP)
4883
+ z = x.divide_s(y, 1, ROUND_UP)
4884
+ zz = Rational(2240, 1667).to_ld(1, ROUND_UP)
3243
4885
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3244
4886
  assert_equal(zz, z, "z=#{z.inspect}")
3245
- z = y.divide_s(x, 2, LongMath::ROUND_DOWN)
3246
- zz = Rational(1667, 2240).to_ld(2, LongMath::ROUND_DOWN)
4887
+ z = y.divide_s(x, 2, ROUND_DOWN)
4888
+ zz = Rational(1667, 2240).to_ld(2, ROUND_DOWN)
3247
4889
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3248
4890
  assert_equal(zz, z, "z=#{z.inspect}")
3249
- z = y.divide_s(x, 224, LongMath::ROUND_UP)
3250
- zz = Rational(1667, 2240).to_ld(224, LongMath::ROUND_UP)
4891
+ z = y.divide_s(x, 224, ROUND_UP)
4892
+ zz = Rational(1667, 2240).to_ld(224, ROUND_UP)
3251
4893
  assert_kind_of(LongDecimal, z, "z=#{z.inspect}")
3252
4894
  assert_equal(zz, z, "z=#{z.inspect}")
3253
4895
  end
@@ -3260,7 +4902,7 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
3260
4902
  x = LongDecimal(224, 2) # 2.24
3261
4903
 
3262
4904
  y = Complex(5, 3)
3263
- z = x.divide_s(y, 2, LongMath::ROUND_DOWN)
4905
+ z = x.divide_s(y, 2, ROUND_DOWN)
3264
4906
  zz = 2.24 / Complex(5, 3)
3265
4907
  assert_kind_of(Complex, z, "z=#{z.inspect}")
3266
4908
  assert((zz-z).abs < 1e-9, "z=#{z.inspect}")
@@ -3848,79 +5490,79 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
3848
5490
  def test_sqrt
3849
5491
  print "\ntest_sqrt [#{Time.now}]: "
3850
5492
  x = LongDecimal.zero!(101)
3851
- y = check_sqrt(x, 120, LongDecimal::ROUND_UNNECESSARY, 0, 0, "zero")
5493
+ y = check_sqrt(x, 120, ROUND_UNNECESSARY, 0, 0, "zero")
3852
5494
  assert(y.zero?, "sqrt(0)")
3853
5495
 
3854
5496
  x = LongDecimal.one!(101)
3855
- y = check_sqrt(x, 120, LongDecimal::ROUND_UNNECESSARY, 0, 0, "one")
5497
+ y = check_sqrt(x, 120, ROUND_UNNECESSARY, 0, 0, "one")
3856
5498
  assert(y.one?, "sqrt(1)")
3857
5499
 
3858
5500
  x = LongDecimal.two!(101)
3859
- y0 = check_sqrt(x, 120, LongDecimal::ROUND_DOWN, 0, 1, "two")
5501
+ y0 = check_sqrt(x, 120, ROUND_DOWN, 0, 1, "two")
3860
5502
  assert(y0.square < x, "y0*y0")
3861
5503
  assert(y0.succ.square > x, "(y0.succ).square")
3862
- y1 = check_sqrt(x, 120, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
3863
- y2 = check_sqrt(x, 120, LongDecimal::ROUND_UP, -1, 0, "two")
5504
+ y1 = check_sqrt(x, 120, ROUND_HALF_EVEN, -1, 1, "two")
5505
+ y2 = check_sqrt(x, 120, ROUND_UP, -1, 0, "two")
3864
5506
  assert(y2.pred.square < x, "y2.pred.square")
3865
5507
  assert(y2.square > x, "y2*y2")
3866
5508
  assert(y0 <= y1, "y0 y1")
3867
5509
  assert(y1 <= y2, "y1 y2")
3868
5510
 
3869
- y0 = check_sqrt(x, 140, LongDecimal::ROUND_DOWN, 0, 1, "two")
5511
+ y0 = check_sqrt(x, 140, ROUND_DOWN, 0, 1, "two")
3870
5512
  assert(y0.square < x, "y0*y0")
3871
5513
  assert(y0.succ.square > x, "(y0.succ).square")
3872
- y1 = check_sqrt(x, 140, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
3873
- y2 = check_sqrt(x, 140, LongDecimal::ROUND_UP, -1, 0, "two")
5514
+ y1 = check_sqrt(x, 140, ROUND_HALF_EVEN, -1, 1, "two")
5515
+ y2 = check_sqrt(x, 140, ROUND_UP, -1, 0, "two")
3874
5516
  assert(y2.pred.square < x, "y2.pred.square")
3875
5517
  assert(y2.square > x, "y2*y2")
3876
5518
  assert(y0 <= y1, "y0 y1")
3877
5519
  assert(y1 <= y2, "y1 y2")
3878
5520
 
3879
- y0 = check_sqrt(x, 160, LongDecimal::ROUND_DOWN, 0, 1, "two")
5521
+ y0 = check_sqrt(x, 160, ROUND_DOWN, 0, 1, "two")
3880
5522
  assert(y0.square < x, "y0*y0")
3881
5523
  assert(y0.succ.square > x, "(y0.succ).square")
3882
- y1 = check_sqrt(x, 160, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
3883
- y2 = check_sqrt(x, 160, LongDecimal::ROUND_UP, -1, 0, "two")
5524
+ y1 = check_sqrt(x, 160, ROUND_HALF_EVEN, -1, 1, "two")
5525
+ y2 = check_sqrt(x, 160, ROUND_UP, -1, 0, "two")
3884
5526
  assert(y2.pred.square < x, "y2.pred.square")
3885
5527
  assert(y2.square > x, "y2*y2")
3886
5528
  assert(y0 <= y1, "y0 y1")
3887
5529
  assert(y1 <= y2, "y1 y2")
3888
5530
 
3889
- y0 = check_sqrt(x, 120, LongDecimal::ROUND_DOWN, 0, 1, "two")
5531
+ y0 = check_sqrt(x, 120, ROUND_DOWN, 0, 1, "two")
3890
5532
  assert(y0.square < x, "y0*y0")
3891
5533
  assert(y0.succ.square > x, "(y0.succ).square")
3892
- y1 = check_sqrt(x, 120, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
3893
- y2 = check_sqrt(x, 120, LongDecimal::ROUND_UP, -1, 0, "two")
5534
+ y1 = check_sqrt(x, 120, ROUND_HALF_EVEN, -1, 1, "two")
5535
+ y2 = check_sqrt(x, 120, ROUND_UP, -1, 0, "two")
3894
5536
  assert(y2.pred.square < x, "y2.pred.square")
3895
5537
  assert(y2.square > x, "y2*y2")
3896
5538
  assert(y0 <= y1, "y0 y1")
3897
5539
  assert(y1 <= y2, "y1 y2")
3898
5540
 
3899
- y0 = check_sqrt(x, 100, LongDecimal::ROUND_DOWN, 0, 1, "two")
5541
+ y0 = check_sqrt(x, 100, ROUND_DOWN, 0, 1, "two")
3900
5542
  assert(y0.square < x, "y0*y0")
3901
5543
  assert(y0.succ.square > x, "(y0.succ).square")
3902
- y1 = check_sqrt(x, 100, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
3903
- y2 = check_sqrt(x, 100, LongDecimal::ROUND_UP, -1, 0, "two")
5544
+ y1 = check_sqrt(x, 100, ROUND_HALF_EVEN, -1, 1, "two")
5545
+ y2 = check_sqrt(x, 100, ROUND_UP, -1, 0, "two")
3904
5546
  assert(y2.pred.square < x, "y2.pred.square")
3905
5547
  assert(y2.square > x, "y2*y2")
3906
5548
  assert(y0 <= y1, "y0 y1")
3907
5549
  assert(y1 <= y2, "y1 y2")
3908
5550
 
3909
5551
  x = 3.to_ld
3910
- y0 = check_sqrt(x, 120, LongDecimal::ROUND_DOWN, 0, 1, "three")
5552
+ y0 = check_sqrt(x, 120, ROUND_DOWN, 0, 1, "three")
3911
5553
  assert(y0.square < x, "y0*y0")
3912
5554
  assert(y0.succ.square > x, "(y0.succ).square")
3913
- y1 = check_sqrt(x, 120, LongDecimal::ROUND_HALF_EVEN, -1, 1, "three")
3914
- y2 = check_sqrt(x, 120, LongDecimal::ROUND_UP, -1, 0, "three")
5555
+ y1 = check_sqrt(x, 120, ROUND_HALF_EVEN, -1, 1, "three")
5556
+ y2 = check_sqrt(x, 120, ROUND_UP, -1, 0, "three")
3915
5557
  assert(y2.pred.square < x, "y2.pred.square")
3916
5558
  assert(y2.square > x, "y2*y2")
3917
5559
  assert(y0 <= y1, "y0 y1")
3918
5560
  assert(y1 <= y2, "y1 y2")
3919
5561
 
3920
5562
  x = 4.to_ld(101)
3921
- y0 = check_sqrt(x, 120, LongDecimal::ROUND_DOWN, 0, 0, "four")
3922
- y1 = check_sqrt(x, 120, LongDecimal::ROUND_HALF_EVEN, 0, 0, "four")
3923
- y2 = check_sqrt(x, 120, LongDecimal::ROUND_UP, 0, 0, "four")
5563
+ y0 = check_sqrt(x, 120, ROUND_DOWN, 0, 0, "four")
5564
+ y1 = check_sqrt(x, 120, ROUND_HALF_EVEN, 0, 0, "four")
5565
+ y2 = check_sqrt(x, 120, ROUND_UP, 0, 0, "four")
3924
5566
  assert_equal(y0, y1, "y0 y1")
3925
5567
  assert_equal(y1, y2, "y1 y2")
3926
5568
  end
@@ -3964,21 +5606,21 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
3964
5606
  def test_non_ld_sqrt
3965
5607
  print "\ntest_non_ld_sqrt [#{Time.now}]: "
3966
5608
  xi = 77
3967
- yi = LongMath.sqrt(xi, 31, LongMath::ROUND_HALF_EVEN)
3968
- zi = yi.square.round_to_scale(30, LongMath::ROUND_HALF_EVEN)
5609
+ yi = LongMath.sqrt(xi, 31, ROUND_HALF_EVEN)
5610
+ zi = yi.square.round_to_scale(30, ROUND_HALF_EVEN)
3969
5611
  assert(zi.is_int?, "zi=#{zi.to_s}")
3970
5612
  assert_equal(xi, zi.to_i, "zi")
3971
5613
 
3972
5614
  xf = 77.0
3973
- yf = LongMath.sqrt(xf, 31, LongMath::ROUND_HALF_EVEN)
3974
- zf = yf.square.round_to_scale(30, LongMath::ROUND_HALF_EVEN)
5615
+ yf = LongMath.sqrt(xf, 31, ROUND_HALF_EVEN)
5616
+ zf = yf.square.round_to_scale(30, ROUND_HALF_EVEN)
3975
5617
  assert(zf.is_int?, "zf")
3976
5618
  assert_equal(xf, zf.to_f, "zf")
3977
5619
  assert_equal(yi, yf, "i-f")
3978
5620
 
3979
5621
  xr = Rational(224, 227)
3980
- yr = LongMath.sqrt(xr, 31, LongMath::ROUND_HALF_EVEN)
3981
- zr = yr.square.round_to_scale(30, LongMath::ROUND_HALF_EVEN)
5622
+ yr = LongMath.sqrt(xr, 31, ROUND_HALF_EVEN)
5623
+ zr = yr.square.round_to_scale(30, ROUND_HALF_EVEN)
3982
5624
  assert((zr-xr).abs <= zr.unit, "zr-xr")
3983
5625
  end
3984
5626
 
@@ -3988,79 +5630,79 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
3988
5630
  def test_cbrt
3989
5631
  print "\ntest_cbrt [#{Time.now}]: "
3990
5632
  x = LongDecimal.zero!(101)
3991
- y = check_cbrt(x, 120, LongDecimal::ROUND_UNNECESSARY, 0, 0, "zero")
5633
+ y = check_cbrt(x, 120, ROUND_UNNECESSARY, 0, 0, "zero")
3992
5634
  assert(y.zero?, "cbrt(0)")
3993
5635
 
3994
5636
  x = LongDecimal.one!(101)
3995
- y = check_cbrt(x, 120, LongDecimal::ROUND_UNNECESSARY, 0, 0, "one")
5637
+ y = check_cbrt(x, 120, ROUND_UNNECESSARY, 0, 0, "one")
3996
5638
  assert(y.one?, "cbrt(1)")
3997
5639
 
3998
5640
  x = LongDecimal.two!(101)
3999
- y0 = check_cbrt(x, 120, LongDecimal::ROUND_DOWN, 0, 1, "two")
5641
+ y0 = check_cbrt(x, 120, ROUND_DOWN, 0, 1, "two")
4000
5642
  assert(y0.cube < x, "y0**3")
4001
5643
  assert(y0.succ.cube > x, "(y0.succ).cube")
4002
- y1 = check_cbrt(x, 120, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
4003
- y2 = check_cbrt(x, 120, LongDecimal::ROUND_UP, -1, 0, "two")
5644
+ y1 = check_cbrt(x, 120, ROUND_HALF_EVEN, -1, 1, "two")
5645
+ y2 = check_cbrt(x, 120, ROUND_UP, -1, 0, "two")
4004
5646
  assert(y2.pred.cube < x, "y2.pred.cube")
4005
5647
  assert(y2.cube > x, "y2**3")
4006
5648
  assert(y0 <= y1, "y0 y1")
4007
5649
  assert(y1 <= y2, "y1 y2")
4008
5650
 
4009
- y0 = check_cbrt(x, 140, LongDecimal::ROUND_DOWN, 0, 1, "two")
5651
+ y0 = check_cbrt(x, 140, ROUND_DOWN, 0, 1, "two")
4010
5652
  assert(y0.cube < x, "y0**3")
4011
5653
  assert(y0.succ.cube > x, "(y0.succ).cube")
4012
- y1 = check_cbrt(x, 140, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
4013
- y2 = check_cbrt(x, 140, LongDecimal::ROUND_UP, -1, 0, "two")
5654
+ y1 = check_cbrt(x, 140, ROUND_HALF_EVEN, -1, 1, "two")
5655
+ y2 = check_cbrt(x, 140, ROUND_UP, -1, 0, "two")
4014
5656
  assert(y2.pred.cube < x, "y2.pred.cube")
4015
5657
  assert(y2.cube > x, "y2**3")
4016
5658
  assert(y0 <= y1, "y0 y1")
4017
5659
  assert(y1 <= y2, "y1 y2")
4018
5660
 
4019
- y0 = check_cbrt(x, 160, LongDecimal::ROUND_DOWN, 0, 1, "two")
5661
+ y0 = check_cbrt(x, 160, ROUND_DOWN, 0, 1, "two")
4020
5662
  assert(y0.cube < x, "y0**3")
4021
5663
  assert(y0.succ.cube > x, "(y0.succ).cube")
4022
- y1 = check_cbrt(x, 160, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
4023
- y2 = check_cbrt(x, 160, LongDecimal::ROUND_UP, -1, 0, "two")
5664
+ y1 = check_cbrt(x, 160, ROUND_HALF_EVEN, -1, 1, "two")
5665
+ y2 = check_cbrt(x, 160, ROUND_UP, -1, 0, "two")
4024
5666
  assert(y2.pred.cube < x, "y2.pred.cube")
4025
5667
  assert(y2.cube > x, "y2**3")
4026
5668
  assert(y0 <= y1, "y0 y1")
4027
5669
  assert(y1 <= y2, "y1 y2")
4028
5670
 
4029
- y0 = check_cbrt(x, 120, LongDecimal::ROUND_DOWN, 0, 1, "two")
5671
+ y0 = check_cbrt(x, 120, ROUND_DOWN, 0, 1, "two")
4030
5672
  assert(y0.cube < x, "y0**3")
4031
5673
  assert(y0.succ.cube > x, "(y0.succ).cube")
4032
- y1 = check_cbrt(x, 120, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
4033
- y2 = check_cbrt(x, 120, LongDecimal::ROUND_UP, -1, 0, "two")
5674
+ y1 = check_cbrt(x, 120, ROUND_HALF_EVEN, -1, 1, "two")
5675
+ y2 = check_cbrt(x, 120, ROUND_UP, -1, 0, "two")
4034
5676
  assert(y2.pred.cube < x, "y2.pred.cube")
4035
5677
  assert(y2.cube > x, "y2**3")
4036
5678
  assert(y0 <= y1, "y0 y1")
4037
5679
  assert(y1 <= y2, "y1 y2")
4038
5680
 
4039
- y0 = check_cbrt(x, 100, LongDecimal::ROUND_DOWN, 0, 1, "two")
5681
+ y0 = check_cbrt(x, 100, ROUND_DOWN, 0, 1, "two")
4040
5682
  assert(y0.cube < x, "y0**3")
4041
5683
  assert(y0.succ.cube > x, "(y0.succ).cube")
4042
- y1 = check_cbrt(x, 100, LongDecimal::ROUND_HALF_EVEN, -1, 1, "two")
4043
- y2 = check_cbrt(x, 100, LongDecimal::ROUND_UP, -1, 0, "two")
5684
+ y1 = check_cbrt(x, 100, ROUND_HALF_EVEN, -1, 1, "two")
5685
+ y2 = check_cbrt(x, 100, ROUND_UP, -1, 0, "two")
4044
5686
  assert(y2.pred.cube < x, "y2.pred.cube")
4045
5687
  assert(y2.cube > x, "y2**3")
4046
5688
  assert(y0 <= y1, "y0 y1")
4047
5689
  assert(y1 <= y2, "y1 y2")
4048
5690
 
4049
5691
  x = 3.to_ld
4050
- y0 = check_cbrt(x, 120, LongDecimal::ROUND_DOWN, 0, 1, "three")
5692
+ y0 = check_cbrt(x, 120, ROUND_DOWN, 0, 1, "three")
4051
5693
  assert(y0.cube < x, "y0**3")
4052
5694
  assert(y0.succ.cube > x, "(y0.succ).cube")
4053
- y1 = check_cbrt(x, 120, LongDecimal::ROUND_HALF_EVEN, -1, 1, "three")
4054
- y2 = check_cbrt(x, 120, LongDecimal::ROUND_UP, -1, 0, "three")
5695
+ y1 = check_cbrt(x, 120, ROUND_HALF_EVEN, -1, 1, "three")
5696
+ y2 = check_cbrt(x, 120, ROUND_UP, -1, 0, "three")
4055
5697
  assert(y2.pred.cube < x, "y2.pred.cube")
4056
5698
  assert(y2.cube > x, "y2**3")
4057
5699
  assert(y0 <= y1, "y0 y1")
4058
5700
  assert(y1 <= y2, "y1 y2")
4059
5701
 
4060
5702
  x = 8.to_ld(101)
4061
- y0 = check_cbrt(x, 120, LongDecimal::ROUND_DOWN, 0, 0, "eight")
4062
- y1 = check_cbrt(x, 120, LongDecimal::ROUND_HALF_EVEN, 0, 0, "eight")
4063
- y2 = check_cbrt(x, 120, LongDecimal::ROUND_UP, 0, 0, "eight")
5703
+ y0 = check_cbrt(x, 120, ROUND_DOWN, 0, 0, "eight")
5704
+ y1 = check_cbrt(x, 120, ROUND_HALF_EVEN, 0, 0, "eight")
5705
+ y2 = check_cbrt(x, 120, ROUND_UP, 0, 0, "eight")
4064
5706
  assert_equal(y0, y1, "y0 y1")
4065
5707
  assert_equal(y1, y2, "y1 y2")
4066
5708
  end
@@ -4104,21 +5746,21 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
4104
5746
  def test_non_ld_cbrt
4105
5747
  print "\ntest_non_ld_cbrt [#{Time.now}]: "
4106
5748
  xi = 77
4107
- yi = LongMath.cbrt(xi, 32, LongMath::ROUND_HALF_EVEN)
4108
- zi = yi.cube.round_to_scale(30, LongMath::ROUND_HALF_EVEN)
5749
+ yi = LongMath.cbrt(xi, 32, ROUND_HALF_EVEN)
5750
+ zi = yi.cube.round_to_scale(30, ROUND_HALF_EVEN)
4109
5751
  assert(zi.is_int?, "zi=#{zi.to_s}")
4110
5752
  assert_equal(xi, zi.to_i, "zi")
4111
5753
 
4112
5754
  xf = 77.0
4113
- yf = LongMath.cbrt(xf, 32, LongMath::ROUND_HALF_EVEN)
4114
- zf = yf.cube.round_to_scale(30, LongMath::ROUND_HALF_EVEN)
5755
+ yf = LongMath.cbrt(xf, 32, ROUND_HALF_EVEN)
5756
+ zf = yf.cube.round_to_scale(30, ROUND_HALF_EVEN)
4115
5757
  assert(zf.is_int?, "zf")
4116
5758
  assert_equal(xf, zf.to_f, "zf")
4117
5759
  assert_equal(yi, yf, "i-f")
4118
5760
 
4119
5761
  xr = Rational(224, 227)
4120
- yr = LongMath.cbrt(xr, 32, LongMath::ROUND_HALF_EVEN)
4121
- zr = yr.cube.round_to_scale(30, LongMath::ROUND_HALF_EVEN)
5762
+ yr = LongMath.cbrt(xr, 32, ROUND_HALF_EVEN)
5763
+ zr = yr.cube.round_to_scale(30, ROUND_HALF_EVEN)
4122
5764
  assert((zr-xr).abs <= zr.unit, "zr-xr")
4123
5765
  end
4124
5766
 
@@ -4461,31 +6103,31 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
4461
6103
  # 0.99555555555555...
4462
6104
  l = LongDecimalQuot(Rational(224, 225), 0)
4463
6105
  # 1.0
4464
- r = l.round_to_scale(1, LongDecimal::ROUND_UP)
6106
+ r = l.round_to_scale(1, ROUND_UP)
4465
6107
  assert_equal("1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4466
6108
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4467
6109
  assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4468
6110
  l = LongDecimalQuot(-Rational(224, 225), 0)
4469
- r = l.round_to_scale(1, LongDecimal::ROUND_UP)
6111
+ r = l.round_to_scale(1, ROUND_UP)
4470
6112
  assert_equal("-1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4471
6113
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4472
6114
  assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4473
6115
  # 0.00444444444444444
4474
6116
  l = LongDecimalQuot(Rational(1, 225), 0)
4475
- r = l.round_to_scale(1, LongDecimal::ROUND_UP)
6117
+ r = l.round_to_scale(1, ROUND_UP)
4476
6118
  assert_equal("0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4477
6119
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4478
6120
  assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4479
6121
  l = LongDecimalQuot(Rational(-1, 225), 0)
4480
- r = l.round_to_scale(1, LongDecimal::ROUND_UP)
6122
+ r = l.round_to_scale(1, ROUND_UP)
4481
6123
  assert_equal("-0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4482
6124
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4483
6125
  assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4484
6126
  l = LongDecimalQuot(Rational(1, 1), 1000)
4485
- r = l.round_to_scale(4, LongDecimal::ROUND_UP)
6127
+ r = l.round_to_scale(4, ROUND_UP)
4486
6128
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4487
6129
  l = LongDecimalQuot(Rational(1, 1), 1)
4488
- r = l.round_to_scale(4, LongDecimal::ROUND_UP)
6130
+ r = l.round_to_scale(4, ROUND_UP)
4489
6131
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4490
6132
  end
4491
6133
 
@@ -4498,31 +6140,31 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
4498
6140
  # 0.99555555555555...
4499
6141
  l = LongDecimalQuot(Rational(224, 225), 0)
4500
6142
  # 0.9
4501
- r = l.round_to_scale(1, LongDecimal::ROUND_DOWN)
6143
+ r = l.round_to_scale(1, ROUND_DOWN)
4502
6144
  assert_equal("0.9", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4503
6145
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4504
6146
  assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4505
6147
  l = LongDecimalQuot(-Rational(224, 225), 0)
4506
- r = l.round_to_scale(1, LongDecimal::ROUND_DOWN)
6148
+ r = l.round_to_scale(1, ROUND_DOWN)
4507
6149
  assert_equal("-0.9", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4508
6150
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4509
6151
  assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4510
6152
  # 0.00444444444444444
4511
6153
  l = LongDecimalQuot(Rational(1, 225), 0)
4512
- r = l.round_to_scale(1, LongDecimal::ROUND_DOWN)
6154
+ r = l.round_to_scale(1, ROUND_DOWN)
4513
6155
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4514
6156
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4515
6157
  assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4516
6158
  l = LongDecimalQuot(Rational(-1, 225), 0)
4517
- r = l.round_to_scale(1, LongDecimal::ROUND_DOWN)
6159
+ r = l.round_to_scale(1, ROUND_DOWN)
4518
6160
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4519
6161
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4520
6162
  assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4521
6163
  l = LongDecimalQuot(Rational(1, 1), 1000)
4522
- r = l.round_to_scale(4, LongDecimal::ROUND_DOWN)
6164
+ r = l.round_to_scale(4, ROUND_DOWN)
4523
6165
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4524
6166
  l = LongDecimalQuot(Rational(1, 1), 1)
4525
- r = l.round_to_scale(4, LongDecimal::ROUND_DOWN)
6167
+ r = l.round_to_scale(4, ROUND_DOWN)
4526
6168
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4527
6169
  end
4528
6170
 
@@ -4534,31 +6176,31 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
4534
6176
 
4535
6177
  # 0.99555555555555...
4536
6178
  l = LongDecimalQuot(Rational(224, 225), 0)
4537
- r = l.round_to_scale(1, LongDecimal::ROUND_CEILING)
6179
+ r = l.round_to_scale(1, ROUND_CEILING)
4538
6180
  assert_equal("1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4539
6181
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4540
6182
  assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4541
6183
  l = LongDecimalQuot(-Rational(224, 225), 0)
4542
- r = l.round_to_scale(1, LongDecimal::ROUND_CEILING)
6184
+ r = l.round_to_scale(1, ROUND_CEILING)
4543
6185
  assert_equal("-0.9", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4544
6186
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4545
6187
  assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4546
6188
  # 0.00444444444444444
4547
6189
  l = LongDecimalQuot(Rational(1, 225), 0)
4548
- r = l.round_to_scale(1, LongDecimal::ROUND_CEILING)
6190
+ r = l.round_to_scale(1, ROUND_CEILING)
4549
6191
  assert_equal("0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4550
6192
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4551
6193
  assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4552
6194
  l = LongDecimalQuot(Rational(-1, 225), 0)
4553
- r = l.round_to_scale(1, LongDecimal::ROUND_CEILING)
6195
+ r = l.round_to_scale(1, ROUND_CEILING)
4554
6196
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4555
6197
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4556
6198
  assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4557
6199
  l = LongDecimalQuot(Rational(1, 1), 1000)
4558
- r = l.round_to_scale(4, LongDecimal::ROUND_CEILING)
6200
+ r = l.round_to_scale(4, ROUND_CEILING)
4559
6201
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4560
6202
  l = LongDecimalQuot(Rational(1, 1), 1)
4561
- r = l.round_to_scale(4, LongDecimal::ROUND_CEILING)
6203
+ r = l.round_to_scale(4, ROUND_CEILING)
4562
6204
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4563
6205
  end
4564
6206
 
@@ -4570,31 +6212,31 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
4570
6212
 
4571
6213
  # 0.99555555555555...
4572
6214
  l = LongDecimalQuot(Rational(224, 225), 0)
4573
- r = l.round_to_scale(1, LongDecimal::ROUND_FLOOR)
6215
+ r = l.round_to_scale(1, ROUND_FLOOR)
4574
6216
  assert_equal("0.9", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4575
6217
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4576
6218
  assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4577
6219
  l = LongDecimalQuot(-Rational(224, 225), 0)
4578
- r = l.round_to_scale(1, LongDecimal::ROUND_FLOOR)
6220
+ r = l.round_to_scale(1, ROUND_FLOOR)
4579
6221
  assert_equal("-1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4580
6222
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4581
6223
  assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4582
6224
  # 0.00444444444444444
4583
6225
  l = LongDecimalQuot(Rational(1, 225), 0)
4584
- r = l.round_to_scale(1, LongDecimal::ROUND_FLOOR)
6226
+ r = l.round_to_scale(1, ROUND_FLOOR)
4585
6227
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4586
6228
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4587
6229
  assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4588
6230
  l = LongDecimalQuot(Rational(-1, 225), 0)
4589
- r = l.round_to_scale(1, LongDecimal::ROUND_FLOOR)
6231
+ r = l.round_to_scale(1, ROUND_FLOOR)
4590
6232
  assert_equal("-0.1", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4591
6233
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4592
6234
  assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4593
6235
  l = LongDecimalQuot(Rational(1, 1), 1000)
4594
- r = l.round_to_scale(4, LongDecimal::ROUND_FLOOR)
6236
+ r = l.round_to_scale(4, ROUND_FLOOR)
4595
6237
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4596
6238
  l = LongDecimalQuot(Rational(1, 1), 1)
4597
- r = l.round_to_scale(4, LongDecimal::ROUND_FLOOR)
6239
+ r = l.round_to_scale(4, ROUND_FLOOR)
4598
6240
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4599
6241
  end
4600
6242
 
@@ -4606,40 +6248,40 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
4606
6248
 
4607
6249
  # 0.99555555555555...
4608
6250
  l = LongDecimalQuot(Rational(224, 225), 0)
4609
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
6251
+ r = l.round_to_scale(1, ROUND_HALF_UP)
4610
6252
  assert_equal("1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4611
6253
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4612
6254
  assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4613
6255
  l = LongDecimalQuot(-Rational(224, 225), 0)
4614
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
6256
+ r = l.round_to_scale(1, ROUND_HALF_UP)
4615
6257
  assert_equal("-1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4616
6258
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4617
6259
  assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4618
6260
  # 0.00444444444444444
4619
6261
  l = LongDecimalQuot(Rational(1, 225), 0)
4620
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
6262
+ r = l.round_to_scale(1, ROUND_HALF_UP)
4621
6263
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4622
6264
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4623
6265
  assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4624
6266
  l = LongDecimalQuot(Rational(-1, 225), 0)
4625
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
6267
+ r = l.round_to_scale(1, ROUND_HALF_UP)
4626
6268
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4627
6269
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4628
6270
  assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4629
6271
  l = LongDecimalQuot(Rational(1, 1), 1000)
4630
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_UP)
6272
+ r = l.round_to_scale(4, ROUND_HALF_UP)
4631
6273
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4632
6274
  l = LongDecimalQuot(Rational(1, 1), 1)
4633
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_UP)
6275
+ r = l.round_to_scale(4, ROUND_HALF_UP)
4634
6276
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4635
6277
  # 56.25
4636
6278
  l = LongDecimalQuot(Rational(225, 4), 0)
4637
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
6279
+ r = l.round_to_scale(1, ROUND_HALF_UP)
4638
6280
  assert_equal("56.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4639
6281
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4640
6282
  assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4641
6283
  l = LongDecimalQuot(Rational(-225, 4), 0)
4642
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
6284
+ r = l.round_to_scale(1, ROUND_HALF_UP)
4643
6285
  assert_equal("-56.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4644
6286
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4645
6287
  assert_equal("-225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
@@ -4653,40 +6295,40 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
4653
6295
 
4654
6296
  # 0.99555555555555...
4655
6297
  l = LongDecimalQuot(Rational(224, 225), 0)
4656
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
6298
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
4657
6299
  assert_equal("1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4658
6300
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4659
6301
  assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4660
6302
  l = LongDecimalQuot(-Rational(224, 225), 0)
4661
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
6303
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
4662
6304
  assert_equal("-1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4663
6305
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4664
6306
  assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4665
6307
  # 0.00444444444444444
4666
6308
  l = LongDecimalQuot(Rational(1, 225), 0)
4667
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
6309
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
4668
6310
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4669
6311
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4670
6312
  assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4671
6313
  l = LongDecimalQuot(Rational(-1, 225), 0)
4672
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
6314
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
4673
6315
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4674
6316
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4675
6317
  assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4676
6318
  l = LongDecimalQuot(Rational(1, 1), 1000)
4677
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_DOWN)
6319
+ r = l.round_to_scale(4, ROUND_HALF_DOWN)
4678
6320
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4679
6321
  l = LongDecimalQuot(Rational(1, 1), 1)
4680
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_DOWN)
6322
+ r = l.round_to_scale(4, ROUND_HALF_DOWN)
4681
6323
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4682
6324
  # 56.25
4683
6325
  l = LongDecimalQuot(Rational(225, 4), 0)
4684
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
6326
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
4685
6327
  assert_equal("56.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4686
6328
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4687
6329
  assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4688
6330
  l = LongDecimalQuot(Rational(-225, 4), 0)
4689
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
6331
+ r = l.round_to_scale(1, ROUND_HALF_DOWN)
4690
6332
  assert_equal("-56.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4691
6333
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4692
6334
  assert_equal("-225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
@@ -4700,40 +6342,40 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
4700
6342
 
4701
6343
  # 0.99555555555555...
4702
6344
  l = LongDecimalQuot(Rational(224, 225), 0)
4703
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
6345
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
4704
6346
  assert_equal("1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4705
6347
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4706
6348
  assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4707
6349
  l = LongDecimalQuot(-Rational(224, 225), 0)
4708
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
6350
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
4709
6351
  assert_equal("-1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4710
6352
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4711
6353
  assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4712
6354
  # 0.00444444444444444
4713
6355
  l = LongDecimalQuot(Rational(1, 225), 0)
4714
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
6356
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
4715
6357
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4716
6358
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4717
6359
  assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4718
6360
  l = LongDecimalQuot(Rational(-1, 225), 0)
4719
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
6361
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
4720
6362
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4721
6363
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4722
6364
  assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4723
6365
  l = LongDecimalQuot(Rational(1, 1), 1000)
4724
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_CEILING)
6366
+ r = l.round_to_scale(4, ROUND_HALF_CEILING)
4725
6367
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4726
6368
  l = LongDecimalQuot(Rational(1, 1), 1)
4727
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_CEILING)
6369
+ r = l.round_to_scale(4, ROUND_HALF_CEILING)
4728
6370
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4729
6371
  # 56.25
4730
6372
  l = LongDecimalQuot(Rational(225, 4), 0)
4731
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
6373
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
4732
6374
  assert_equal("56.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4733
6375
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4734
6376
  assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4735
6377
  l = LongDecimalQuot(Rational(-225, 4), 0)
4736
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
6378
+ r = l.round_to_scale(1, ROUND_HALF_CEILING)
4737
6379
  assert_equal("-56.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4738
6380
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4739
6381
  assert_equal("-225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
@@ -4747,40 +6389,40 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
4747
6389
 
4748
6390
  # 0.99555555555555...
4749
6391
  l = LongDecimalQuot(Rational(224, 225), 0)
4750
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
6392
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
4751
6393
  assert_equal("1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4752
6394
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4753
6395
  assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4754
6396
  l = LongDecimalQuot(-Rational(224, 225), 0)
4755
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
6397
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
4756
6398
  assert_equal("-1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4757
6399
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4758
6400
  assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4759
6401
  # 0.00444444444444444
4760
6402
  l = LongDecimalQuot(Rational(1, 225), 0)
4761
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
6403
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
4762
6404
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4763
6405
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4764
6406
  assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4765
6407
  l = LongDecimalQuot(Rational(-1, 225), 0)
4766
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
6408
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
4767
6409
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4768
6410
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4769
6411
  assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4770
6412
  l = LongDecimalQuot(Rational(1, 1), 1000)
4771
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_FLOOR)
6413
+ r = l.round_to_scale(4, ROUND_HALF_FLOOR)
4772
6414
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4773
6415
  l = LongDecimalQuot(Rational(1, 1), 1)
4774
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_FLOOR)
6416
+ r = l.round_to_scale(4, ROUND_HALF_FLOOR)
4775
6417
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4776
6418
  # 56.25
4777
6419
  l = LongDecimalQuot(Rational(225, 4), 0)
4778
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
6420
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
4779
6421
  assert_equal("56.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4780
6422
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4781
6423
  assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4782
6424
  l = LongDecimalQuot(Rational(-225, 4), 0)
4783
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
6425
+ r = l.round_to_scale(1, ROUND_HALF_FLOOR)
4784
6426
  assert_equal("-56.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4785
6427
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4786
6428
  assert_equal("-225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
@@ -4794,56 +6436,112 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
4794
6436
 
4795
6437
  # 0.99555555555555...
4796
6438
  l = LongDecimalQuot(Rational(224, 225), 0)
4797
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
6439
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
4798
6440
  assert_equal("1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4799
6441
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4800
6442
  assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4801
6443
  l = LongDecimalQuot(-Rational(224, 225), 0)
4802
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
6444
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
4803
6445
  assert_equal("-1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4804
6446
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4805
6447
  assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4806
6448
  # 0.00444444444444444
4807
6449
  l = LongDecimalQuot(Rational(1, 225), 0)
4808
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
6450
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
4809
6451
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4810
6452
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4811
6453
  assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4812
6454
  l = LongDecimalQuot(Rational(-1, 225), 0)
4813
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
6455
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
4814
6456
  assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4815
6457
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4816
6458
  assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4817
6459
  l = LongDecimalQuot(Rational(1, 1), 1000)
4818
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_EVEN)
6460
+ r = l.round_to_scale(4, ROUND_HALF_EVEN)
4819
6461
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4820
6462
  l = LongDecimalQuot(Rational(1, 1), 1)
4821
- r = l.round_to_scale(4, LongDecimal::ROUND_HALF_EVEN)
6463
+ r = l.round_to_scale(4, ROUND_HALF_EVEN)
4822
6464
  assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4823
6465
  # 56.25
4824
6466
  l = LongDecimalQuot(Rational(225, 4), 0)
4825
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
6467
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
4826
6468
  assert_equal("56.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4827
6469
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4828
6470
  assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4829
6471
  # 56.75
4830
6472
  l = LongDecimalQuot(Rational(227, 4), 0)
4831
- r = l.round_to_scale(1, LongDecimal::ROUND_HALF_EVEN)
6473
+ r = l.round_to_scale(1, ROUND_HALF_EVEN)
4832
6474
  assert_equal("56.8", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4833
6475
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
4834
6476
  assert_equal("227/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
4835
6477
  end
4836
6478
 
6479
+ #
6480
+ # test rounding of LongDecimalQuot with ROUND_HALF_ODD
6481
+ #
6482
+ def test_ldq_round_to_scale_half_odd
6483
+ print "\ntest_ldq_round_to_scale_half_odd [#{Time.now}]: "
6484
+
6485
+ # 0.99555555555555...
6486
+ l = LongDecimalQuot(Rational(224, 225), 0)
6487
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
6488
+ assert_equal("1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
6489
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
6490
+ assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
6491
+ l = LongDecimalQuot(-Rational(224, 225), 0)
6492
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
6493
+ assert_equal("-1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
6494
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
6495
+ assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
6496
+ # 0.00444444444444444
6497
+ l = LongDecimalQuot(Rational(1, 225), 0)
6498
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
6499
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
6500
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
6501
+ assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
6502
+ l = LongDecimalQuot(Rational(-1, 225), 0)
6503
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
6504
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
6505
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
6506
+ assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
6507
+ l = LongDecimalQuot(Rational(1, 1), 1000)
6508
+ r = l.round_to_scale(4, ROUND_HALF_ODD)
6509
+ assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
6510
+ l = LongDecimalQuot(Rational(1, 1), 1)
6511
+ r = l.round_to_scale(4, ROUND_HALF_ODD)
6512
+ assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
6513
+ # 56.25
6514
+ l = LongDecimalQuot(Rational(225, 4), 0)
6515
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
6516
+ assert_equal("56.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
6517
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
6518
+ assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
6519
+ # 56.75
6520
+ l = LongDecimalQuot(Rational(227, 4), 0)
6521
+ r = l.round_to_scale(1, ROUND_HALF_ODD)
6522
+ assert_equal("56.7", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
6523
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
6524
+ assert_equal("227/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
6525
+ end
6526
+
6527
+ # TODO: do tests with rational numbers that approach square and cube roots with continuos fractions
6528
+ # TODO: do tests for harmonic that are exact matches
6529
+ # def test_ldq_round_to_scale_geometric_common
6530
+ # def test_ldq_round_to_scale_harmonic_common
6531
+ # def test_ldq_round_to_scale_harmonic_*
6532
+ # def test_ldq_round_to_scale_quadratic_common
6533
+ # def test_ldq_round_to_scale_cubic_common
6534
+
4837
6535
  #
4838
6536
  # test rounding of LongDecimalQuot with ROUND_UNNECESSARY
4839
6537
  #
4840
6538
  def test_ldq_round_to_scale_unnecessary
4841
6539
  print "\ntest_ldq_round_to_scale_unnecessary [#{Time.now}]: "
4842
6540
  l = LongDecimalQuot(Rational(225, 4), 5)
4843
- r = l.round_to_scale(2, LongDecimal::ROUND_UNNECESSARY)
6541
+ r = l.round_to_scale(2, ROUND_UNNECESSARY)
4844
6542
  assert_equal("56.25", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
4845
6543
  begin
4846
- r = l.round_to_scale(1, LongDecimal::ROUND_UNNECESSARY)
6544
+ r = l.round_to_scale(1, ROUND_UNNECESSARY)
4847
6545
  assert_fail("should not have succeeded l=#{l.inspect} r=#{r.inspect}")
4848
6546
  rescue ArgumentError
4849
6547
  # ignored
@@ -4979,7 +6677,7 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
4979
6677
  y = x.to_ld
4980
6678
  assert_kind_of(LongDecimal, y, "must be ld")
4981
6679
  assert_equal(10, y.scale, "scale is 10")
4982
- assert_equal(LongDecimal("1.5555555556"), y, "1.55...")
6680
+ assert_equal(LongDecimal("1.5555555556"), y, "1.55... y=#{y} x=#{x}")
4983
6681
  x = LongDecimalQuot(Rational(7, 20), 1)
4984
6682
  y = x.to_ld
4985
6683
  assert_kind_of(LongDecimal, y, "must be ld")
@@ -5588,21 +7286,173 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
5588
7286
  assert(! (y.eql? x), "! #{y.inspect} eql? #{x.inspect}")
5589
7287
  end
5590
7288
 
7289
+ def test_means_one_param
7290
+ print "\ntest_means_one_param [#{Time.now}]: "
7291
+ [ -1, 0, 1, 7, -1.0, 0.0, 1.0, Math::PI, Rational(-1, 1), Rational(0, 1), Rational(1,1), Rational(2,3), LongDecimal(-10000000000, 10), LongDecimal(-1, 10), LongDecimal(0, 10), LongDecimal(10000000000, 10), LongMath.pi(100) ].each do |x|
7292
+ # , Complex(-1, -2), Complex(0,0), Complex(Rational(3, 2), LongDecimal(4, 3))
7293
+ 12.times do |prec|
7294
+ ALL_ROUNDING_MODES.each do |rm|
7295
+ if (rm == ROUND_UNNECESSARY)
7296
+ next
7297
+ end
7298
+ xx = x.to_ld(prec, rm)
7299
+ text = "x=#{x} xx=#{xx} rm=#{rm} prec=#{prec}"
7300
+ assert_equal(xx, LongMath.arithmetic_mean(prec, rm, x), text)
7301
+ assert_equal(xx, LongMath.geometric_mean(prec, rm, x), text)
7302
+ if (x.sgn != 0)
7303
+ assert_equal(xx, LongMath.harmonic_mean(prec, rm, x), text)
7304
+ end
7305
+ assert_equal(xx, LongMath.quadratic_mean(prec, rm, x), text)
7306
+ assert_equal(xx, LongMath.cubic_mean(prec, rm, x), text)
7307
+ end
7308
+ end
7309
+ end
7310
+ end
7311
+
7312
+ def test_means_two_param
7313
+ print "\ntest_means_two_param [#{Time.now}] (20 sec): "
7314
+ arr = [ 0, 1, 2, 7, 0.0, 1.0, 2.0, Math::PI, Rational(40, 9), Rational(0, 1), Rational(1,1), Rational(2,3), LongDecimal(3333333333333333, 10), LongDecimal(33, 10), LongDecimal(0, 10), LongDecimal(10000000000, 10), LongMath.pi(100) ]
7315
+ arr.each do |x|
7316
+ arr.each do |y|
7317
+ print "."
7318
+ 12.times do |prec|
7319
+ ALL_ROUNDING_MODES.each do |rm|
7320
+ if (rm == ROUND_UNNECESSARY)
7321
+ next
7322
+ end
7323
+ xx = x.to_ld(prec, rm)
7324
+ yy = y.to_ld(prec, rm)
7325
+ mi = [xx, yy].min
7326
+ am = LongMath.arithmetic_mean(prec, rm, x, y)
7327
+ gm = LongMath.geometric_mean(prec, rm, x, y)
7328
+ if (x.sgn == 0 || y.sgn == 0)
7329
+ hm = gm
7330
+ else
7331
+ hm = LongMath.harmonic_mean(prec, rm, x, y)
7332
+ end
7333
+ qm = LongMath.quadratic_mean(prec, rm, x, y)
7334
+ cm = LongMath.cubic_mean(prec, rm, x, y)
7335
+ ma = [xx, yy].max
7336
+ text = "mi=#{mi} hm=#{hm} gm=#{gm} am=#{am} qm=#{qm} cm=#{cm} ma=#{ma} prec=#{prec} rm=#{rm} x=#{x} y=#{y}"
7337
+ assert(mi <= hm.succ, text)
7338
+ assert(hm <= gm.succ, text)
7339
+ assert(gm <= am.succ, text)
7340
+ assert(am <= qm.succ, text)
7341
+ assert(qm <= cm.succ, text)
7342
+ assert(cm <= ma.succ, text)
7343
+ if (x == y)
7344
+ assert_equal(mi, hm, text)
7345
+ assert_equal(hm, gm, text)
7346
+ assert_equal(gm, am, text)
7347
+ assert_equal(am, qm, text)
7348
+ assert_equal(qm, cm, text)
7349
+ assert_equal(cm, ma, text)
7350
+ end
7351
+ end
7352
+ end
7353
+ end
7354
+ end
7355
+ end
7356
+
7357
+ def test_means_three_param
7358
+ print "\ntest_means_three_param [#{Time.now}] (4 min): "
7359
+ arr = [ 0, 1, 2, 0.0, 1.0, Math::PI, Rational(40, 9), Rational(0, 1), Rational(1,1), LongDecimal(3333333333333333, 10), LongDecimal(0, 10), LongDecimal(10000000000, 10), LongMath.pi(100) ]
7360
+ arr.each do |x|
7361
+ arr.each do |y|
7362
+ print ":"
7363
+ arr.each do |z|
7364
+ print "."
7365
+ 12.times do |prec|
7366
+ ALL_ROUNDING_MODES.each do |rm|
7367
+ if (rm == ROUND_UNNECESSARY)
7368
+ next
7369
+ end
7370
+ xx = x.to_ld(prec, rm)
7371
+ yy = y.to_ld(prec, rm)
7372
+ zz = z.to_ld(prec, rm)
7373
+ mi = [xx, yy, zz].min
7374
+ am = LongMath.arithmetic_mean(prec, rm, x, y, z)
7375
+ agm = LongMath.arithmetic_geometric_mean(prec, rm, x, y, z)
7376
+ gm = LongMath.geometric_mean(prec, rm, x, y, z)
7377
+ if (x.sgn == 0 || y.sgn == 0 || z.sgn == 0)
7378
+ hm = gm
7379
+ hgm = gm
7380
+ else
7381
+ hm = LongMath.harmonic_mean(prec, rm, x, y, z)
7382
+ hgm = LongMath.harmonic_geometric_mean(prec, rm, x, y, z)
7383
+ end
7384
+ qm = LongMath.quadratic_mean(prec, rm, x, y, z)
7385
+ cm = LongMath.cubic_mean(prec, rm, x, y, z)
7386
+ ma = [xx, yy, zz].max
7387
+ text = "mi=#{mi} hm=#{hm} gm=#{gm} am=#{am} qm=#{qm} cm=#{cm} ma=#{ma} prec=#{prec} rm=#{rm} x=#{x} y=#{y} z=#{z}"
7388
+ assert(mi <= hm.succ, text)
7389
+ assert(hm <= hgm.succ, text)
7390
+ assert(hgm <= gm.succ, text)
7391
+ assert(gm <= agm.succ, text)
7392
+ assert(agm <= am.succ, text)
7393
+ assert(am <= qm.succ, text)
7394
+ assert(qm <= cm.succ, text)
7395
+ assert(cm <= ma.succ, text)
7396
+ if (x == y && y == z)
7397
+ assert_equal(mi, hm, text)
7398
+ assert_equal(hm, hgm, text)
7399
+ assert_equal(hgm, gm, text)
7400
+ assert_equal(gm, agm, text)
7401
+ assert_equal(gm, agm, text)
7402
+ assert_equal(am, qm, text)
7403
+ assert_equal(qm, cm, text)
7404
+ assert_equal(cm, ma, text)
7405
+ end
7406
+ end
7407
+ end
7408
+ end
7409
+ end
7410
+ end
7411
+ end
7412
+
7413
+ def test_arithmetic_means_two_param_known_result
7414
+ assert_equal(1, LongMath.arithmetic_mean(0, ROUND_UNNECESSARY, 0, 2))
7415
+ assert_equal(0, LongMath.arithmetic_mean(0, ROUND_UNNECESSARY, -1, 1))
7416
+ assert_equal(3, LongMath.arithmetic_mean(0, ROUND_UNNECESSARY, 1, 5))
7417
+ end
7418
+
7419
+ def test_geometric_means_two_param_known_result
7420
+ assert_equal(2, LongMath.geometric_mean(0, ROUND_UNNECESSARY, 1, 4))
7421
+ assert_equal(10, LongMath.geometric_mean(0, ROUND_UNNECESSARY, 4, 25))
7422
+ assert_equal(-3, LongMath.geometric_mean(0, ROUND_UNNECESSARY, -1, -9))
7423
+ end
7424
+
7425
+ def test_harmonic_means_two_param_known_result
7426
+ assert_equal(3, LongMath.harmonic_mean(0, ROUND_UNNECESSARY, 2, 6))
7427
+ assert_equal(4, LongMath.harmonic_mean(0, ROUND_UNNECESSARY, 3, 6))
7428
+ assert_equal(-3, LongMath.harmonic_mean(0, ROUND_UNNECESSARY, -2, -6))
7429
+ end
7430
+
7431
+ def test_quadratic_means_two_param_known_result
7432
+ assert_equal(5, LongMath.quadratic_mean(0, ROUND_UNNECESSARY, 1, 7))
7433
+ assert_equal(10, LongMath.quadratic_mean(0, ROUND_UNNECESSARY, 2, 14))
7434
+ assert_equal(15, LongMath.quadratic_mean(0, ROUND_UNNECESSARY, 3, 21))
7435
+ assert_equal(13, LongMath.quadratic_mean(0, ROUND_UNNECESSARY, 7, 17))
7436
+ assert_equal(-5, LongMath.quadratic_mean(0, ROUND_UNNECESSARY, -1, -7))
7437
+ end
7438
+
7439
+
5591
7440
  #
5592
7441
  # test mul minverse of RoundingMode
5593
7442
  #
5594
7443
  def test_rm_minverse
5595
7444
  print "\ntest_rm_minverse [#{Time.now}]: "
5596
- assert_equal(LongMath::ROUND_UP, LongMath::ROUND_DOWN.minverse)
5597
- assert_equal(LongMath::ROUND_DOWN, LongMath::ROUND_UP.minverse)
5598
- assert_equal(LongMath::ROUND_CEILING, LongMath::ROUND_FLOOR.minverse)
5599
- assert_equal(LongMath::ROUND_FLOOR, LongMath::ROUND_CEILING.minverse)
5600
- assert_equal(LongMath::ROUND_HALF_UP, LongMath::ROUND_HALF_DOWN.minverse)
5601
- assert_equal(LongMath::ROUND_HALF_DOWN, LongMath::ROUND_HALF_UP.minverse)
5602
- assert_equal(LongMath::ROUND_HALF_CEILING, LongMath::ROUND_HALF_FLOOR.minverse)
5603
- assert_equal(LongMath::ROUND_HALF_FLOOR, LongMath::ROUND_HALF_CEILING.minverse)
5604
- assert_equal(LongMath::ROUND_HALF_EVEN, LongMath::ROUND_HALF_EVEN.minverse)
5605
- assert_equal(LongMath::ROUND_UNNECESSARY, LongMath::ROUND_UNNECESSARY.minverse)
7445
+ assert_equal(ROUND_UP, ROUND_DOWN.minverse)
7446
+ assert_equal(ROUND_DOWN, ROUND_UP.minverse)
7447
+ assert_equal(ROUND_CEILING, ROUND_FLOOR.minverse)
7448
+ assert_equal(ROUND_FLOOR, ROUND_CEILING.minverse)
7449
+ assert_equal(ROUND_HALF_UP, ROUND_HALF_DOWN.minverse)
7450
+ assert_equal(ROUND_HALF_DOWN, ROUND_HALF_UP.minverse)
7451
+ assert_equal(ROUND_HALF_CEILING, ROUND_HALF_FLOOR.minverse)
7452
+ assert_equal(ROUND_HALF_FLOOR, ROUND_HALF_CEILING.minverse)
7453
+ assert_equal(ROUND_HALF_EVEN, ROUND_HALF_EVEN.minverse)
7454
+ assert_equal(ROUND_HALF_ODD, ROUND_HALF_ODD.minverse)
7455
+ assert_equal(ROUND_UNNECESSARY, ROUND_UNNECESSARY.minverse)
5606
7456
  end
5607
7457
 
5608
7458
  #
@@ -5610,16 +7460,17 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
5610
7460
  #
5611
7461
  def test_rm_ainverse
5612
7462
  print "\ntest_rm_ainverse [#{Time.now}]: "
5613
- assert_equal(LongMath::ROUND_UP, LongMath::ROUND_UP.ainverse)
5614
- assert_equal(LongMath::ROUND_DOWN, LongMath::ROUND_DOWN.ainverse)
5615
- assert_equal(LongMath::ROUND_CEILING, LongMath::ROUND_FLOOR.ainverse)
5616
- assert_equal(LongMath::ROUND_FLOOR, LongMath::ROUND_CEILING.ainverse)
5617
- assert_equal(LongMath::ROUND_HALF_UP, LongMath::ROUND_HALF_UP.ainverse)
5618
- assert_equal(LongMath::ROUND_HALF_DOWN, LongMath::ROUND_HALF_DOWN.ainverse)
5619
- assert_equal(LongMath::ROUND_HALF_CEILING, LongMath::ROUND_HALF_FLOOR.ainverse)
5620
- assert_equal(LongMath::ROUND_HALF_FLOOR, LongMath::ROUND_HALF_CEILING.ainverse)
5621
- assert_equal(LongMath::ROUND_HALF_EVEN, LongMath::ROUND_HALF_EVEN.ainverse)
5622
- assert_equal(LongMath::ROUND_UNNECESSARY, LongMath::ROUND_UNNECESSARY.ainverse)
7463
+ assert_equal(ROUND_UP, ROUND_UP.ainverse)
7464
+ assert_equal(ROUND_DOWN, ROUND_DOWN.ainverse)
7465
+ assert_equal(ROUND_CEILING, ROUND_FLOOR.ainverse)
7466
+ assert_equal(ROUND_FLOOR, ROUND_CEILING.ainverse)
7467
+ assert_equal(ROUND_HALF_UP, ROUND_HALF_UP.ainverse)
7468
+ assert_equal(ROUND_HALF_DOWN, ROUND_HALF_DOWN.ainverse)
7469
+ assert_equal(ROUND_HALF_CEILING, ROUND_HALF_FLOOR.ainverse)
7470
+ assert_equal(ROUND_HALF_FLOOR, ROUND_HALF_CEILING.ainverse)
7471
+ assert_equal(ROUND_HALF_EVEN, ROUND_HALF_EVEN.ainverse)
7472
+ assert_equal(ROUND_HALF_ODD, ROUND_HALF_ODD.ainverse)
7473
+ assert_equal(ROUND_UNNECESSARY, ROUND_UNNECESSARY.ainverse)
5623
7474
  end
5624
7475
 
5625
7476
 
@@ -5642,7 +7493,6 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
5642
7493
  @powers_of_10[x] = zz
5643
7494
  end
5644
7495
  assert_equal(z, zz)
5645
- puts("exp=" + x.to_s)
5646
7496
  $stdout.flush
5647
7497
  else
5648
7498
  @powers_of_10[x] ||= z
@@ -5662,12 +7512,10 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
5662
7512
 
5663
7513
  12.times do |i|
5664
7514
  check_npower10(3**i)
5665
- puts(3**i)
5666
7515
  end
5667
7516
 
5668
7517
  12.times do |i|
5669
7518
  check_npower10(3**i)
5670
- puts(3**i)
5671
7519
  end
5672
7520
 
5673
7521
  y = 1
@@ -5682,7 +7530,6 @@ class TestLongDecimal_class < Test::Unit::TestCase # RUNIT::TestCase
5682
7530
  x0 = 2046
5683
7531
  y0 = 10**x0
5684
7532
  60.times do |i|
5685
- puts "i=" + i.to_s
5686
7533
  $stdout.flush
5687
7534
  y = y0
5688
7535
  x = x0