crmf 0.1.1 → 0.1.2

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.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -0
  3. data/crmf.gemspec +102 -1
  4. data/ext/crlibm-1.0beta5/AUTHORS +2 -0
  5. data/ext/crlibm-1.0beta5/CMakeLists.txt +154 -0
  6. data/ext/crlibm-1.0beta5/COPYING +340 -0
  7. data/ext/crlibm-1.0beta5/COPYING.LIB +504 -0
  8. data/ext/crlibm-1.0beta5/ChangeLog +125 -0
  9. data/ext/crlibm-1.0beta5/Makefile.am +134 -0
  10. data/ext/crlibm-1.0beta5/NEWS +0 -0
  11. data/ext/crlibm-1.0beta5/README +31 -0
  12. data/ext/crlibm-1.0beta5/README.DEV +23 -0
  13. data/ext/crlibm-1.0beta5/README.md +5 -0
  14. data/ext/crlibm-1.0beta5/TODO +66 -0
  15. data/ext/crlibm-1.0beta5/VERSION +1 -0
  16. data/ext/crlibm-1.0beta5/acos-td.c +1195 -0
  17. data/ext/crlibm-1.0beta5/acos-td.h +629 -0
  18. data/ext/crlibm-1.0beta5/asin-td.c +1297 -0
  19. data/ext/crlibm-1.0beta5/asin-td.h +620 -0
  20. data/ext/crlibm-1.0beta5/asincos.c +4488 -0
  21. data/ext/crlibm-1.0beta5/asincos.h +575 -0
  22. data/ext/crlibm-1.0beta5/atan-itanium.c +846 -0
  23. data/ext/crlibm-1.0beta5/atan-pentium.c +280 -0
  24. data/ext/crlibm-1.0beta5/atan-pentium.h +343 -0
  25. data/ext/crlibm-1.0beta5/atan_accurate.c +341 -0
  26. data/ext/crlibm-1.0beta5/atan_accurate.h +198 -0
  27. data/ext/crlibm-1.0beta5/atan_fast.c +506 -0
  28. data/ext/crlibm-1.0beta5/atan_fast.h +680 -0
  29. data/ext/crlibm-1.0beta5/configure.ac +419 -0
  30. data/ext/crlibm-1.0beta5/crlibm.h +204 -0
  31. data/ext/crlibm-1.0beta5/crlibm.spec +42 -0
  32. data/ext/crlibm-1.0beta5/crlibm_private.c +397 -0
  33. data/ext/crlibm-1.0beta5/crlibm_private.h +1048 -0
  34. data/ext/crlibm-1.0beta5/csh_fast.c +721 -0
  35. data/ext/crlibm-1.0beta5/csh_fast.h +771 -0
  36. data/ext/crlibm-1.0beta5/double-extended.h +496 -0
  37. data/ext/crlibm-1.0beta5/exp-itanium.c +723 -0
  38. data/ext/crlibm-1.0beta5/exp-td-standalone.c +87 -0
  39. data/ext/crlibm-1.0beta5/exp-td.c +1363 -0
  40. data/ext/crlibm-1.0beta5/exp-td.h +685 -0
  41. data/ext/crlibm-1.0beta5/exp_build_coeffs/exp_fast_table.c +125 -0
  42. data/ext/crlibm-1.0beta5/expm1-standalone.c +119 -0
  43. data/ext/crlibm-1.0beta5/expm1.c +2515 -0
  44. data/ext/crlibm-1.0beta5/expm1.h +715 -0
  45. data/ext/crlibm-1.0beta5/interval.h +238 -0
  46. data/ext/crlibm-1.0beta5/log-de.c +480 -0
  47. data/ext/crlibm-1.0beta5/log-de.h +747 -0
  48. data/ext/crlibm-1.0beta5/log-de2.c +280 -0
  49. data/ext/crlibm-1.0beta5/log-de2.h +2352 -0
  50. data/ext/crlibm-1.0beta5/log-td.c +1158 -0
  51. data/ext/crlibm-1.0beta5/log-td.h +819 -0
  52. data/ext/crlibm-1.0beta5/log.c +2244 -0
  53. data/ext/crlibm-1.0beta5/log.h +1592 -0
  54. data/ext/crlibm-1.0beta5/log10-td.c +906 -0
  55. data/ext/crlibm-1.0beta5/log10-td.h +823 -0
  56. data/ext/crlibm-1.0beta5/log1p.c +1295 -0
  57. data/ext/crlibm-1.0beta5/log2-td.c +1521 -0
  58. data/ext/crlibm-1.0beta5/log2-td.h +821 -0
  59. data/ext/crlibm-1.0beta5/log2_accurate.c +330 -0
  60. data/ext/crlibm-1.0beta5/log2_accurate.h +261 -0
  61. data/ext/crlibm-1.0beta5/log_accurate.c +133 -0
  62. data/ext/crlibm-1.0beta5/log_accurate.h +261 -0
  63. data/ext/crlibm-1.0beta5/log_fast.c +360 -0
  64. data/ext/crlibm-1.0beta5/log_fast.h +440 -0
  65. data/ext/crlibm-1.0beta5/pow.c +1396 -0
  66. data/ext/crlibm-1.0beta5/pow.h +3101 -0
  67. data/ext/crlibm-1.0beta5/prepare +20 -0
  68. data/ext/crlibm-1.0beta5/rem_pio2_accurate.c +219 -0
  69. data/ext/crlibm-1.0beta5/rem_pio2_accurate.h +53 -0
  70. data/ext/crlibm-1.0beta5/scs_lib/AUTHORS +3 -0
  71. data/ext/crlibm-1.0beta5/scs_lib/COPYING +504 -0
  72. data/ext/crlibm-1.0beta5/scs_lib/ChangeLog +16 -0
  73. data/ext/crlibm-1.0beta5/scs_lib/Doxyfile.dev +939 -0
  74. data/ext/crlibm-1.0beta5/scs_lib/Doxyfile.user +939 -0
  75. data/ext/crlibm-1.0beta5/scs_lib/INSTALL +215 -0
  76. data/ext/crlibm-1.0beta5/scs_lib/Makefile.am +17 -0
  77. data/ext/crlibm-1.0beta5/scs_lib/NEWS +0 -0
  78. data/ext/crlibm-1.0beta5/scs_lib/README +9 -0
  79. data/ext/crlibm-1.0beta5/scs_lib/README.DEV +38 -0
  80. data/ext/crlibm-1.0beta5/scs_lib/TODO +4 -0
  81. data/ext/crlibm-1.0beta5/scs_lib/VERSION +1 -0
  82. data/ext/crlibm-1.0beta5/scs_lib/addition_scs.c +623 -0
  83. data/ext/crlibm-1.0beta5/scs_lib/division_scs.c +110 -0
  84. data/ext/crlibm-1.0beta5/scs_lib/double2scs.c +174 -0
  85. data/ext/crlibm-1.0beta5/scs_lib/main.dox +104 -0
  86. data/ext/crlibm-1.0beta5/scs_lib/multiplication_scs.c +339 -0
  87. data/ext/crlibm-1.0beta5/scs_lib/poly_fct.c +112 -0
  88. data/ext/crlibm-1.0beta5/scs_lib/print_scs.c +73 -0
  89. data/ext/crlibm-1.0beta5/scs_lib/rand_scs.c +63 -0
  90. data/ext/crlibm-1.0beta5/scs_lib/scs.h +353 -0
  91. data/ext/crlibm-1.0beta5/scs_lib/scs2double.c +411 -0
  92. data/ext/crlibm-1.0beta5/scs_lib/scs2mpf.c +58 -0
  93. data/ext/crlibm-1.0beta5/scs_lib/scs2mpfr.c +61 -0
  94. data/ext/crlibm-1.0beta5/scs_lib/scs_private.c +23 -0
  95. data/ext/crlibm-1.0beta5/scs_lib/scs_private.h +133 -0
  96. data/ext/crlibm-1.0beta5/scs_lib/wrapper_scs.h +486 -0
  97. data/ext/crlibm-1.0beta5/scs_lib/zero_scs.c +52 -0
  98. data/ext/crlibm-1.0beta5/trigo_accurate.c +501 -0
  99. data/ext/crlibm-1.0beta5/trigo_accurate.h +331 -0
  100. data/ext/crlibm-1.0beta5/trigo_fast.c +1243 -0
  101. data/ext/crlibm-1.0beta5/trigo_fast.h +639 -0
  102. data/ext/crlibm-1.0beta5/trigpi.c +1169 -0
  103. data/ext/crlibm-1.0beta5/trigpi.h +556 -0
  104. data/ext/crlibm-1.0beta5/triple-double.c +57 -0
  105. data/ext/crlibm-1.0beta5/triple-double.h +1380 -0
  106. data/ext/crmf/crmf.c +16 -16
  107. data/ext/crmf/extconf.rb +12 -8
  108. data/lib/crmf/version.rb +1 -1
  109. data/tests/perf.rb +100 -219
  110. metadata +104 -3
  111. data/ext/crlibm-1.0beta4.tar.gz +0 -0
