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.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/LICENSE +15 -0
- data/README +41 -41
- data/Rakefile +19 -73
- data/lib/long-decimal-extra.rb +5 -672
- data/lib/long-decimal.rb +1609 -141
- data/lib/long-decimal/version.rb +3 -0
- data/long-decimal.gemspec +22 -0
- data/test/testlongdecimal.rb +2498 -651
- data/test/testlongdeclib.rb +20 -10
- data/test/testrandlib.rb +6 -5
- data/test/testrandom.rb +30 -14
- data/test/testrandpower.rb +22 -7
- data/tex/long-decimal.pdf +0 -0
- data/tex/long-decimal.tex +420 -0
- metadata +72 -64
- data/VERSION +0 -1
- data/install.rb +0 -18
- data/make_doc.rb +0 -12
- data/test/testlongdecimal-extra.rb +0 -1750
- data/test/testlongdecimal-performance.rb +0 -357
- data/test/testrandom-extra.rb +0 -80
- data/version.rb +0 -39
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a9b2ae9e4c8f0f4af956ca3603f351f2c45ecef1
|
4
|
+
data.tar.gz: b0d237ee8813f6e5f2ac6d458b0f22a5afc3b9c4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 40718a7b4ac4011aee592fd16516fe79ea39e1aaa585113b0220463057064ef14f7f934071e45313014427121862297fde386726bad73d6525ee530353b1ddd6
|
7
|
+
data.tar.gz: 4ce22512fcba5dc1b57bd9dc389a269b52046f1d6e20ca134a5cc57aed34303ee9d5248249d84ce36d8e529549cad86b318f0d7eb6f2c3096ab0fc7ace9b58a9
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Copyright � 2006-2012 Karl Brodowsky
|
2
|
+
by Karl Brodowsky (IT Sky Consulting GmbH) 2006-2012
|
3
|
+
http://www.it-sky-consulting.com/
|
4
|
+
|
5
|
+
It is free software; you can use it, modify it and redistribute under the terms of either
|
6
|
+
Ruby's license or LGPL.
|
7
|
+
Find copies of these licenses on http://www.gnu.org/ or http://www.ruby-lang.org/
|
8
|
+
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
10
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
11
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
12
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
13
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
14
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
15
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
CHANGED
@@ -1,25 +1,49 @@
|
|
1
1
|
Version
|
2
2
|
-------
|
3
3
|
|
4
|
-
This version (
|
4
|
+
This version (1.00.02) is fixing bugs from version 1.00.01.
|
5
|
+
It also can be considered as a release candidate from the upcoming
|
6
|
+
version 1.01.00, adding new features.
|
5
7
|
|
6
8
|
Improvements over the previous version:
|
7
9
|
|
8
|
-
-
|
9
|
-
|
10
|
-
|
10
|
+
- migration from CVS (rubyforge) to GIT (github)
|
11
|
+
- bug fixed with frozen string attempted to be changed when parsing a string for a long-decimal number.
|
12
|
+
- removed some code duplication between rounding of LongDecimal, LongDecimalQuot and rounding of Integers to remainder set.
|
13
|
+
- added more rounding modes based on geometric, harmonic, quadratic and cubic mean
|
14
|
+
- fixed calculation of powers in such a way that it fails yielding a reasonably accurate result less often. Cases that are sensitive are powers with a base that is close to 1 (for example off by 1e-35) with an exponent that is huge (for example like 1e20). With "reasonable" values power of a LongDecimal by a LongDecimal works quite well.
|
15
|
+
- added functions to calculate arithmetic, harmonic, quadratic, cubic, geometric, arithmetic-geometric and harmonic-geometric means.
|
16
|
+
- added functions to round summand in such a way that their sum is the rounded value of the sum of the unrounded values (experimental)
|
17
|
+
- moved power, log10, log2 etc. from long-decimal-extra.rb to long-decimal.rb
|
18
|
+
- added more unit tests
|
19
|
+
|
20
|
+
Work to do for 1.01.00:
|
21
|
+
- go through functions that are working with rounding modes as parameter (like transcendental functions, sqrt, cbrt etc.) to ensure that they work properly with all new rounding modes
|
22
|
+
- improve algorithm for rounding with sum constraint
|
23
|
+
- go through unit tests to see they are covering all rounding modes
|
24
|
+
- add unit tests for rounding with sum constraint
|
25
|
+
- rubydoc-documentation
|
26
|
+
- external documentation
|
27
|
+
|
28
|
+
Work to do for 1.02.00 (or 2.00.00):
|
29
|
+
- add the following transcendental functions: sin, cos, tan, cot, sec, csc, sinh, cosh, tanh, coth, sech, csch, asin, acos, atan, atan2, acot, asec, acsc, asinh, acosh, atanh, acoth, asech, acsch
|
30
|
+
- documentation
|
31
|
+
- external documentation
|
32
|
+
- interoperability with flt
|
33
|
+
|
34
|
+
The existing functionality did not show any bugs during intensive
|
11
35
|
testing, so it could be assumed that the whole library is good for
|
12
|
-
for production/stable.
|
36
|
+
for production/stable. The library is used for productive software by the author.
|
13
37
|
|
14
|
-
This software development effort is hosted on
|
15
|
-
|
16
|
-
found directly with http://rubyforge.org/projects/long-decimal/
|
17
|
-
you should feel encouraged to look if there is a newer version, when
|
38
|
+
This software development effort is hosted on GitHub ( https://github.com/ )
|
39
|
+
under the project name "long-decimal", to be
|
40
|
+
found directly with http://rubyforge.org/projects/long-decimal/
|
41
|
+
So you should feel encouraged to look if there is a newer version, when
|
18
42
|
you install long-decimal.
|
19
43
|
|
20
|
-
This version is an
|
44
|
+
This version is an production stable version.
|
21
45
|
Operations +, -, *, / and sqrt should be working properly
|
22
|
-
and
|
46
|
+
and justify calling this release production/stable.
|
23
47
|
Even log and exp should be fine. log, log2, log10 and exp have been
|
24
48
|
tested for several million random values and the current version
|
25
49
|
should cover all of these correctly. But it is still possible, that
|
@@ -53,7 +77,6 @@ after which the decimal point is inserted again.
|
|
53
77
|
Usage
|
54
78
|
-----
|
55
79
|
|
56
|
-
require 'rubygems'
|
57
80
|
require 'long-decimal'
|
58
81
|
|
59
82
|
(then use it.)
|
@@ -106,36 +129,14 @@ ruby test/testrandpower.rb
|
|
106
129
|
These random tests require installation of the ruby-library
|
107
130
|
crypt-isaac for its random numbers, which works well with Linux or
|
108
131
|
Windows in combination with Cygwin. Installation of crypt-isaac is
|
109
|
-
|
110
|
-
gem install:
|
111
|
-
|
112
|
-
$ cd /tmp
|
113
|
-
$ wget http://rubyforge.org/frs/download.php/6461/crypt-isaac_0.9.1.gem
|
114
|
-
$ su -l
|
115
|
-
# cd /tmp
|
116
|
-
# gem install crypt-isaac
|
117
|
-
(you may need to adjust the URL for downloading the gem)
|
118
|
-
|
119
|
-
.... and then go into the directory, where the gem is
|
120
|
-
(/usr/local/lib/ruby/gems/1.8/gems/Crypt::ISAAC-0.9.1/ or
|
121
|
-
/usr/lib/ruby/gems/1.8/gems/Crypt::ISAAC-0.9.1/ or ...)
|
122
|
-
|
123
|
-
# cd /usr/local/lib/ruby/gems/1.8/gems/Crypt::ISAAC-0.9.1/
|
124
|
-
# ruby setup.rb install
|
125
|
-
# exit
|
126
|
-
$
|
132
|
+
required for the random tests.
|
127
133
|
|
128
134
|
If you actually want to run tests for long-decimal or
|
129
|
-
long-decimal-extra and find an error with it, please report it
|
130
|
-
the lines of output revealing the bug on
|
131
|
-
http://rubyforge.org/projects/long-decimal/ -> tracker
|
135
|
+
long-decimal-extra and find an error with it, please report it.
|
132
136
|
|
133
137
|
Install
|
134
138
|
-------
|
135
139
|
|
136
|
-
(REMARK: installation has only been successfully tested on Linux with
|
137
|
-
ruby 1.8.7 and on Windows 2000 with Cygwin and on Windows 2000 with
|
138
|
-
native ruby)
|
139
140
|
|
140
141
|
1. Using ruby-gems (preferred)
|
141
142
|
- open a shell window
|
@@ -154,7 +155,6 @@ native ruby)
|
|
154
155
|
|
155
156
|
- Usage from your ruby-programs:
|
156
157
|
|
157
|
-
require "rubygems"
|
158
158
|
require "long-decimal"
|
159
159
|
|
160
160
|
- documentation will be found in HTML-format in the directory
|
@@ -229,17 +229,17 @@ a sophisticated library like this additional external documentation
|
|
229
229
|
should be provided in the long term. Currently this does not exist at
|
230
230
|
all.
|
231
231
|
|
232
|
-
Please report any bugs you come across
|
233
|
-
http://rubyforge.org/projects/long-decimal -> Tracker.
|
232
|
+
Please report any bugs you come across.
|
234
233
|
|
235
|
-
The status of long-decimal is considered to be
|
234
|
+
The status of long-decimal is considered to be production stable.
|
236
235
|
|
237
236
|
License
|
238
237
|
-------
|
239
238
|
|
240
239
|
Ruby's license or LGPL
|
241
240
|
Find copies of these licenses on http://www.gnu.org/ or http://www.ruby-lang.org/
|
242
|
-
� Karl Brodowsky (IT Sky Consulting GmbH) 2006-
|
241
|
+
� Karl Brodowsky (IT Sky Consulting GmbH) 2006-2014
|
242
|
+
http://www.it-sky-consulting.com/
|
243
243
|
|
244
244
|
Warranty
|
245
245
|
--------
|
data/Rakefile
CHANGED
@@ -1,89 +1,35 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
#
|
2
4
|
# Rakefile for long-decimal project
|
3
5
|
#
|
4
6
|
# (C) Karl Brodowsky (IT Sky Consulting GmbH) 2006-2009
|
5
7
|
#
|
6
8
|
# CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/Rakefile,v 1.4 2009/04/15 19:29:37 bk1 Exp $
|
7
|
-
# CVS-Label: $Name:
|
9
|
+
# CVS-Label: $Name: $
|
8
10
|
# Author: $Author: bk1 $ (Karl Brodowsky)
|
9
11
|
#
|
10
12
|
|
11
|
-
require
|
12
|
-
require '
|
13
|
-
|
14
|
-
include Config
|
15
|
-
|
16
|
-
PKG_NAME = 'long-decimal'
|
17
|
-
PKG_VERSION = File.read('VERSION').chomp
|
18
|
-
PKG_FILES = Dir.glob("**/*").delete_if { |item|
|
19
|
-
item.include?("CVS") || item.include?("RCS") || item.include?("pkg") || item.include?("~") || item.include?("#")
|
20
|
-
}
|
13
|
+
require "bundler/gem_tasks"
|
14
|
+
require 'rubygems'
|
15
|
+
require 'bundler'
|
21
16
|
|
22
|
-
|
23
|
-
|
24
|
-
|
17
|
+
require 'rake/testtask'
|
18
|
+
Rake::TestTask.new(:test) do |test|
|
19
|
+
test.libs << 'lib' << 'test'
|
20
|
+
test.pattern = 'test/testlongdecimal.rb'
|
21
|
+
test.verbose = true
|
25
22
|
end
|
26
23
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
desc "Creating documentation"
|
33
|
-
task :doc do
|
34
|
-
ruby 'make_doc.rb'
|
35
|
-
end
|
36
|
-
|
37
|
-
desc "Testing library"
|
38
|
-
task :test do
|
39
|
-
ruby %{test/testlongdecimal.rb}
|
40
|
-
end
|
41
|
-
|
42
|
-
spec = Gem::Specification.new do |s|
|
43
|
-
|
44
|
-
#### Basic information.
|
45
|
-
|
46
|
-
s.name = 'long-decimal'
|
47
|
-
s.version = PKG_VERSION
|
48
|
-
s.summary = 'LongDecimal for numbers with fixed point'
|
49
|
-
s.description = ""
|
50
|
-
|
51
|
-
#### Dependencies and requirements.
|
52
|
-
|
53
|
-
s.files = PKG_FILES
|
54
|
-
|
55
|
-
#### C code extensions.
|
56
|
-
|
57
|
-
#### Load-time details: library and application (you will need one or both).
|
58
|
-
|
59
|
-
s.require_path = 'lib' # 'lib' # Use these for libraries.
|
60
|
-
s.autorequire = 'long-decimal'
|
61
|
-
|
62
|
-
#s.bindir = "bin" # Use these for applications.
|
63
|
-
#s.executables = ["bla.rb"]
|
64
|
-
#s.default_executable = "bla.rb"
|
65
|
-
|
66
|
-
#### Documentation and testing.
|
67
|
-
|
68
|
-
s.has_rdoc = true
|
69
|
-
#s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
|
70
|
-
#s.rdoc_options <<
|
71
|
-
# '--title' << 'Rake -- Ruby Make' <<
|
72
|
-
# '--main' << 'README' <<
|
73
|
-
# '--line-numbers'
|
74
|
-
s.test_files << 'test/testlongdecimal.rb'
|
75
|
-
|
76
|
-
#### Author and project details.
|
77
|
-
|
78
|
-
s.author = "Karl Brodowsky"
|
79
|
-
s.email = "http://www.velofahren.de/mail.html"
|
80
|
-
s.homepage = "http://long-decimal.rubyforge.org/"
|
81
|
-
s.rubyforge_project = "long-decimal"
|
82
|
-
end
|
24
|
+
require 'rdoc/task'
|
25
|
+
Rake::RDocTask.new do |rdoc|
|
26
|
+
version = File.exist?('VERSION') ? File.read('VERSION').strip : LongDecimalSupport::VERSION
|
83
27
|
|
84
|
-
|
85
|
-
|
86
|
-
|
28
|
+
rdoc.rdoc_dir = 'rdoc'
|
29
|
+
rdoc.title = "long-decimal #{version}"
|
30
|
+
rdoc.main = "README"
|
31
|
+
rdoc.rdoc_files.include('README*')
|
32
|
+
rdoc.rdoc_files.include('lib/*.rb')
|
87
33
|
end
|
88
34
|
|
89
35
|
# end of file Rakefile
|
data/lib/long-decimal-extra.rb
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
#
|
4
4
|
# (C) Karl Brodowsky (IT Sky Consulting GmbH) 2006-2009
|
5
5
|
#
|
6
|
-
# CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/lib/long-decimal-extra.rb,v 1.
|
7
|
-
# CVS-Label: $Name:
|
6
|
+
# CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/lib/long-decimal-extra.rb,v 1.29 2011/02/04 23:17:21 bk1 Exp $
|
7
|
+
# CVS-Label: $Name: $
|
8
8
|
# Author: $Author: bk1 $ (Karl Brodowsky)
|
9
9
|
#
|
10
10
|
require "complex"
|
@@ -23,6 +23,7 @@ class LongDecimal
|
|
23
23
|
@timer[i] = Time.now
|
24
24
|
end
|
25
25
|
|
26
|
+
# helper method for performance measurements
|
26
27
|
def te(i)
|
27
28
|
@@tt ||= []
|
28
29
|
@@tt[i] ||= 0
|
@@ -32,6 +33,7 @@ class LongDecimal
|
|
32
33
|
@@tc[i] += 1
|
33
34
|
end
|
34
35
|
|
36
|
+
# helper method for performance measurements
|
35
37
|
def tt(i)
|
36
38
|
@@tt ||= []
|
37
39
|
@@tt[i] ||= 0
|
@@ -318,14 +320,12 @@ class LongDecimal
|
|
318
320
|
elsif dividend < divisor
|
319
321
|
# self is between 0 and 1 and dividend > LongMath::MAX_FLOATABLE
|
320
322
|
# return LongDecimal(dividend.div(LongMath.npower10(digits)), scale -digits).to_f
|
321
|
-
# puts "via s (1): #{self.inspect}"
|
322
323
|
return self.to_s.to_f
|
323
324
|
else
|
324
325
|
q = dividend.abs / divisor
|
325
326
|
if (q.abs > 1000000000000000000000)
|
326
327
|
return q.to_f
|
327
328
|
else
|
328
|
-
# puts "via s (2): #{self.inspect}"
|
329
329
|
return self.to_s.to_f
|
330
330
|
end
|
331
331
|
end
|
@@ -342,343 +342,9 @@ end
|
|
342
342
|
# LongDecimal instead of Float.
|
343
343
|
#
|
344
344
|
module LongMath
|
345
|
-
|
346
|
-
#
|
347
|
-
# calc the base-2-exponential function of x to the given precision as
|
348
|
-
# LongDecimal. Only supports values of x such that the result still
|
349
|
-
# fits into a float (x <= 709). This limitation is somewhat
|
350
|
-
# arbitrary, but it is enforced in order to avoid producing numbers
|
351
|
-
# with the exponential function that exceed the memory.
|
352
|
-
#
|
353
|
-
def LongMath.exp2(x, prec, mode = LongMath.standard_mode) # down?
|
354
|
-
LongMath.power(2, x, prec, mode)
|
355
|
-
end
|
356
|
-
|
357
|
-
#
|
358
|
-
# calc the base-10-exponential function of x to the given precision as
|
359
|
-
# LongDecimal. Only supports values of x such that the result still
|
360
|
-
# fits into a float (x <= 709). This limitation is somewhat
|
361
|
-
# arbitrary, but it is enforced in order to avoid producing numbers
|
362
|
-
# with the exponential function that exceed the memory.
|
363
|
-
#
|
364
|
-
def LongMath.exp10(x, prec, mode = LongMath.standard_mode) # down?
|
365
|
-
LongMath.power(10, x, prec, mode)
|
366
|
-
end
|
367
|
-
|
368
|
-
#
|
369
|
-
# calculate the base 10 logarithm of x to the given precision as
|
370
|
-
# LongDecimal.
|
371
|
-
#
|
372
|
-
def LongMath.log10(x, prec, mode = LongMath.standard_mode) # down?
|
373
|
-
|
374
|
-
prec = check_is_prec(prec, "prec")
|
375
|
-
check_is_mode(mode, "mode")
|
376
|
-
iprec = prec + 6
|
377
|
-
unless (x.kind_of? LongDecimal)
|
378
|
-
x = x.to_ld(iprec, mode)
|
379
|
-
end
|
380
|
-
if (x.one?) then
|
381
|
-
return LongDecimal.zero!(prec)
|
382
|
-
end
|
383
|
-
|
384
|
-
id = x.int_digits10
|
385
|
-
xx = x.move_point_left(id)
|
386
|
-
lnxx = log_internal(xx, iprec, mode)
|
387
|
-
ln10 = log_internal(10, iprec, mode)
|
388
|
-
y = id + (lnxx / ln10).round_to_scale(prec, mode)
|
389
|
-
return y
|
390
|
-
end
|
391
|
-
|
392
|
-
#
|
393
|
-
# calculate the base 2 logarithm of x to the given precision as
|
394
|
-
# LongDecimal.
|
395
|
-
#
|
396
|
-
def LongMath.log2(x, prec, mode = LongMath.standard_mode)
|
397
|
-
|
398
|
-
prec = check_is_prec(prec, "prec")
|
399
|
-
check_is_mode(mode, "mode")
|
400
|
-
iprec = prec + 6
|
401
|
-
unless (x.kind_of? LongDecimal)
|
402
|
-
x = x.to_ld(iprec, mode)
|
403
|
-
end
|
404
|
-
if (x.one?) then
|
405
|
-
return LongDecimal.zero!(prec)
|
406
|
-
end
|
407
|
-
id = x.int_digits2
|
408
|
-
xx = (x / (1 << id)).round_to_scale(x.scale+id)
|
409
|
-
lnxx = log_internal(xx, iprec, mode)
|
410
|
-
ln2 = log_internal(2.to_ld, iprec, mode)
|
411
|
-
y = id + (lnxx / ln2).round_to_scale(prec, mode)
|
412
|
-
return y
|
413
|
-
end
|
414
|
-
|
415
|
-
|
416
|
-
#
|
417
|
-
# calculate the natural logarithm of x as floating point number,
|
418
|
-
# even if x cannot reasonably be expressed as Float.
|
419
|
-
#
|
420
|
-
def LongMath.log_f(x)
|
421
|
-
raise TypeError, "x=#{x.inspect} must not be positive" unless x > 0
|
422
|
-
unless x.kind_of? LongDecimal
|
423
|
-
x = x.to_ld(18, LongDecimalRoundingMode::ROUND_HALF_UP)
|
424
|
-
end
|
425
|
-
y = 0
|
426
|
-
while (x > LongMath::MAX_FLOATABLE)
|
427
|
-
y += LOG_1E100
|
428
|
-
x = x.move_point_left(100)
|
429
|
-
end
|
430
|
-
while (x < LongMath::MIN_FLOATABLE)
|
431
|
-
y -= LOG_1E100
|
432
|
-
x = x.move_point_right(100)
|
433
|
-
end
|
434
|
-
x_f = x.to_f
|
435
|
-
y += Math.log(x_f)
|
436
|
-
y
|
437
|
-
end
|
438
345
|
|
439
346
|
private
|
440
347
|
|
441
|
-
LOG_1E100 = Math.log(1e100)
|
442
|
-
|
443
|
-
#
|
444
|
-
# internal helper method for calculating the internal precision for power
|
445
|
-
#
|
446
|
-
def LongMath.calc_iprec_for_power(x, y, prec)
|
447
|
-
|
448
|
-
logx_f = LongMath.log_f(x.abs)
|
449
|
-
|
450
|
-
y_f = nil
|
451
|
-
if (y.abs <= LongMath::MAX_FLOATABLE) then
|
452
|
-
y_f = y.to_f
|
453
|
-
else
|
454
|
-
y_f = y.round_to_scale(18, LongMath::ROUND_UP)
|
455
|
-
end
|
456
|
-
|
457
|
-
logx_y_f = logx_f * y_f
|
458
|
-
|
459
|
-
if (logx_y_f.abs > LongMath::MAX_FLOATABLE) then
|
460
|
-
raise ArgumentError, "power would be way too big: y*log(x)=#{logx_y_f}";
|
461
|
-
end
|
462
|
-
logx_y_f = logx_y_f.to_f unless logx_y_f.kind_of? Float
|
463
|
-
|
464
|
-
iprec_x = calc_iprec_for_exp(logx_y_f.abs.ceil, prec, logx_y_f < 0)
|
465
|
-
iprec_y = iprec_x
|
466
|
-
iprec = iprec_x + 2
|
467
|
-
if (logx_f < 0)
|
468
|
-
iprec_x -= (logx_f/LOG10).round
|
469
|
-
end
|
470
|
-
if (y_f.abs < 1)
|
471
|
-
logy_f = LongMath.log_f(y.abs)
|
472
|
-
iprec_y -= (logy_f/LOG10).round
|
473
|
-
end
|
474
|
-
[ iprec, iprec_x, iprec_y, logx_y_f ]
|
475
|
-
|
476
|
-
end
|
477
|
-
|
478
|
-
public
|
479
|
-
|
480
|
-
#
|
481
|
-
# calc the power of x with exponent y to the given precision as
|
482
|
-
# LongDecimal. Only supports values of y such that the result still
|
483
|
-
# fits into a float
|
484
|
-
#
|
485
|
-
def LongMath.power(x, y, prec, mode = LongMath.standard_mode)
|
486
|
-
|
487
|
-
raise TypeError, "x=#{x} must be numeric" unless x.kind_of? Numeric
|
488
|
-
raise TypeError, "y=#{y} must be numeric" unless y.kind_of? Numeric
|
489
|
-
raise TypeError, "x=#{x.inspect} must not be greater #{MAX_FLOATABLE}" unless x.abs <= MAX_FLOATABLE
|
490
|
-
raise TypeError, "y=#{y.inspect} must not be greater #{MAX_FLOATABLE}" unless y.abs <= MAX_FLOATABLE
|
491
|
-
raise TypeError, "y=#{y.inspect} must not be negative if base is zero}" if y < 0 && x.zero?
|
492
|
-
raise TypeError, "x=#{x.inspect} must not negative" unless x >= 0
|
493
|
-
prec = check_is_prec(prec, "prec")
|
494
|
-
check_is_mode(mode, "mode")
|
495
|
-
puts "LongMath.power(x=#{x} y=#{y} prec=#{prec} mode=#{mode})"
|
496
|
-
|
497
|
-
# handle the special cases where base or exponent are 0 or 1 explicitely
|
498
|
-
if y.zero? then
|
499
|
-
return LongDecimal.one!(prec)
|
500
|
-
elsif x.zero? then
|
501
|
-
return LongDecimal.zero!(prec)
|
502
|
-
elsif y.one? then
|
503
|
-
return x.to_ld(prec, mode)
|
504
|
-
elsif x.one? then
|
505
|
-
return LongDecimal.one!(prec)
|
506
|
-
end
|
507
|
-
|
508
|
-
# could be result with our precision
|
509
|
-
# x ** y <= 10**-s/2 <=> y * log(x) <= -s log(10) - log(2)
|
510
|
-
|
511
|
-
iprec, iprec_x, iprec_y, logx_y_f = calc_iprec_for_power(x, y, prec)
|
512
|
-
puts "x=#{x} y=#{y} prec=#{prec} iprec=#{iprec} iprec_x=#{iprec_x} iprec_y=#{iprec_y} logx_y_f=#{logx_y_f}: checking x < 1 && y > 0 || x > 1 && y < 0=#{x < 1 && y > 0 || x > 1 && y < 0}"
|
513
|
-
$stdout.flush
|
514
|
-
if (x < 1 && y > 0 || x > 1 && y < 0) then
|
515
|
-
puts "checking if zero logx_y_f=#{logx_y_f} <= #{- prec * LOG10 - LOG2}"
|
516
|
-
if (logx_y_f <= - prec * LOG10 - LOG2) then
|
517
|
-
return LongDecimal.zero!(prec)
|
518
|
-
end
|
519
|
-
end
|
520
|
-
|
521
|
-
unless (x.kind_of? LongDecimalBase) || (x.kind_of? Integer)
|
522
|
-
x = x.to_ld(iprec_x, mode)
|
523
|
-
end
|
524
|
-
unless (y.kind_of? LongDecimalBase) || (y.kind_of? Integer)
|
525
|
-
y = y.to_ld(iprec_y, mode)
|
526
|
-
end
|
527
|
-
|
528
|
-
# try shortcut if exponent is an integer
|
529
|
-
if (y.kind_of? LongDecimalBase) && y.is_int? then
|
530
|
-
y = y.to_i
|
531
|
-
end
|
532
|
-
unless (y.kind_of? Integer)
|
533
|
-
y2 = y*2
|
534
|
-
if (y2.kind_of? LongDecimalBase) && y2.is_int? then
|
535
|
-
y2 = y2.to_i
|
536
|
-
end
|
537
|
-
if (y2.kind_of? Integer)
|
538
|
-
x = LongMath.sqrt(x, 2*iprec_x, mode)
|
539
|
-
y = y2
|
540
|
-
end
|
541
|
-
end
|
542
|
-
if (y.kind_of? Integer)
|
543
|
-
unless x.kind_of? LongDecimal
|
544
|
-
x = x.to_ld(iprec_x)
|
545
|
-
end
|
546
|
-
z = LongMath.ipower(x, y, 2*iprec, mode)
|
547
|
-
return z.to_ld(prec, mode)
|
548
|
-
end
|
549
|
-
|
550
|
-
# it can be assumed that the exponent is not an integer, so it should
|
551
|
-
# be converted into LongDecimal
|
552
|
-
unless (y.kind_of? LongDecimal)
|
553
|
-
y = y.to_ld(iprec_y, mode)
|
554
|
-
end
|
555
|
-
|
556
|
-
# if x < 1 && y < 0 then
|
557
|
-
# working with x < 1 should be improved, less precision needed
|
558
|
-
if x < 1 then
|
559
|
-
# since we do not allow x < 0 and we have handled x = 0 already,
|
560
|
-
# we can be sure that x is no integer, so it has been converted
|
561
|
-
# if necessary to LongDecimalBase
|
562
|
-
y = -y
|
563
|
-
x = (1/x).round_to_scale(iprec_x*2, mode)
|
564
|
-
iprec, iprec_x, iprec_y, logx_y_f = calc_iprec_for_power(x, y, prec)
|
565
|
-
puts "x=#{x} y=#{y} prec=#{prec} iprec=#{iprec} iprec_x=#{iprec_x} iprec_y=#{iprec_y} logx_y_f=#{logx_y_f}: checking x < 1 && y > 0 || x > 1 && y < 0=#{x < 1 && y > 0 || x > 1 && y < 0}"
|
566
|
-
$stdout.flush
|
567
|
-
if (x < 1 && y > 0 || x > 1 && y < 0) then
|
568
|
-
puts "checking if zero logx_y_f=#{logx_y_f} <= #{- prec * LOG10 - LOG2}"
|
569
|
-
if (logx_y_f <= - prec * LOG10 - LOG2) then
|
570
|
-
return LongDecimal.zero!(prec)
|
571
|
-
end
|
572
|
-
end
|
573
|
-
end
|
574
|
-
|
575
|
-
# exponent is split in two parts, an integer part and a
|
576
|
-
# LongDecimal with absolute value <= 0.5
|
577
|
-
y0 = y.round_to_scale(0, LongMath.standard_imode).to_i
|
578
|
-
x0 = x
|
579
|
-
point_shift = 0
|
580
|
-
puts "x0=#{x0} y0=#{y0}"
|
581
|
-
while x0 > LongMath::MAX_FLOATABLE
|
582
|
-
x0 = x0.move_point_left(100)
|
583
|
-
point_shift += 100
|
584
|
-
end
|
585
|
-
iprec2 = 2 * (iprec + point_shift)
|
586
|
-
iprec3 = [ iprec2, LongMath.prec_limit() - 24 ].min
|
587
|
-
puts "x0=#{x0} y0=#{y0} point_shift=#{point_shift} iprec=#{iprec} iprec2=#{iprec2} iprec3=#{iprec3}"
|
588
|
-
z0 = LongMath.ipower(x0, y0, iprec3, mode)
|
589
|
-
if (point_shift > 0)
|
590
|
-
unless z0.kind_of? LongDecimal
|
591
|
-
z0 = z0.to_ld(2*(iprec + point_shift))
|
592
|
-
end
|
593
|
-
z0 = z0.move_point_right(point_shift * y0)
|
594
|
-
end
|
595
|
-
y1 = y - y0
|
596
|
-
prec_extra = 0
|
597
|
-
if (y0 > 0)
|
598
|
-
prec_extra = (y0*Math.log10(x.to_f).abs).ceil
|
599
|
-
end
|
600
|
-
# z1 = LongMath.power_internal(x, y1, prec+prec_extra , mode)
|
601
|
-
z1 = LongMath.power_internal(x, y1, prec+prec_extra + 4, mode)
|
602
|
-
z = z0 * z1
|
603
|
-
# puts("x=#{x} y=#{y} z=#{z} y not int")
|
604
|
-
return z.to_ld(prec, mode)
|
605
|
-
end
|
606
|
-
|
607
|
-
#
|
608
|
-
# internal functionality to calculate the y-th power of x assuming
|
609
|
-
# that y is an integer
|
610
|
-
# prec is a hint on how much internal precision is needed at most
|
611
|
-
# final rounding is left to the caller
|
612
|
-
#
|
613
|
-
def LongMath.ipower(x, y, prec, mode)
|
614
|
-
|
615
|
-
t0 = Time.now
|
616
|
-
raise TypeError, "base x=#{x} must be numeric" unless x.kind_of? Numeric
|
617
|
-
raise TypeError, "exponent y=#{y} must be integer" unless y.kind_of? Integer
|
618
|
-
raise TypeError, "base x=#{x.inspect} must not be greater MAX_FLOATABLE=#{MAX_FLOATABLE}" unless x.abs <= MAX_FLOATABLE
|
619
|
-
raise TypeError, "exponent y=#{y.inspect} must not be greater MAX_FLOATABLE=#{MAX_FLOATABLE}" unless y.abs <= MAX_FLOATABLE
|
620
|
-
prec = check_is_prec(prec, "prec")
|
621
|
-
check_is_mode(mode, "mode")
|
622
|
-
puts "LongMath.ipower(x=#{x} y=#{y} prec=#{prec} mode=#{mode})"
|
623
|
-
|
624
|
-
if (y.zero?)
|
625
|
-
return 1
|
626
|
-
elsif ! (x.kind_of? LongDecimalBase) || x.scale * y.abs <= prec
|
627
|
-
puts "x=#{x} y=#{y} using **"
|
628
|
-
return x ** y
|
629
|
-
elsif (y < 0)
|
630
|
-
l = Math.log10(x.abs.to_f)
|
631
|
-
if (l > 0)
|
632
|
-
prec += (2*l).ceil
|
633
|
-
end
|
634
|
-
# return (1/LongMath.ipower(x, -y, prec + 2, mode)).round_to_scale(prec, mode)
|
635
|
-
xi = 1/x
|
636
|
-
puts "x=#{x} y=#{y} prec=#{prec} using (1/x)**y xi=#{xi}"
|
637
|
-
xr = xi.round_to_scale(prec + 6, mode)
|
638
|
-
return LongMath.ipower(xr, -y, prec, mode)
|
639
|
-
else
|
640
|
-
# y > 0
|
641
|
-
puts "x=#{x} y=#{y} regular"
|
642
|
-
cnt = 0
|
643
|
-
z = x
|
644
|
-
y0 = y
|
645
|
-
x0 = x
|
646
|
-
while true do
|
647
|
-
|
648
|
-
cnt++
|
649
|
-
y -= 1
|
650
|
-
if (y.zero?)
|
651
|
-
break
|
652
|
-
end
|
653
|
-
while (y & 0x01) == 0 do
|
654
|
-
|
655
|
-
cnt++
|
656
|
-
y = y >> 1
|
657
|
-
x = (x*x)
|
658
|
-
if (x.kind_of? LongDecimalBase)
|
659
|
-
x = x.round_to_scale(prec+4, mode)
|
660
|
-
end
|
661
|
-
if (cnt > 1000)
|
662
|
-
puts("ipower x=#{x} y=#{y} cnt=#{cnt} z=#{z} t=#{Time.now - t0}")
|
663
|
-
cnt = 0
|
664
|
-
end
|
665
|
-
|
666
|
-
end
|
667
|
-
z *= x
|
668
|
-
if (z.kind_of? LongDecimalBase)
|
669
|
-
z = z.round_to_scale(prec+3, mode)
|
670
|
-
if (z.zero?)
|
671
|
-
break
|
672
|
-
end
|
673
|
-
end
|
674
|
-
end
|
675
|
-
puts "z=#{z} rounding prec=#{prec}"
|
676
|
-
z = z.round_to_scale(prec, mode)
|
677
|
-
puts "rounded -> z=#{z}"
|
678
|
-
return z
|
679
|
-
end
|
680
|
-
end
|
681
|
-
|
682
348
|
#
|
683
349
|
# internal functionality to calculate the y-th power of x assuming
|
684
350
|
# that y is an integer
|
@@ -741,340 +407,7 @@ module LongMath
|
|
741
407
|
end
|
742
408
|
end
|
743
409
|
|
744
|
-
|
745
|
-
# internal functionality of exp. exposes some more parameters, that
|
746
|
-
# should usually be set to defaut values, in order to allow better testing.
|
747
|
-
# do not actually call this method unless you are testing exp.
|
748
|
-
# create a bug report, if the default settings for the parameters do
|
749
|
-
# not work correctly
|
750
|
-
#
|
751
|
-
def LongMath.power_internal(x, y, prec = nil, final_mode = LongMath.standard_mode, iprec = nil, mode = LongMath.standard_imode)
|
752
|
-
|
753
|
-
if (prec.nil?) then
|
754
|
-
if (x.kind_of? LongDecimalBase) && (y.kind_of? LongDecimalBase)
|
755
|
-
prec = [x.scale, y.scale].max
|
756
|
-
elsif (x.kind_of? LongDecimalBase)
|
757
|
-
prec = x.scale
|
758
|
-
elsif (y.kind_of? LongDecimalBase)
|
759
|
-
prec = y.scale
|
760
|
-
else
|
761
|
-
raise ArgumentError, "precision must be supplied either as precision of x=#{x} or explicitely"
|
762
|
-
end
|
763
|
-
end
|
764
|
-
prec = check_is_prec(prec, "prec")
|
765
|
-
|
766
|
-
if (final_mode.nil?)
|
767
|
-
final_mode = LongMath.standard_mode
|
768
|
-
end
|
769
|
-
check_is_mode(final_mode, "final_mode")
|
770
|
-
check_is_mode(mode, "mode")
|
771
|
-
|
772
|
-
if y.zero? then
|
773
|
-
return LongDecimal.one!(prec)
|
774
|
-
elsif x.zero? then
|
775
|
-
return LongDecimal.zero!(prec)
|
776
|
-
end
|
777
|
-
|
778
|
-
if (iprec.nil?) then
|
779
|
-
iprec, iprec_x, iprec_y = calc_iprec_for_power(x, y, prec)
|
780
|
-
end
|
781
|
-
unless (x.kind_of? LongDecimal)
|
782
|
-
# x = x.to_ld(iprec, mode)
|
783
|
-
x = x.to_ld(iprec_x, mode)
|
784
|
-
end
|
785
|
-
unless (y.kind_of? LongDecimal)
|
786
|
-
# y = y.to_ld(iprec, mode)
|
787
|
-
y = y.to_ld(iprec_y, mode)
|
788
|
-
end
|
789
|
-
|
790
|
-
# logx = log(x, iprec, mode)
|
791
|
-
logx = log(x, iprec + 20, mode)
|
792
|
-
logx_y = logx*y
|
793
|
-
# xy = exp_internal(logx_y, prec + 1, mode)
|
794
|
-
# xy = exp_internal(logx_y, prec + 4, mode)
|
795
|
-
xy = exp_internal(logx_y, prec + 3, mode)
|
796
|
-
xy.round_to_scale(prec, final_mode)
|
797
|
-
|
798
|
-
end # power_internal
|
799
|
-
|
800
|
-
LOGARR = [ nil, \
|
801
|
-
0.0, \
|
802
|
-
1.0, \
|
803
|
-
1.58496250072116, \
|
804
|
-
2.0, \
|
805
|
-
2.32192809488736, \
|
806
|
-
2.58496250072116, \
|
807
|
-
2.8073549220576, \
|
808
|
-
3.0, \
|
809
|
-
3.16992500144231, \
|
810
|
-
3.32192809488736, \
|
811
|
-
3.4594316186373, \
|
812
|
-
3.58496250072116, \
|
813
|
-
3.70043971814109, \
|
814
|
-
3.8073549220576, \
|
815
|
-
3.90689059560852, \
|
816
|
-
4.0, \
|
817
|
-
4.08746284125034, \
|
818
|
-
4.16992500144231, \
|
819
|
-
4.24792751344359, \
|
820
|
-
4.32192809488736, \
|
821
|
-
4.39231742277876, \
|
822
|
-
4.4594316186373, \
|
823
|
-
4.52356195605701, \
|
824
|
-
4.58496250072116, \
|
825
|
-
4.64385618977472, \
|
826
|
-
4.70043971814109, \
|
827
|
-
4.75488750216347, \
|
828
|
-
4.8073549220576, \
|
829
|
-
4.85798099512757, \
|
830
|
-
4.90689059560852, \
|
831
|
-
4.95419631038688, \
|
832
|
-
5.0, \
|
833
|
-
5.04439411935845, \
|
834
|
-
5.08746284125034, \
|
835
|
-
5.12928301694497, \
|
836
|
-
5.16992500144231, \
|
837
|
-
5.20945336562895, \
|
838
|
-
5.24792751344359, \
|
839
|
-
5.28540221886225, \
|
840
|
-
5.32192809488736, \
|
841
|
-
5.35755200461808, \
|
842
|
-
5.39231742277876, \
|
843
|
-
5.4262647547021, \
|
844
|
-
5.4594316186373, \
|
845
|
-
5.49185309632967, \
|
846
|
-
5.52356195605701, \
|
847
|
-
5.55458885167764, \
|
848
|
-
5.58496250072116, \
|
849
|
-
5.61470984411521, \
|
850
|
-
5.64385618977472, \
|
851
|
-
5.6724253419715, \
|
852
|
-
5.70043971814109, \
|
853
|
-
5.7279204545632, \
|
854
|
-
5.75488750216347, \
|
855
|
-
5.78135971352466, \
|
856
|
-
5.8073549220576, \
|
857
|
-
5.83289001416474, \
|
858
|
-
5.85798099512757, \
|
859
|
-
5.88264304936184, \
|
860
|
-
5.90689059560852, \
|
861
|
-
5.93073733756289, \
|
862
|
-
5.95419631038688, \
|
863
|
-
5.97727992349992, \
|
864
|
-
6.0, \
|
865
|
-
6.02236781302845, \
|
866
|
-
6.04439411935845, \
|
867
|
-
6.06608919045777, \
|
868
|
-
6.08746284125034, \
|
869
|
-
6.10852445677817, \
|
870
|
-
6.12928301694497, \
|
871
|
-
6.14974711950468, \
|
872
|
-
6.16992500144231, \
|
873
|
-
6.18982455888002, \
|
874
|
-
6.20945336562895, \
|
875
|
-
6.22881869049588, \
|
876
|
-
6.24792751344359, \
|
877
|
-
6.2667865406949, \
|
878
|
-
6.28540221886225, \
|
879
|
-
6.3037807481771, \
|
880
|
-
6.32192809488736, \
|
881
|
-
6.33985000288463, \
|
882
|
-
6.35755200461808, \
|
883
|
-
6.37503943134693, \
|
884
|
-
6.39231742277876, \
|
885
|
-
6.4093909361377, \
|
886
|
-
6.4262647547021, \
|
887
|
-
6.44294349584873, \
|
888
|
-
6.4594316186373, \
|
889
|
-
6.4757334309664, \
|
890
|
-
6.49185309632967, \
|
891
|
-
6.5077946401987, \
|
892
|
-
6.52356195605701, \
|
893
|
-
6.53915881110803, \
|
894
|
-
6.55458885167764, \
|
895
|
-
6.56985560833095, \
|
896
|
-
6.58496250072116, \
|
897
|
-
6.59991284218713, \
|
898
|
-
6.61470984411521, \
|
899
|
-
6.62935662007961, \
|
900
|
-
6.64385618977473, \
|
901
|
-
6.6582114827518, \
|
902
|
-
6.6724253419715, \
|
903
|
-
6.68650052718322, \
|
904
|
-
6.70043971814109, \
|
905
|
-
6.71424551766612, \
|
906
|
-
6.7279204545632, \
|
907
|
-
6.74146698640115, \
|
908
|
-
6.75488750216347, \
|
909
|
-
6.76818432477693, \
|
910
|
-
6.78135971352466, \
|
911
|
-
6.79441586635011, \
|
912
|
-
6.8073549220576, \
|
913
|
-
6.82017896241519, \
|
914
|
-
6.83289001416474, \
|
915
|
-
6.84549005094438, \
|
916
|
-
6.85798099512757, \
|
917
|
-
6.8703647195834, \
|
918
|
-
6.88264304936184, \
|
919
|
-
6.89481776330794, \
|
920
|
-
6.90689059560852, \
|
921
|
-
6.9188632372746, \
|
922
|
-
6.93073733756289, \
|
923
|
-
6.94251450533924, \
|
924
|
-
6.95419631038688, \
|
925
|
-
6.96578428466209, \
|
926
|
-
6.97727992349992, \
|
927
|
-
6.98868468677217, \
|
928
|
-
7.0, \
|
929
|
-
7.01122725542325, \
|
930
|
-
7.02236781302845, \
|
931
|
-
7.03342300153745, \
|
932
|
-
7.04439411935845, \
|
933
|
-
7.05528243550119, \
|
934
|
-
7.06608919045777, \
|
935
|
-
7.07681559705083, \
|
936
|
-
7.08746284125034, \
|
937
|
-
7.09803208296053, \
|
938
|
-
7.10852445677817, \
|
939
|
-
7.11894107272351, \
|
940
|
-
7.12928301694497, \
|
941
|
-
7.13955135239879, \
|
942
|
-
7.14974711950468, \
|
943
|
-
7.15987133677839, \
|
944
|
-
7.16992500144231, \
|
945
|
-
7.17990909001493, \
|
946
|
-
7.18982455888002, \
|
947
|
-
7.19967234483636, \
|
948
|
-
7.20945336562895, \
|
949
|
-
7.21916852046216, \
|
950
|
-
7.22881869049588, \
|
951
|
-
7.23840473932508, \
|
952
|
-
7.24792751344359, \
|
953
|
-
7.25738784269265, \
|
954
|
-
7.2667865406949, \
|
955
|
-
7.27612440527424, \
|
956
|
-
7.28540221886225, \
|
957
|
-
7.29462074889163, \
|
958
|
-
7.3037807481771, \
|
959
|
-
7.31288295528436, \
|
960
|
-
7.32192809488736, \
|
961
|
-
7.33091687811462, \
|
962
|
-
7.33985000288462, \
|
963
|
-
7.34872815423108, \
|
964
|
-
7.35755200461808, \
|
965
|
-
7.36632221424582, \
|
966
|
-
7.37503943134693, \
|
967
|
-
7.38370429247405, \
|
968
|
-
7.39231742277876, \
|
969
|
-
7.40087943628218, \
|
970
|
-
7.4093909361377, \
|
971
|
-
7.4178525148859, \
|
972
|
-
7.4262647547021, \
|
973
|
-
7.43462822763673, \
|
974
|
-
7.44294349584873, \
|
975
|
-
7.45121111183233, \
|
976
|
-
7.4594316186373, \
|
977
|
-
7.467605550083, \
|
978
|
-
7.4757334309664, \
|
979
|
-
7.48381577726426, \
|
980
|
-
7.49185309632967, \
|
981
|
-
7.49984588708321, \
|
982
|
-
7.5077946401987, \
|
983
|
-
7.51569983828404, \
|
984
|
-
7.52356195605701, \
|
985
|
-
7.53138146051631, \
|
986
|
-
7.53915881110803, \
|
987
|
-
7.54689445988764, \
|
988
|
-
7.55458885167764, \
|
989
|
-
7.56224242422107, \
|
990
|
-
7.56985560833095, \
|
991
|
-
7.57742882803575, \
|
992
|
-
7.58496250072116, \
|
993
|
-
7.59245703726808, \
|
994
|
-
7.59991284218713, \
|
995
|
-
7.60733031374961, \
|
996
|
-
7.61470984411521, \
|
997
|
-
7.62205181945638, \
|
998
|
-
7.62935662007961, \
|
999
|
-
7.63662462054365, \
|
1000
|
-
7.64385618977472, \
|
1001
|
-
7.65105169117893, \
|
1002
|
-
7.6582114827518, \
|
1003
|
-
7.66533591718518, \
|
1004
|
-
7.6724253419715, \
|
1005
|
-
7.67948009950545, \
|
1006
|
-
7.68650052718322, \
|
1007
|
-
7.69348695749933, \
|
1008
|
-
7.70043971814109, \
|
1009
|
-
7.70735913208088, \
|
1010
|
-
7.71424551766612, \
|
1011
|
-
7.72109918870719, \
|
1012
|
-
7.7279204545632, \
|
1013
|
-
7.73470962022584, \
|
1014
|
-
7.74146698640115, \
|
1015
|
-
7.74819284958946, \
|
1016
|
-
7.75488750216347, \
|
1017
|
-
7.76155123244448, \
|
1018
|
-
7.76818432477693, \
|
1019
|
-
7.77478705960117, \
|
1020
|
-
7.78135971352466, \
|
1021
|
-
7.78790255939143, \
|
1022
|
-
7.79441586635011, \
|
1023
|
-
7.8008998999203, \
|
1024
|
-
7.8073549220576, \
|
1025
|
-
7.81378119121704, \
|
1026
|
-
7.82017896241519, \
|
1027
|
-
7.82654848729092, \
|
1028
|
-
7.83289001416474, \
|
1029
|
-
7.83920378809694, \
|
1030
|
-
7.84549005094438, \
|
1031
|
-
7.85174904141606, \
|
1032
|
-
7.85798099512757, \
|
1033
|
-
7.86418614465428, \
|
1034
|
-
7.8703647195834, \
|
1035
|
-
7.876516946565, \
|
1036
|
-
7.88264304936184, \
|
1037
|
-
7.88874324889826, \
|
1038
|
-
7.89481776330794, \
|
1039
|
-
7.90086680798075, \
|
1040
|
-
7.90689059560852, \
|
1041
|
-
7.91288933622996, \
|
1042
|
-
7.9188632372746, \
|
1043
|
-
7.92481250360578, \
|
1044
|
-
7.93073733756289, \
|
1045
|
-
7.93663793900257, \
|
1046
|
-
7.94251450533924, \
|
1047
|
-
7.94836723158468, \
|
1048
|
-
7.95419631038688, \
|
1049
|
-
7.96000193206808, \
|
1050
|
-
7.96578428466209, \
|
1051
|
-
7.97154355395077, \
|
1052
|
-
7.97727992349992, \
|
1053
|
-
7.98299357469431, \
|
1054
|
-
7.98868468677217, \
|
1055
|
-
7.99435343685886, \
|
1056
|
-
8.0 ]
|
1057
|
-
|
1058
|
-
def LongMath.log2int(x)
|
1059
|
-
unless x.kind_of? Integer
|
1060
|
-
raise TypeError, "x=#{x.inspect} must be Integer"
|
1061
|
-
end
|
1062
|
-
if (x <= 0)
|
1063
|
-
raise ArgumentError, "x=#{x} < 0"
|
1064
|
-
end
|
1065
|
-
|
1066
|
-
s = x.size
|
1067
|
-
l = [ 8 * s - 36 , 0 ].max
|
1068
|
-
|
1069
|
-
xx = x >> l
|
1070
|
-
while xx >= 256
|
1071
|
-
l += 1
|
1072
|
-
xx = xx >> 1
|
1073
|
-
end
|
1074
|
-
yy = LOGARR[xx]
|
1075
|
-
y = l + yy
|
1076
|
-
y
|
1077
|
-
end
|
410
|
+
public
|
1078
411
|
|
1079
412
|
# alternative calculations of sqrt using newtons algorithm
|
1080
413
|
def LongMath.sqrtn(x)
|