data/ext/crmf/crmf.c CHANGED
@@ -1581,7 +1581,7 @@ static VALUE crmf_add_rz(VALUE self, VALUE x, VALUE y)
1581
1581
  double dx = NUM2DBL(x);
1582
1582
  double dy = NUM2DBL(y);
1583
1583
  fesetround(FE_TOWARDZERO);
1584
- double dr = dx + dy;
1584
+ volatile double dr = dx + dy;
1585
1585
  fesetround(FE_TONEAREST);
1586
1586
  return DBL2NUM(dr);
1587
1587
  }
@@ -1591,7 +1591,7 @@ static VALUE crmf_add_rd(VALUE self, VALUE x, VALUE y)
1591
1591
  double dx = NUM2DBL(x);
1592
1592
  double dy = NUM2DBL(y);
1593
1593
  fesetround(FE_DOWNWARD);
1594
- double dr = dx + dy;
1594
+ volatile double dr = dx + dy;
1595
1595
  fesetround(FE_TONEAREST);
1596
1596
  return DBL2NUM(dr);
1597
1597
  }
@@ -1601,7 +1601,7 @@ static VALUE crmf_add_ru(VALUE self, VALUE x, VALUE y)
1601
1601
  double dx = NUM2DBL(x);
1602
1602
  double dy = NUM2DBL(y);
1603
1603
  fesetround(FE_UPWARD);
1604
- double dr = dx + dy;
1604
+ volatile double dr = dx + dy;
1605
1605
  fesetround(FE_TONEAREST);
1606
1606
  return DBL2NUM(dr);
1607
1607
  }
@@ -1611,7 +1611,7 @@ static VALUE crmf_add_rn(VALUE self, VALUE x, VALUE y)
1611
1611
  double dx = NUM2DBL(x);
1612
1612
  double dy = NUM2DBL(y);
1613
1613
  fesetround(FE_TONEAREST);
1614
- double dr = dx + dy;
1614
+ volatile double dr = dx + dy;
1615
1615
  return DBL2NUM(dr);
1616
1616
  }
1617
1617
 
@@ -1621,7 +1621,7 @@ static VALUE crmf_sub_rz(VALUE self, VALUE x, VALUE y)
1621
1621
  double dx = NUM2DBL(x);
1622
1622
  double dy = NUM2DBL(y);
1623
1623
  fesetround(FE_TOWARDZERO);
1624
- double dr = dx - dy;
1624
+ volatile double dr = dx - dy;
1625
1625
  fesetround(FE_TONEAREST);
1626
1626
  return DBL2NUM(dr);
1627
1627
  }
@@ -1631,7 +1631,7 @@ static VALUE crmf_sub_rd(VALUE self, VALUE x, VALUE y)
1631
1631
  double dx = NUM2DBL(x);
1632
1632
  double dy = NUM2DBL(y);
1633
1633
  fesetround(FE_DOWNWARD);
1634
- double dr = dx - dy;
1634
+ volatile double dr = dx - dy;
1635
1635
  fesetround(FE_TONEAREST);
1636
1636
  return DBL2NUM(dr);
1637
1637
  }
@@ -1641,7 +1641,7 @@ static VALUE crmf_sub_ru(VALUE self, VALUE x, VALUE y)
1641
1641
  double dx = NUM2DBL(x);
1642
1642
  double dy = NUM2DBL(y);
1643
1643
  fesetround(FE_UPWARD);
1644
- double dr = dx - dy;
1644
+ volatile double dr = dx - dy;
1645
1645
  fesetround(FE_TONEAREST);
1646
1646
  return DBL2NUM(dr);
1647
1647
  }
@@ -1651,7 +1651,7 @@ static VALUE crmf_sub_rn(VALUE self, VALUE x, VALUE y)
1651
1651
  double dx = NUM2DBL(x);
1652
1652
  double dy = NUM2DBL(y);
1653
1653
  fesetround(FE_TONEAREST);
1654
- double dr = dx - dy;
1654
+ volatile double dr = dx - dy;
1655
1655
  return DBL2NUM(dr);
1656
1656
  }
1657
1657
 
@@ -1661,7 +1661,7 @@ static VALUE crmf_mul_rz(VALUE self, VALUE x, VALUE y)
1661
1661
  double dx = NUM2DBL(x);
1662
1662
  double dy = NUM2DBL(y);
1663
1663
  fesetround(FE_TOWARDZERO);
1664
- double dr = dx * dy;
1664
+ volatile double dr = dx * dy;
1665
1665
  fesetround(FE_TONEAREST);
1666
1666
  return DBL2NUM(dr);
1667
1667
  }
@@ -1671,7 +1671,7 @@ static VALUE crmf_mul_rd(VALUE self, VALUE x, VALUE y)
1671
1671
  double dx = NUM2DBL(x);
1672
1672
  double dy = NUM2DBL(y);
1673
1673
  fesetround(FE_DOWNWARD);
1674
- double dr = dx * dy;
1674
+ volatile double dr = dx * dy;
1675
1675
  fesetround(FE_TONEAREST);
1676
1676
  return DBL2NUM(dr);
1677
1677
  }
@@ -1681,7 +1681,7 @@ static VALUE crmf_mul_ru(VALUE self, VALUE x, VALUE y)
1681
1681
  double dx = NUM2DBL(x);
1682
1682
  double dy = NUM2DBL(y);
1683
1683
  fesetround(FE_UPWARD);
1684
- double dr = dx * dy;
1684
+ volatile double dr = dx * dy;
1685
1685
  fesetround(FE_TONEAREST);
1686
1686
  return DBL2NUM(dr);
1687
1687
  }
@@ -1691,7 +1691,7 @@ static VALUE crmf_mul_rn(VALUE self, VALUE x, VALUE y)
1691
1691
  double dx = NUM2DBL(x);
1692
1692
  double dy = NUM2DBL(y);
1693
1693
  fesetround(FE_TONEAREST);
1694
- double dr = dx * dy;
1694
+ volatile double dr = dx * dy;
1695
1695
  return DBL2NUM(dr);
1696
1696
  }
1697
1697
 
@@ -1701,7 +1701,7 @@ static VALUE crmf_div_rz(VALUE self, VALUE x, VALUE y)
1701
1701
  double dx = NUM2DBL(x);
1702
1702
  double dy = NUM2DBL(y);
1703
1703
  fesetround(FE_TOWARDZERO);
1704
- double dr = dx / dy;
1704
+ volatile double dr = dx / dy;
1705
1705
  fesetround(FE_TONEAREST);
1706
1706
  return DBL2NUM(dr);
1707
1707
  }
@@ -1711,7 +1711,7 @@ static VALUE crmf_div_rd(VALUE self, VALUE x, VALUE y)
1711
1711
  double dx = NUM2DBL(x);
1712
1712
  double dy = NUM2DBL(y);
1713
1713
  fesetround(FE_DOWNWARD);
1714
- double dr = dx / dy;
1714
+ volatile double dr = dx / dy;
1715
1715
  fesetround(FE_TONEAREST);
1716
1716
  return DBL2NUM(dr);
1717
1717
  }
@@ -1721,7 +1721,7 @@ static VALUE crmf_div_ru(VALUE self, VALUE x, VALUE y)
1721
1721
  double dx = NUM2DBL(x);
1722
1722
  double dy = NUM2DBL(y);
1723
1723
  fesetround(FE_UPWARD);
1724
- double dr = dx / dy;
1724
+ volatile double dr = dx / dy;
1725
1725
  fesetround(FE_TONEAREST);
1726
1726
  return DBL2NUM(dr);
1727
1727
  }
@@ -1731,7 +1731,7 @@ static VALUE crmf_div_rn(VALUE self, VALUE x, VALUE y)
1731
1731
  double dx = NUM2DBL(x);
1732
1732
  double dy = NUM2DBL(y);
1733
1733
  fesetround(FE_TONEAREST);
1734
- double dr = dx / dy;
1734
+ volatile double dr = dx / dy;
1735
1735
  return DBL2NUM(dr);
1736
1736
  }
1737
1737
 
data/ext/crmf/extconf.rb CHANGED
@@ -26,24 +26,28 @@ unless have_library('mpfr') then
26
26
  end
27
27
 
28
28
  ext_dir = File.absolute_path(File.join('..', '..'), __FILE__)
29
- crlibm_src = File.join(ext_dir, 'crlibm-1.0beta4')
30
- crlibm_archive = crlibm_src + '.tar.gz'
29
+ crlibm_src_dir = File.join(ext_dir, 'crlibm-1.0beta5')
31
30
  crlibm_install_dir = File.join(ext_dir, 'crlibm')
32
31
  crlibm_lib_dir = File.join(crlibm_install_dir, 'lib')
33
32
  crlibm_inc_dir = File.join(crlibm_install_dir, 'include')
34
33
  crlibm_bin_dir = File.join(crlibm_install_dir, 'bin')
35
34
  unless File.directory?(crlibm_install_dir) then
36
- cmd = "tar xvf '#{crlibm_archive}' -C '#{ext_dir}'"
37
- abort "-----\n#{caller[0]}\nCannot untar CRLIBM.\nCommand: \"#{cmd}\"\n-----" unless system(cmd)
38
- Dir.chdir(crlibm_src) do
39
- cmd = "./configure --prefix='#{crlibm_install_dir}'#{RUBY_PLATFORM =~ /x86_64/ ? ' --enable-sse2 --enable-double-extended' : ''}"
40
- abort "-----\n#{caller[0]}\nCannot configure CRLIBM.\nCommand: \"#{cmd}\"\n-----" unless system(cmd)
35
+ Dir.chdir(crlibm_src_dir) do
36
+ unless File.file?(File.join(crlibm_src_dir, 'configure')) then
37
+ ENV['CFLAGS'] = '-g -O2 -fPIC'
38
+ cmd = "./prepare --prefix='#{crlibm_install_dir}'#{RUBY_PLATFORM =~ /x86_64/ ? ' --enable-sse2 --enable-double-extended' : ''}"
39
+ abort "-----\n#{caller[0]}\nCannot configure CRLIBM.\nCommand: \"#{cmd}\"\n-----" unless system(cmd)
40
+ end
41
+ #cmd = "../configure --prefix='#{crlibm_install_dir}'#{RUBY_PLATFORM =~ /x86_64/ ? ' --enable-sse2 --enable-double-extended' : ''}"
42
+ #abort "-----\n#{caller[0]}\nCannot configure CRLIBM.\nCommand: \"#{cmd}\"\n-----" unless system(cmd)
41
43
  cmd = "make"
42
44
  abort "-----\n#{caller[0]}\nCannot make CRLIBM.\nCommand: \"#{cmd}\"\n-----" unless system(cmd)
43
45
  cmd = "make -j1 install"
44
46
  abort "-----\n#{caller[0]}\nCannot locally install CRLIBM.\nCommand: \"#{cmd}\"\n-----" unless system(cmd)
47
+ cmd = "make clean"
48
+ abort "-----\n#{caller[0]}\nCannot cleanup CRLIBM.\nCommand: \"#{cmd}\"\n-----" unless system(cmd)
45
49
  end
46
- cmd = "rm -rf '#{crlibm_src}' '#{crlibm_bin_dir}'"
50
+ cmd = "rm -rf '#{crlibm_bin_dir}'"
47
51
  abort "-----\n#{caller[0]}\nCannot cleanup CRLIBM.\nCommand: \"#{cmd}\"\n-----" unless system(cmd)
48
52
  end
49
53
  dir_config('crlibm', crlibm_inc_dir, crlibm_lib_dir)
data/lib/crmf/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module CRMF
2
2
  # @return [String] CRMF gem version
3
- VERSION = '0.1.1'
3
+ VERSION = '0.1.2'
4
4
  end
data/tests/perf.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  require '../lib/crmf.rb'
3
+ require 'colorize'
3
4
 
4
5
  def print_time(t)
5
6
  if t >= 3600 then
@@ -124,231 +125,111 @@ funcs.each do |m|
124
125
  end
125
126
  puts "libm vs mpfr: #{nb_diff_libm_mpfr}/#{nb_tests} (#{nb_diff_libm_mpfr*100.0/nb_tests}%)#{estr}"
126
127
  nb_diff_crlibm_mpfr = nb_tests.times.count{|i| res_crlibm[i] != res_mpfr[i]}
127
- puts "crlibm vs mpfr: #{nb_diff_crlibm_mpfr}/#{nb_tests} (#{nb_diff_crlibm_mpfr*100.0/nb_tests}%)"
128
+ str = "crlibm vs mpfr: #{nb_diff_crlibm_mpfr}/#{nb_tests} (#{nb_diff_crlibm_mpfr*100.0/nb_tests}%)"
129
+ if nb_diff_crlibm_mpfr > 0 then
130
+ puts str.light_red
131
+ else
132
+ puts str
133
+ end
128
134
  end
129
135
 
130
136
  puts
131
137
 
132
138
  nbtm1 = nb_tests - 1
133
139
 
134
- puts " Add N ".center(80, '-')
135
-
136
- tik = Time.now
137
- nb_tests.times do |i|
138
- res_libm[i] = f[i] + f[nbtm1-i]
139
- end
140
- tok = Time.now
141
- t_libm = tok - tik
142
- puts "libm: #{print_time(t_libm)} (#{print_time(t_libm / nb_tests)}/t)"
143
-
144
- tik = Time.now
145
- nb_tests.times do |i|
146
- res_mpfr[i] = Float.add(f[i], f[nbtm1-i])
147
- end
148
- tok = Time.now
149
- t_mpfr = tok - tik
150
- puts "mpfr: #{print_time(t_mpfr)} (#{print_time(t_mpfr / nb_tests)}/t)"
151
-
152
- tik = Time.now
153
- nb_tests.times do |i|
154
- res_crlibm[i] = CRMF.add_rn(f[i], f[nbtm1-i])
155
- end
156
- tok = Time.now
157
- t_crlibm = tok - tik
158
- puts "crlibm: #{print_time(t_crlibm)} (#{print_time(t_crlibm / nb_tests)}/t)"
159
-
160
- max_diff_pct = 0.0
161
- nb_tests.times do |i|
162
- next if (not(res_libm[i].finite?) and not(res_mpfr[i].finite?))
163
- error_pct = 100.0 * (res_libm[i] - res_mpfr[i]).abs / res_mpfr[i]
164
- max_diff_pct = [max_diff_pct, error_pct].max
165
- end
166
- nb_diff_libm_mpfr = nb_tests.times.count{|i| res_libm[i] != res_mpfr[i]}
167
- if nb_diff_libm_mpfr > 0 then
168
- estr = ", max error: #{max_diff_pct}%"
169
- else
170
- estr = ''
171
- end
172
- puts "libm vs mpfr: #{nb_diff_libm_mpfr}/#{nb_tests} (#{nb_diff_libm_mpfr*100.0/nb_tests}%)#{estr}"
173
-
174
- max_diff_pct = 0.0
175
- nb_tests.times do |i|
176
- next if (not(res_crlibm[i].finite?) and not(res_mpfr[i].finite?))
177
- error_pct = 100.0 * (res_crlibm[i] - res_mpfr[i]).abs / res_mpfr[i]
178
- max_diff_pct = [max_diff_pct, error_pct].max
179
- end
180
- nb_diff_crlibm_mpfr = nb_tests.times.count{|i| res_crlibm[i] != res_mpfr[i]}
181
- if nb_diff_crlibm_mpfr > 0 then
182
- estr = ", max error: #{max_diff_pct}%"
183
- else
184
- estr = ''
185
- end
186
- puts "crlibm vs mpfr: #{nb_diff_crlibm_mpfr}/#{nb_tests} (#{nb_diff_crlibm_mpfr*100.0/nb_tests}%)#{estr}"
187
-
188
-
189
- puts " Add D ".center(80, '-')
190
-
191
- tik = Time.now
192
- nb_tests.times do |i|
193
- res_libm[i] = f[i] + f[nbtm1-i]
194
- end
195
- tok = Time.now
196
- t_libm = tok - tik
197
- puts "libm: #{print_time(t_libm)} (#{print_time(t_libm / nb_tests)}/t)"
198
-
199
- tik = Time.now
200
- nb_tests.times do |i|
201
- res_mpfr[i] = Float.add(f[i], f[nbtm1-i], :down)
202
- end
203
- tok = Time.now
204
- t_mpfr = tok - tik
205
- puts "mpfr: #{print_time(t_mpfr)} (#{print_time(t_mpfr / nb_tests)}/t)"
206
-
207
- tik = Time.now
208
- nb_tests.times do |i|
209
- res_crlibm[i] = CRMF.add_rd(f[i], f[nbtm1-i])
210
- end
211
- tok = Time.now
212
- t_crlibm = tok - tik
213
- puts "crlibm: #{print_time(t_crlibm)} (#{print_time(t_crlibm / nb_tests)}/t)"
214
-
215
- max_diff_pct = 0.0
216
- nb_tests.times do |i|
217
- next if (not(res_libm[i].finite?) and not(res_mpfr[i].finite?))
218
- error_pct = 100.0 * (res_libm[i] - res_mpfr[i]).abs / res_mpfr[i]
219
- max_diff_pct = [max_diff_pct, error_pct].max
220
- end
221
- nb_diff_libm_mpfr = nb_tests.times.count{|i| res_libm[i] != res_mpfr[i]}
222
- if nb_diff_libm_mpfr > 0 then
223
- estr = ", max error: #{max_diff_pct}%"
224
- else
225
- estr = ''
226
- end
227
- puts "libm vs mpfr: #{nb_diff_libm_mpfr}/#{nb_tests} (#{nb_diff_libm_mpfr*100.0/nb_tests}%)#{estr}"
228
-
229
- max_diff_pct = 0.0
230
- nb_tests.times do |i|
231
- next if (not(res_crlibm[i].finite?) and not(res_mpfr[i].finite?))
232
- error_pct = 100.0 * (res_crlibm[i] - res_mpfr[i]).abs / res_mpfr[i]
233
- max_diff_pct = [max_diff_pct, error_pct].max
234
- end
235
- nb_diff_crlibm_mpfr = nb_tests.times.count{|i| res_crlibm[i] != res_mpfr[i]}
236
- if nb_diff_crlibm_mpfr > 0 then
237
- estr = ", max error: #{max_diff_pct}%"
238
- else
239
- estr = ''
240
- end
241
- puts "crlibm vs mpfr: #{nb_diff_crlibm_mpfr}/#{nb_tests} (#{nb_diff_crlibm_mpfr*100.0/nb_tests}%)#{estr}"
242
-
243
-
244
-
245
- puts " Add U ".center(80, '-')
246
-
247
- tik = Time.now
248
- nb_tests.times do |i|
249
- res_libm[i] = f[i] + f[nbtm1-i]
250
- end
251
- tok = Time.now
252
- t_libm = tok - tik
253
- puts "libm: #{print_time(t_libm)} (#{print_time(t_libm / nb_tests)}/t)"
254
-
255
- tik = Time.now
256
- nb_tests.times do |i|
257
- res_mpfr[i] = Float.add(f[i], f[nbtm1-i], :up)
258
- end
259
- tok = Time.now
260
- t_mpfr = tok - tik
261
- puts "mpfr: #{print_time(t_mpfr)} (#{print_time(t_mpfr / nb_tests)}/t)"
262
-
263
- tik = Time.now
264
- nb_tests.times do |i|
265
- res_crlibm[i] = CRMF.add_ru(f[i], f[nbtm1-i])
266
- end
267
- tok = Time.now
268
- t_crlibm = tok - tik
269
- puts "crlibm: #{print_time(t_crlibm)} (#{print_time(t_crlibm / nb_tests)}/t)"
270
-
271
- max_diff_pct = 0.0
272
- nb_tests.times do |i|
273
- next if (not(res_libm[i].finite?) and not(res_mpfr[i].finite?))
274
- error_pct = 100.0 * (res_libm[i] - res_mpfr[i]).abs / res_mpfr[i]
275
- max_diff_pct = [max_diff_pct, error_pct].max
276
- end
277
- nb_diff_libm_mpfr = nb_tests.times.count{|i| res_libm[i] != res_mpfr[i]}
278
- if nb_diff_libm_mpfr > 0 then
279
- estr = ", max error: #{max_diff_pct}%"
280
- else
281
- estr = ''
282
- end
283
- puts "libm vs mpfr: #{nb_diff_libm_mpfr}/#{nb_tests} (#{nb_diff_libm_mpfr*100.0/nb_tests}%)#{estr}"
284
-
285
- max_diff_pct = 0.0
286
- nb_tests.times do |i|
287
- next if (not(res_crlibm[i].finite?) and not(res_mpfr[i].finite?))
288
- error_pct = 100.0 * (res_crlibm[i] - res_mpfr[i]).abs / res_mpfr[i]
289
- max_diff_pct = [max_diff_pct, error_pct].max
290
- end
291
- nb_diff_crlibm_mpfr = nb_tests.times.count{|i| res_crlibm[i] != res_mpfr[i]}
292
- if nb_diff_crlibm_mpfr > 0 then
293
- estr = ", max error: #{max_diff_pct}%"
294
- else
295
- estr = ''
296
- end
297
- puts "crlibm vs mpfr: #{nb_diff_crlibm_mpfr}/#{nb_tests} (#{nb_diff_crlibm_mpfr*100.0/nb_tests}%)#{estr}"
298
-
299
-
300
- puts " Add Z ".center(80, '-')
301
-
302
- tik = Time.now
303
- nb_tests.times do |i|
304
- res_libm[i] = f[i] + f[nbtm1-i]
305
- end
306
- tok = Time.now
307
- t_libm = tok - tik
308
- puts "libm: #{print_time(t_libm)} (#{print_time(t_libm / nb_tests)}/t)"
309
-
310
- tik = Time.now
311
- nb_tests.times do |i|
312
- res_mpfr[i] = Float.add(f[i], f[nbtm1-i], :zero)
313
- end
314
- tok = Time.now
315
- t_mpfr = tok - tik
316
- puts "mpfr: #{print_time(t_mpfr)} (#{print_time(t_mpfr / nb_tests)}/t)"
317
-
318
- tik = Time.now
319
- nb_tests.times do |i|
320
- res_crlibm[i] = CRMF.add_rz(f[i], f[nbtm1-i])
321
- end
322
- tok = Time.now
323
- t_crlibm = tok - tik
324
- puts "crlibm: #{print_time(t_crlibm)} (#{print_time(t_crlibm / nb_tests)}/t)"
325
-
326
- max_diff_pct = 0.0
327
- nb_tests.times do |i|
328
- next if (not(res_libm[i].finite?) and not(res_mpfr[i].finite?))
329
- error_pct = 100.0 * (res_libm[i] - res_mpfr[i]).abs / res_mpfr[i]
330
- max_diff_pct = [max_diff_pct, error_pct].max
331
- end
332
- nb_diff_libm_mpfr = nb_tests.times.count{|i| res_libm[i] != res_mpfr[i]}
333
- if nb_diff_libm_mpfr > 0 then
334
- estr = ", max error: #{max_diff_pct}%"
335
- else
336
- estr = ''
337
- end
338
- puts "libm vs mpfr: #{nb_diff_libm_mpfr}/#{nb_tests} (#{nb_diff_libm_mpfr*100.0/nb_tests}%)#{estr}"
339
-
340
- max_diff_pct = 0.0
341
- nb_tests.times do |i|
342
- next if (not(res_crlibm[i].finite?) and not(res_mpfr[i].finite?))
343
- error_pct = 100.0 * (res_crlibm[i] - res_mpfr[i]).abs / res_mpfr[i]
344
- max_diff_pct = [max_diff_pct, error_pct].max
345
- end
346
- nb_diff_crlibm_mpfr = nb_tests.times.count{|i| res_crlibm[i] != res_mpfr[i]}
347
- if nb_diff_crlibm_mpfr > 0 then
348
- estr = ", max error: #{max_diff_pct}%"
349
- else
350
- estr = ''
140
+ [
141
+ [:add, :+],
142
+ [:sub, :-],
143
+ [:mul, :*],
144
+ [:div, :/]
145
+ ].each do |m_m|
146
+ [:z, :d, :u, :n].each do |r|
147
+ puts " #{m_m[0].to_s.capitalize} #{r.to_s.upcase} ".center(80, '-')
148
+ rnd = case r
149
+ when :z
150
+ :zero
151
+ when :d
152
+ :down
153
+ when :u
154
+ :up
155
+ when :n
156
+ :nearest
157
+ end
158
+
159
+ tik = Time.now
160
+ case m_m[0]
161
+ when :add
162
+ nb_tests.times do |i|
163
+ res_libm[i] = f[i] + f[nbtm1-i]
164
+ end
165
+ when :sub
166
+ nb_tests.times do |i|
167
+ res_libm[i] = f[i] - f[nbtm1-i]
168
+ end
169
+ when :mul
170
+ nb_tests.times do |i|
171
+ res_libm[i] = f[i] * f[nbtm1-i]
172
+ end
173
+ when :div
174
+ nb_tests.times do |i|
175
+ res_libm[i] = f[i] / f[nbtm1-i]
176
+ end
177
+ end
178
+ tok = Time.now
179
+ t_libm = tok - tik
180
+ puts "libm: #{print_time(t_libm)} (#{print_time(t_libm / nb_tests)}/t)"
181
+
182
+ method = Float.method(m_m[0])
183
+ tik = Time.now
184
+ nb_tests.times do |i|
185
+ res_mpfr[i] = method.call(f[i], f[nbtm1-i], rnd)
186
+ end
187
+ tok = Time.now
188
+ t_mpfr = tok - tik
189
+ puts "mpfr: #{print_time(t_mpfr)} (#{print_time(t_mpfr / nb_tests)}/t)"
190
+
191
+ method = CRMF.method("#{m_m[0]}_r#{r}")
192
+ tik = Time.now
193
+ nb_tests.times do |i|
194
+ res_crlibm[i] = method.call(f[i], f[nbtm1-i])
195
+ end
196
+ tok = Time.now
197
+ t_crlibm = tok - tik
198
+ puts "FPU: #{print_time(t_crlibm)} (#{print_time(t_crlibm / nb_tests)}/t)"
199
+
200
+ max_diff_pct = 0.0
201
+ nb_tests.times do |i|
202
+ next if (not(res_libm[i].finite?) and not(res_mpfr[i].finite?))
203
+ error_pct = 100.0 * (res_libm[i] - res_mpfr[i]).abs / res_mpfr[i]
204
+ max_diff_pct = [max_diff_pct, error_pct].max
205
+ end
206
+ nb_diff_libm_mpfr = nb_tests.times.count{|i| res_libm[i] != res_mpfr[i]}
207
+ if nb_diff_libm_mpfr > 0 then
208
+ estr = ", max error: #{max_diff_pct}%"
209
+ else
210
+ estr = ''
211
+ end
212
+ puts "libm vs mpfr: #{nb_diff_libm_mpfr}/#{nb_tests} (#{nb_diff_libm_mpfr*100.0/nb_tests}%)#{estr}"
213
+
214
+ max_diff_pct = 0.0
215
+ nb_tests.times do |i|
216
+ next if (not(res_crlibm[i].finite?) and not(res_mpfr[i].finite?))
217
+ error_pct = 100.0 * (res_crlibm[i] - res_mpfr[i]).abs / res_mpfr[i]
218
+ max_diff_pct = [max_diff_pct, error_pct].max
219
+ end
220
+ nb_diff_crlibm_mpfr = nb_tests.times.count{|i| res_crlibm[i] != res_mpfr[i]}
221
+ if nb_diff_crlibm_mpfr > 0 then
222
+ estr = ", max error: #{max_diff_pct}%"
223
+ else
224
+ estr = ''
225
+ end
226
+ str = "FPU vs mpfr: #{nb_diff_crlibm_mpfr}/#{nb_tests} (#{nb_diff_crlibm_mpfr*100.0/nb_tests}%)#{estr}"
227
+ if nb_diff_crlibm_mpfr > 0 then
228
+ puts str.light_red
229
+ else
230
+ puts str
231
+ end
232
+ end
351
233
  end
352
- puts "crlibm vs mpfr: #{nb_diff_crlibm_mpfr}/#{nb_tests} (#{nb_diff_crlibm_mpfr*100.0/nb_tests}%)#{estr}"
353
234
 
354
235
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crmf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Théotime Bollengier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-21 00:00:00.000000000 Z
11
+ date: 2022-07-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: CRMF is a Ruby C extension which provides correctly rounded math functions
14
14
  for Ruby floats, using MPFR and CRlibm. Provided rounding modes are toward zero,
@@ -23,7 +23,108 @@ files:
23
23
  - LICENSE
24
24
  - README.md
25
25
  - crmf.gemspec
26
- - ext/crlibm-1.0beta4.tar.gz
26
+ - ext/crlibm-1.0beta5/AUTHORS
27
+ - ext/crlibm-1.0beta5/CMakeLists.txt
28
+ - ext/crlibm-1.0beta5/COPYING
29
+ - ext/crlibm-1.0beta5/COPYING.LIB
30
+ - ext/crlibm-1.0beta5/ChangeLog
31
+ - ext/crlibm-1.0beta5/Makefile.am
32
+ - ext/crlibm-1.0beta5/NEWS
33
+ - ext/crlibm-1.0beta5/README
34
+ - ext/crlibm-1.0beta5/README.DEV
35
+ - ext/crlibm-1.0beta5/README.md
36
+ - ext/crlibm-1.0beta5/TODO
37
+ - ext/crlibm-1.0beta5/VERSION
38
+ - ext/crlibm-1.0beta5/acos-td.c
39
+ - ext/crlibm-1.0beta5/acos-td.h
40
+ - ext/crlibm-1.0beta5/asin-td.c
41
+ - ext/crlibm-1.0beta5/asin-td.h
42
+ - ext/crlibm-1.0beta5/asincos.c
43
+ - ext/crlibm-1.0beta5/asincos.h
44
+ - ext/crlibm-1.0beta5/atan-itanium.c
45
+ - ext/crlibm-1.0beta5/atan-pentium.c
46
+ - ext/crlibm-1.0beta5/atan-pentium.h
47
+ - ext/crlibm-1.0beta5/atan_accurate.c
48
+ - ext/crlibm-1.0beta5/atan_accurate.h
49
+ - ext/crlibm-1.0beta5/atan_fast.c
50
+ - ext/crlibm-1.0beta5/atan_fast.h
51
+ - ext/crlibm-1.0beta5/configure.ac
52
+ - ext/crlibm-1.0beta5/crlibm.h
53
+ - ext/crlibm-1.0beta5/crlibm.spec
54
+ - ext/crlibm-1.0beta5/crlibm_private.c
55
+ - ext/crlibm-1.0beta5/crlibm_private.h
56
+ - ext/crlibm-1.0beta5/csh_fast.c
57
+ - ext/crlibm-1.0beta5/csh_fast.h
58
+ - ext/crlibm-1.0beta5/double-extended.h
59
+ - ext/crlibm-1.0beta5/exp-itanium.c
60
+ - ext/crlibm-1.0beta5/exp-td-standalone.c
61
+ - ext/crlibm-1.0beta5/exp-td.c
62
+ - ext/crlibm-1.0beta5/exp-td.h
63
+ - ext/crlibm-1.0beta5/exp_build_coeffs/exp_fast_table.c
64
+ - ext/crlibm-1.0beta5/expm1-standalone.c
65
+ - ext/crlibm-1.0beta5/expm1.c
66
+ - ext/crlibm-1.0beta5/expm1.h
67
+ - ext/crlibm-1.0beta5/interval.h
68
+ - ext/crlibm-1.0beta5/log-de.c
69
+ - ext/crlibm-1.0beta5/log-de.h
70
+ - ext/crlibm-1.0beta5/log-de2.c
71
+ - ext/crlibm-1.0beta5/log-de2.h
72
+ - ext/crlibm-1.0beta5/log-td.c
73
+ - ext/crlibm-1.0beta5/log-td.h
74
+ - ext/crlibm-1.0beta5/log.c
75
+ - ext/crlibm-1.0beta5/log.h
76
+ - ext/crlibm-1.0beta5/log10-td.c
77
+ - ext/crlibm-1.0beta5/log10-td.h
78
+ - ext/crlibm-1.0beta5/log1p.c
79
+ - ext/crlibm-1.0beta5/log2-td.c
80
+ - ext/crlibm-1.0beta5/log2-td.h
81
+ - ext/crlibm-1.0beta5/log2_accurate.c
82
+ - ext/crlibm-1.0beta5/log2_accurate.h
83
+ - ext/crlibm-1.0beta5/log_accurate.c
84
+ - ext/crlibm-1.0beta5/log_accurate.h
85
+ - ext/crlibm-1.0beta5/log_fast.c
86
+ - ext/crlibm-1.0beta5/log_fast.h
87
+ - ext/crlibm-1.0beta5/pow.c
88
+ - ext/crlibm-1.0beta5/pow.h
89
+ - ext/crlibm-1.0beta5/prepare
90
+ - ext/crlibm-1.0beta5/rem_pio2_accurate.c
91
+ - ext/crlibm-1.0beta5/rem_pio2_accurate.h
92
+ - ext/crlibm-1.0beta5/scs_lib/AUTHORS
93
+ - ext/crlibm-1.0beta5/scs_lib/COPYING
94
+ - ext/crlibm-1.0beta5/scs_lib/ChangeLog
95
+ - ext/crlibm-1.0beta5/scs_lib/Doxyfile.dev
96
+ - ext/crlibm-1.0beta5/scs_lib/Doxyfile.user
97
+ - ext/crlibm-1.0beta5/scs_lib/INSTALL
98
+ - ext/crlibm-1.0beta5/scs_lib/Makefile.am
99
+ - ext/crlibm-1.0beta5/scs_lib/NEWS
100
+ - ext/crlibm-1.0beta5/scs_lib/README
101
+ - ext/crlibm-1.0beta5/scs_lib/README.DEV
102
+ - ext/crlibm-1.0beta5/scs_lib/TODO
103
+ - ext/crlibm-1.0beta5/scs_lib/VERSION
104
+ - ext/crlibm-1.0beta5/scs_lib/addition_scs.c
105
+ - ext/crlibm-1.0beta5/scs_lib/division_scs.c
106
+ - ext/crlibm-1.0beta5/scs_lib/double2scs.c
107
+ - ext/crlibm-1.0beta5/scs_lib/main.dox
108
+ - ext/crlibm-1.0beta5/scs_lib/multiplication_scs.c
109
+ - ext/crlibm-1.0beta5/scs_lib/poly_fct.c
110
+ - ext/crlibm-1.0beta5/scs_lib/print_scs.c
111
+ - ext/crlibm-1.0beta5/scs_lib/rand_scs.c
112
+ - ext/crlibm-1.0beta5/scs_lib/scs.h
113
+ - ext/crlibm-1.0beta5/scs_lib/scs2double.c
114
+ - ext/crlibm-1.0beta5/scs_lib/scs2mpf.c
115
+ - ext/crlibm-1.0beta5/scs_lib/scs2mpfr.c
116
+ - ext/crlibm-1.0beta5/scs_lib/scs_private.c
117
+ - ext/crlibm-1.0beta5/scs_lib/scs_private.h
118
+ - ext/crlibm-1.0beta5/scs_lib/wrapper_scs.h
119
+ - ext/crlibm-1.0beta5/scs_lib/zero_scs.c
120
+ - ext/crlibm-1.0beta5/trigo_accurate.c
121
+ - ext/crlibm-1.0beta5/trigo_accurate.h
122
+ - ext/crlibm-1.0beta5/trigo_fast.c
123
+ - ext/crlibm-1.0beta5/trigo_fast.h
124
+ - ext/crlibm-1.0beta5/trigpi.c
125
+ - ext/crlibm-1.0beta5/trigpi.h
126
+ - ext/crlibm-1.0beta5/triple-double.c
127
+ - ext/crlibm-1.0beta5/triple-double.h
27
128
  - ext/crmf/crmf.c
28
129
  - ext/crmf/crmf.h
29
130
  - ext/crmf/crmf.map
Binary file