PageRenderTime 50ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/jruby-1.7.3/test/externals/ruby1.9/bigdecimal/test_bigdecimal.rb

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Ruby | 1306 lines | 1143 code | 161 blank | 2 comment | 0 complexity | fda08952c6d0b951de84441f6e26fd21 MD5 | raw file
  1. require_relative "testbase"
  2. require_relative "../ruby/envutil"
  3. require 'thread'
  4. class TestBigDecimal < Test::Unit::TestCase
  5. include TestBigDecimalBase
  6. ROUNDING_MODE_MAP = [
  7. [ BigDecimal::ROUND_UP, :up],
  8. [ BigDecimal::ROUND_DOWN, :down],
  9. [ BigDecimal::ROUND_DOWN, :truncate],
  10. [ BigDecimal::ROUND_HALF_UP, :half_up],
  11. [ BigDecimal::ROUND_HALF_UP, :default],
  12. [ BigDecimal::ROUND_HALF_DOWN, :half_down],
  13. [ BigDecimal::ROUND_HALF_EVEN, :half_even],
  14. [ BigDecimal::ROUND_HALF_EVEN, :banker],
  15. [ BigDecimal::ROUND_CEILING, :ceiling],
  16. [ BigDecimal::ROUND_CEILING, :ceil],
  17. [ BigDecimal::ROUND_FLOOR, :floor],
  18. ]
  19. def assert_nan(x)
  20. assert(x.nan?, "Expected #{x.inspect} to be NaN")
  21. end
  22. def assert_positive_infinite(x)
  23. assert(x.infinite?, "Expected #{x.inspect} to be positive infinite")
  24. assert_operator(x, :>, 0)
  25. end
  26. def assert_negative_infinite(x)
  27. assert(x.infinite?, "Expected #{x.inspect} to be negative infinite")
  28. assert_operator(x, :<, 0)
  29. end
  30. def assert_positive_zero(x)
  31. assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, x.sign,
  32. "Expected #{x.inspect} to be positive zero")
  33. end
  34. def assert_negative_zero(x)
  35. assert_equal(BigDecimal::SIGN_NEGATIVE_ZERO, x.sign,
  36. "Expected #{x.inspect} to be negative zero")
  37. end
  38. def test_global_new
  39. assert_equal(1, BigDecimal("1"))
  40. assert_equal(1, BigDecimal("1", 1))
  41. assert_raise(ArgumentError) { BigDecimal("1", -1) }
  42. end
  43. def test_global_new_with_integer
  44. assert_equal(BigDecimal("1"), BigDecimal(1))
  45. assert_equal(BigDecimal("-1"), BigDecimal(-1))
  46. assert_equal(BigDecimal((2**100).to_s), BigDecimal(2**100))
  47. assert_equal(BigDecimal((-2**100).to_s), BigDecimal(-2**100))
  48. end
  49. def test_global_new_with_rational
  50. assert_equal(BigDecimal("0.333333333333333333333"), BigDecimal(1.quo(3), 21))
  51. assert_equal(BigDecimal("-0.333333333333333333333"), BigDecimal(-1.quo(3), 21))
  52. assert_raise(ArgumentError) { BigDecimal(1.quo(3)) }
  53. end
  54. def test_global_new_with_float
  55. assert_equal(BigDecimal("0.1235"), BigDecimal(0.1234567, 4))
  56. assert_equal(BigDecimal("-0.1235"), BigDecimal(-0.1234567, 4))
  57. assert_raise(ArgumentError) { BigDecimal(0.1) }
  58. assert_raise(ArgumentError) { BigDecimal(0.1, Float::DIG + 2) }
  59. assert_nothing_raised { BigDecimal(0.1, Float::DIG + 1) }
  60. end
  61. def test_global_new_with_big_decimal
  62. assert_equal(BigDecimal(1), BigDecimal(BigDecimal(1)))
  63. assert_equal(BigDecimal('+0'), BigDecimal(BigDecimal('+0')))
  64. assert_equal(BigDecimal('-0'), BigDecimal(BigDecimal('-0')))
  65. BigDecimal.save_exception_mode do
  66. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  67. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  68. assert_positive_infinite(BigDecimal(BigDecimal('Infinity')))
  69. assert_negative_infinite(BigDecimal(BigDecimal('-Infinity')))
  70. assert_nan(BigDecimal(BigDecimal('NaN')))
  71. end
  72. end
  73. def test_new
  74. assert_equal(1, BigDecimal.new("1"))
  75. assert_equal(1, BigDecimal.new("1", 1))
  76. assert_equal(1, BigDecimal.new(" 1 "))
  77. assert_equal(111, BigDecimal.new("1_1_1_"))
  78. assert_equal(0, BigDecimal.new("_1_1_1"))
  79. assert_equal(10**(-1), BigDecimal.new("1E-1"), '#4825')
  80. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  81. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  82. assert_equal( 1, BigDecimal.new("Infinity").infinite?)
  83. assert_equal(-1, BigDecimal.new("-Infinity").infinite?)
  84. assert_equal(true, BigDecimal.new("NaN").nan?)
  85. assert_equal( 1, BigDecimal.new("1E1111111111111111111").infinite?)
  86. end
  87. def test_new_with_integer
  88. assert_equal(BigDecimal("1"), BigDecimal.new(1))
  89. assert_equal(BigDecimal("-1"), BigDecimal.new(-1))
  90. assert_equal(BigDecimal((2**100).to_s), BigDecimal.new(2**100))
  91. assert_equal(BigDecimal((-2**100).to_s), BigDecimal.new(-2**100))
  92. end
  93. def test_new_with_rational
  94. assert_equal(BigDecimal("0.333333333333333333333"), BigDecimal.new(1.quo(3), 21))
  95. assert_equal(BigDecimal("-0.333333333333333333333"), BigDecimal.new(-1.quo(3), 21))
  96. assert_raise(ArgumentError) { BigDecimal.new(1.quo(3)) }
  97. end
  98. def test_new_with_float
  99. assert_equal(BigDecimal("0.1235"), BigDecimal(0.1234567, 4))
  100. assert_equal(BigDecimal("-0.1235"), BigDecimal(-0.1234567, 4))
  101. assert_raise(ArgumentError) { BigDecimal.new(0.1) }
  102. assert_raise(ArgumentError) { BigDecimal.new(0.1, Float::DIG + 2) }
  103. assert_nothing_raised { BigDecimal.new(0.1, Float::DIG + 1) }
  104. end
  105. def test_new_with_big_decimal
  106. assert_equal(BigDecimal(1), BigDecimal.new(BigDecimal(1)))
  107. assert_equal(BigDecimal('+0'), BigDecimal.new(BigDecimal('+0')))
  108. assert_equal(BigDecimal('-0'), BigDecimal.new(BigDecimal('-0')))
  109. BigDecimal.save_exception_mode do
  110. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  111. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  112. assert_positive_infinite(BigDecimal.new(BigDecimal('Infinity')))
  113. assert_negative_infinite(BigDecimal.new(BigDecimal('-Infinity')))
  114. assert_nan(BigDecimal(BigDecimal.new('NaN')))
  115. end
  116. end
  117. def _test_mode(type)
  118. BigDecimal.mode(type, true)
  119. assert_raise(FloatDomainError) { yield }
  120. BigDecimal.mode(type, false)
  121. assert_nothing_raised { yield }
  122. end
  123. def test_mode
  124. assert_raise(ArgumentError) { BigDecimal.mode(BigDecimal::EXCEPTION_ALL, 1) }
  125. assert_raise(ArgumentError) { BigDecimal.mode(BigDecimal::ROUND_MODE, 256) }
  126. assert_raise(ArgumentError) { BigDecimal.mode(BigDecimal::ROUND_MODE, :xyzzy) }
  127. assert_raise(TypeError) { BigDecimal.mode(0xf000, true) }
  128. begin
  129. saved_mode = BigDecimal.mode(BigDecimal::ROUND_MODE)
  130. [ BigDecimal::ROUND_UP,
  131. BigDecimal::ROUND_DOWN,
  132. BigDecimal::ROUND_HALF_UP,
  133. BigDecimal::ROUND_HALF_DOWN,
  134. BigDecimal::ROUND_CEILING,
  135. BigDecimal::ROUND_FLOOR,
  136. BigDecimal::ROUND_HALF_EVEN,
  137. ].each do |mode|
  138. BigDecimal.mode(BigDecimal::ROUND_MODE, mode)
  139. assert_equal(mode, BigDecimal.mode(BigDecimal::ROUND_MODE))
  140. end
  141. ensure
  142. BigDecimal.mode(BigDecimal::ROUND_MODE, saved_mode)
  143. end
  144. BigDecimal.save_rounding_mode do
  145. ROUNDING_MODE_MAP.each do |const, sym|
  146. BigDecimal.mode(BigDecimal::ROUND_MODE, sym)
  147. assert_equal(const, BigDecimal.mode(BigDecimal::ROUND_MODE))
  148. end
  149. end
  150. end
  151. def test_thread_local_mode
  152. begin
  153. saved_mode = BigDecimal.mode(BigDecimal::ROUND_MODE)
  154. BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_UP)
  155. Thread.start {
  156. BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_HALF_EVEN)
  157. assert_equal(BigDecimal::ROUND_HALF_EVEN, BigDecimal.mode(BigDecimal::ROUND_MODE))
  158. }.join
  159. assert_equal(BigDecimal::ROUND_UP, BigDecimal.mode(BigDecimal::ROUND_MODE))
  160. ensure
  161. BigDecimal.mode(BigDecimal::ROUND_MODE, saved_mode)
  162. end
  163. end
  164. def test_save_exception_mode
  165. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  166. mode = BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW)
  167. BigDecimal.save_exception_mode do
  168. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, true)
  169. end
  170. assert_equal(mode, BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW))
  171. BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_FLOOR)
  172. BigDecimal.save_exception_mode do
  173. BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_HALF_EVEN)
  174. end
  175. assert_equal(BigDecimal::ROUND_HALF_EVEN, BigDecimal.mode(BigDecimal::ROUND_MODE))
  176. assert_equal(42, BigDecimal.save_exception_mode { 42 })
  177. end
  178. def test_save_rounding_mode
  179. BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_FLOOR)
  180. BigDecimal.save_rounding_mode do
  181. BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_HALF_EVEN)
  182. end
  183. assert_equal(BigDecimal::ROUND_FLOOR, BigDecimal.mode(BigDecimal::ROUND_MODE))
  184. assert_equal(42, BigDecimal.save_rounding_mode { 42 })
  185. end
  186. def test_save_limit
  187. begin
  188. old = BigDecimal.limit
  189. BigDecimal.limit(100)
  190. BigDecimal.save_limit do
  191. BigDecimal.limit(200)
  192. end
  193. assert_equal(100, BigDecimal.limit);
  194. ensure
  195. BigDecimal.limit(old)
  196. end
  197. assert_equal(42, BigDecimal.save_limit { 42 })
  198. end
  199. def test_exception_nan
  200. _test_mode(BigDecimal::EXCEPTION_NaN) { BigDecimal.new("NaN") }
  201. end
  202. def test_exception_infinity
  203. _test_mode(BigDecimal::EXCEPTION_INFINITY) { BigDecimal.new("Infinity") }
  204. end
  205. def test_exception_underflow
  206. _test_mode(BigDecimal::EXCEPTION_UNDERFLOW) do
  207. x = BigDecimal.new("0.1")
  208. 100.times do
  209. x *= x
  210. end
  211. end
  212. end
  213. def test_exception_overflow
  214. _test_mode(BigDecimal::EXCEPTION_OVERFLOW) do
  215. x = BigDecimal.new("10")
  216. 100.times do
  217. x *= x
  218. end
  219. end
  220. end
  221. def test_exception_zerodivide
  222. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  223. _test_mode(BigDecimal::EXCEPTION_ZERODIVIDE) { 1 / BigDecimal.new("0") }
  224. _test_mode(BigDecimal::EXCEPTION_ZERODIVIDE) { -1 / BigDecimal.new("0") }
  225. end
  226. def test_round_up
  227. n4 = BigDecimal.new("4") # n4 / 9 = 0.44444...
  228. n5 = BigDecimal.new("5") # n5 / 9 = 0.55555...
  229. n6 = BigDecimal.new("6") # n6 / 9 = 0.66666...
  230. m4, m5, m6 = -n4, -n5, -n6
  231. n2h = BigDecimal.new("2.5")
  232. n3h = BigDecimal.new("3.5")
  233. m2h, m3h = -n2h, -n3h
  234. BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_UP)
  235. assert_operator(n4, :<, n4 / 9 * 9)
  236. assert_operator(n5, :<, n5 / 9 * 9)
  237. assert_operator(n6, :<, n6 / 9 * 9)
  238. assert_operator(m4, :>, m4 / 9 * 9)
  239. assert_operator(m5, :>, m5 / 9 * 9)
  240. assert_operator(m6, :>, m6 / 9 * 9)
  241. assert_equal(3, n2h.round)
  242. assert_equal(4, n3h.round)
  243. assert_equal(-3, m2h.round)
  244. assert_equal(-4, m3h.round)
  245. BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_DOWN)
  246. assert_operator(n4, :>, n4 / 9 * 9)
  247. assert_operator(n5, :>, n5 / 9 * 9)
  248. assert_operator(n6, :>, n6 / 9 * 9)
  249. assert_operator(m4, :<, m4 / 9 * 9)
  250. assert_operator(m5, :<, m5 / 9 * 9)
  251. assert_operator(m6, :<, m6 / 9 * 9)
  252. assert_equal(2, n2h.round)
  253. assert_equal(3, n3h.round)
  254. assert_equal(-2, m2h.round)
  255. assert_equal(-3, m3h.round)
  256. BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_HALF_UP)
  257. assert_operator(n4, :>, n4 / 9 * 9)
  258. assert_operator(n5, :<, n5 / 9 * 9)
  259. assert_operator(n6, :<, n6 / 9 * 9)
  260. assert_operator(m4, :<, m4 / 9 * 9)
  261. assert_operator(m5, :>, m5 / 9 * 9)
  262. assert_operator(m6, :>, m6 / 9 * 9)
  263. assert_equal(3, n2h.round)
  264. assert_equal(4, n3h.round)
  265. assert_equal(-3, m2h.round)
  266. assert_equal(-4, m3h.round)
  267. BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_HALF_DOWN)
  268. assert_operator(n4, :>, n4 / 9 * 9)
  269. assert_operator(n5, :>, n5 / 9 * 9)
  270. assert_operator(n6, :<, n6 / 9 * 9)
  271. assert_operator(m4, :<, m4 / 9 * 9)
  272. assert_operator(m5, :<, m5 / 9 * 9)
  273. assert_operator(m6, :>, m6 / 9 * 9)
  274. assert_equal(2, n2h.round)
  275. assert_equal(3, n3h.round)
  276. assert_equal(-2, m2h.round)
  277. assert_equal(-3, m3h.round)
  278. BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_HALF_EVEN)
  279. assert_operator(n4, :>, n4 / 9 * 9)
  280. assert_operator(n5, :<, n5 / 9 * 9)
  281. assert_operator(n6, :<, n6 / 9 * 9)
  282. assert_operator(m4, :<, m4 / 9 * 9)
  283. assert_operator(m5, :>, m5 / 9 * 9)
  284. assert_operator(m6, :>, m6 / 9 * 9)
  285. assert_equal(2, n2h.round)
  286. assert_equal(4, n3h.round)
  287. assert_equal(-2, m2h.round)
  288. assert_equal(-4, m3h.round)
  289. BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_CEILING)
  290. assert_operator(n4, :<, n4 / 9 * 9)
  291. assert_operator(n5, :<, n5 / 9 * 9)
  292. assert_operator(n6, :<, n6 / 9 * 9)
  293. assert_operator(m4, :<, m4 / 9 * 9)
  294. assert_operator(m5, :<, m5 / 9 * 9)
  295. assert_operator(m6, :<, m6 / 9 * 9)
  296. assert_equal(3, n2h.round)
  297. assert_equal(4, n3h.round)
  298. assert_equal(-2, m2h.round)
  299. assert_equal(-3, m3h.round)
  300. BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_FLOOR)
  301. assert_operator(n4, :>, n4 / 9 * 9)
  302. assert_operator(n5, :>, n5 / 9 * 9)
  303. assert_operator(n6, :>, n6 / 9 * 9)
  304. assert_operator(m4, :>, m4 / 9 * 9)
  305. assert_operator(m5, :>, m5 / 9 * 9)
  306. assert_operator(m6, :>, m6 / 9 * 9)
  307. assert_equal(2, n2h.round)
  308. assert_equal(3, n3h.round)
  309. assert_equal(-3, m2h.round)
  310. assert_equal(-4, m3h.round)
  311. end
  312. def test_zero_p
  313. assert_equal(true, BigDecimal.new("0").zero?)
  314. assert_equal(false, BigDecimal.new("1").zero?)
  315. assert_equal(true, BigDecimal.new("0E200000000000000").zero?)
  316. end
  317. def test_nonzero_p
  318. assert_equal(nil, BigDecimal.new("0").nonzero?)
  319. assert_equal(BigDecimal.new("1"), BigDecimal.new("1").nonzero?)
  320. end
  321. def test_double_fig
  322. assert_kind_of(Integer, BigDecimal.double_fig)
  323. end
  324. def test_cmp
  325. n1 = BigDecimal.new("1")
  326. n2 = BigDecimal.new("2")
  327. assert_equal( 0, n1 <=> n1)
  328. assert_equal( 1, n2 <=> n1)
  329. assert_equal(-1, n1 <=> n2)
  330. assert_operator(n1, :==, n1)
  331. assert_operator(n1, :!=, n2)
  332. assert_operator(n1, :<, n2)
  333. assert_operator(n1, :<=, n1)
  334. assert_operator(n1, :<=, n2)
  335. assert_operator(n2, :>, n1)
  336. assert_operator(n2, :>=, n1)
  337. assert_operator(n1, :>=, n1)
  338. assert_operator(BigDecimal.new("-0"), :==, BigDecimal.new("0"))
  339. assert_operator(BigDecimal.new("0"), :<, BigDecimal.new("1"))
  340. assert_operator(BigDecimal.new("1"), :>, BigDecimal.new("0"))
  341. assert_operator(BigDecimal.new("1"), :>, BigDecimal.new("-1"))
  342. assert_operator(BigDecimal.new("-1"), :<, BigDecimal.new("1"))
  343. assert_operator(BigDecimal.new((2**100).to_s), :>, BigDecimal.new("1"))
  344. assert_operator(BigDecimal.new("1"), :<, BigDecimal.new((2**100).to_s))
  345. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  346. inf = BigDecimal.new("Infinity")
  347. assert_operator(inf, :>, 1)
  348. assert_operator(1, :<, inf)
  349. assert_operator(BigDecimal("1E-1"), :==, 10**(-1), '#4825')
  350. assert_equal(0, BigDecimal("1E-1") <=> 10**(-1), '#4825')
  351. end
  352. def test_cmp_nan
  353. n1 = BigDecimal.new("1")
  354. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  355. assert_equal(nil, BigDecimal.new("NaN") <=> n1)
  356. assert_equal(false, BigDecimal.new("NaN") > n1)
  357. end
  358. def test_cmp_failing_coercion
  359. n1 = BigDecimal.new("1")
  360. assert_equal(nil, n1 <=> nil)
  361. assert_raise(ArgumentError){n1 > nil}
  362. end
  363. def test_cmp_coerce
  364. n1 = BigDecimal.new("1")
  365. n2 = BigDecimal.new("2")
  366. o1 = Object.new; def o1.coerce(x); [x, BigDecimal.new("1")]; end
  367. o2 = Object.new; def o2.coerce(x); [x, BigDecimal.new("2")]; end
  368. assert_equal( 0, n1 <=> o1)
  369. assert_equal( 1, n2 <=> o1)
  370. assert_equal(-1, n1 <=> o2)
  371. assert_operator(n1, :==, o1)
  372. assert_operator(n1, :!=, o2)
  373. assert_operator(n1, :<, o2)
  374. assert_operator(n1, :<=, o1)
  375. assert_operator(n1, :<=, o2)
  376. assert_operator(n2, :>, o1)
  377. assert_operator(n2, :>=, o1)
  378. assert_operator(n1, :>=, 1)
  379. end
  380. def test_cmp_bignum
  381. assert_operator(BigDecimal.new((2**100).to_s), :==, 2**100)
  382. end
  383. def test_cmp_data
  384. d = Time.now; def d.coerce(x); [x, x]; end
  385. assert_operator(BigDecimal.new((2**100).to_s), :==, d)
  386. end
  387. def test_precs
  388. a = BigDecimal.new("1").precs
  389. assert_instance_of(Array, a)
  390. assert_equal(2, a.size)
  391. assert_kind_of(Integer, a[0])
  392. assert_kind_of(Integer, a[1])
  393. end
  394. def test_hash
  395. a = []
  396. b = BigDecimal.new("1")
  397. 10.times { a << b *= 10 }
  398. h = {}
  399. a.each_with_index {|x, i| h[x] = i }
  400. a.each_with_index do |x, i|
  401. assert_equal(i, h[x])
  402. end
  403. end
  404. def test_marshal
  405. s = Marshal.dump(BigDecimal("1", 1))
  406. assert_equal(BigDecimal("1", 1), Marshal.load(s))
  407. # corrupt data
  408. s = s.gsub(/BigDecimal.*\z/m) {|x| x.gsub(/\d/m, "-") }
  409. assert_raise(TypeError) { Marshal.load(s) }
  410. end
  411. def test_finite_infinite_nan
  412. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  413. BigDecimal.mode(BigDecimal::EXCEPTION_ZERODIVIDE, false)
  414. x = BigDecimal.new("0")
  415. assert_equal(true, x.finite?)
  416. assert_equal(nil, x.infinite?)
  417. assert_equal(false, x.nan?)
  418. y = 1 / x
  419. assert_equal(false, y.finite?)
  420. assert_equal(1, y.infinite?)
  421. assert_equal(false, y.nan?)
  422. y = -1 / x
  423. assert_equal(false, y.finite?)
  424. assert_equal(-1, y.infinite?)
  425. assert_equal(false, y.nan?)
  426. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  427. y = 0 / x
  428. assert_equal(false, y.finite?)
  429. assert_equal(nil, y.infinite?)
  430. assert_equal(true, y.nan?)
  431. end
  432. def test_to_i
  433. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  434. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  435. x = BigDecimal.new("0")
  436. assert_kind_of(Integer, x.to_i)
  437. assert_equal(0, x.to_i)
  438. assert_raise(FloatDomainError){( 1 / x).to_i}
  439. assert_raise(FloatDomainError){(-1 / x).to_i}
  440. assert_raise(FloatDomainError) {( 0 / x).to_i}
  441. x = BigDecimal.new("1")
  442. assert_equal(1, x.to_i)
  443. x = BigDecimal.new((2**100).to_s)
  444. assert_equal(2**100, x.to_i)
  445. end
  446. def test_to_f
  447. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  448. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  449. BigDecimal.mode(BigDecimal::EXCEPTION_ZERODIVIDE, false)
  450. x = BigDecimal.new("0")
  451. assert_instance_of(Float, x.to_f)
  452. assert_equal(0.0, x.to_f)
  453. assert_equal( 1.0 / 0.0, ( 1 / x).to_f)
  454. assert_equal(-1.0 / 0.0, (-1 / x).to_f)
  455. assert_equal(true, ( 0 / x).to_f.nan?)
  456. x = BigDecimal.new("1")
  457. assert_equal(1.0, x.to_f)
  458. x = BigDecimal.new((2**100).to_s)
  459. assert_equal((2**100).to_f, x.to_f)
  460. x = BigDecimal.new("1" + "0" * 10000)
  461. assert_equal(0, BigDecimal.new("-0").to_f)
  462. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, true)
  463. assert_raise(FloatDomainError) { x.to_f }
  464. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  465. assert_kind_of(Float, x .to_f)
  466. assert_kind_of(Float, (-x).to_f)
  467. BigDecimal.mode(BigDecimal::EXCEPTION_UNDERFLOW, true)
  468. assert_raise(FloatDomainError) {
  469. BigDecimal("1e#{Float::MIN_10_EXP - 2*Float::DIG}").to_f }
  470. assert_raise(FloatDomainError) {
  471. BigDecimal("-1e#{Float::MIN_10_EXP - 2*Float::DIG}").to_f }
  472. BigDecimal.mode(BigDecimal::EXCEPTION_UNDERFLOW, false)
  473. assert_equal( 0.0, BigDecimal("1e#{Float::MIN_10_EXP - 2*Float::DIG}").to_f)
  474. assert_equal(-0.0, BigDecimal("-1e#{Float::MIN_10_EXP - 2*Float::DIG}").to_f)
  475. end
  476. def test_coerce
  477. a, b = BigDecimal.new("1").coerce(1.0)
  478. assert_instance_of(Float, a)
  479. assert_instance_of(Float, b)
  480. assert_equal(2, 1 + BigDecimal.new("1"), '[ruby-core:25697]')
  481. a, b = BigDecimal("1").coerce(1.quo(10))
  482. assert_equal(BigDecimal("0.1"), a, '[ruby-core:34318]')
  483. a, b = BigDecimal("0.11111").coerce(1.quo(3))
  484. assert_equal(BigDecimal("0." + "3"*a.precs[0]), a)
  485. end
  486. def test_uplus
  487. x = BigDecimal.new("1")
  488. assert_equal(x, x.send(:+@))
  489. end
  490. def test_add
  491. x = BigDecimal.new("1")
  492. assert_equal(BigDecimal.new("2"), x + x)
  493. assert_equal(1, BigDecimal.new("0") + 1)
  494. assert_equal(1, x + 0)
  495. assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, (BigDecimal.new("0") + 0).sign)
  496. assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, (BigDecimal.new("-0") + 0).sign)
  497. assert_equal(BigDecimal::SIGN_NEGATIVE_ZERO, (BigDecimal.new("-0") + BigDecimal.new("-0")).sign)
  498. x = BigDecimal.new((2**100).to_s)
  499. assert_equal(BigDecimal.new((2**100+1).to_s), x + 1)
  500. end
  501. def test_sub
  502. x = BigDecimal.new("1")
  503. assert_equal(BigDecimal.new("0"), x - x)
  504. assert_equal(-1, BigDecimal.new("0") - 1)
  505. assert_equal(1, x - 0)
  506. assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, (BigDecimal.new("0") - 0).sign)
  507. assert_equal(BigDecimal::SIGN_NEGATIVE_ZERO, (BigDecimal.new("-0") - 0).sign)
  508. assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, (BigDecimal.new("-0") - BigDecimal.new("-0")).sign)
  509. x = BigDecimal.new((2**100).to_s)
  510. assert_equal(BigDecimal.new((2**100-1).to_s), x - 1)
  511. end
  512. def test_mult
  513. x = BigDecimal.new((2**100).to_s)
  514. assert_equal(BigDecimal.new((2**100 * 3).to_s), (x * 3).to_i)
  515. assert_equal(x, (x * 1).to_i)
  516. assert_equal(x, (BigDecimal("1") * x).to_i)
  517. assert_equal(BigDecimal.new((2**200).to_s), (x * x).to_i)
  518. end
  519. def test_div
  520. x = BigDecimal.new((2**100).to_s)
  521. assert_equal(BigDecimal.new((2**100 / 3).to_s), (x / 3).to_i)
  522. assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, (BigDecimal.new("0") / 1).sign)
  523. assert_equal(BigDecimal::SIGN_NEGATIVE_ZERO, (BigDecimal.new("-0") / 1).sign)
  524. assert_equal(2, BigDecimal.new("2") / 1)
  525. assert_equal(-2, BigDecimal.new("2") / -1)
  526. end
  527. def test_mod
  528. x = BigDecimal.new((2**100).to_s)
  529. assert_equal(1, x % 3)
  530. assert_equal(2, (-x) % 3)
  531. assert_equal(-2, x % -3)
  532. assert_equal(-1, (-x) % -3)
  533. end
  534. def test_remainder
  535. x = BigDecimal.new((2**100).to_s)
  536. assert_equal(1, x.remainder(3))
  537. assert_equal(-1, (-x).remainder(3))
  538. assert_equal(1, x.remainder(-3))
  539. assert_equal(-1, (-x).remainder(-3))
  540. end
  541. def test_divmod
  542. x = BigDecimal.new((2**100).to_s)
  543. assert_equal([(x / 3).floor, 1], x.divmod(3))
  544. assert_equal([(-x / 3).floor, 2], (-x).divmod(3))
  545. assert_equal([0, 0], BigDecimal.new("0").divmod(2))
  546. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  547. assert_raise(ZeroDivisionError){BigDecimal.new("0").divmod(0)}
  548. end
  549. def test_add_bigdecimal
  550. x = BigDecimal.new((2**100).to_s)
  551. assert_equal(3000000000000000000000000000000, x.add(x, 1))
  552. assert_equal(2500000000000000000000000000000, x.add(x, 2))
  553. assert_equal(2540000000000000000000000000000, x.add(x, 3))
  554. end
  555. def test_sub_bigdecimal
  556. x = BigDecimal.new((2**100).to_s)
  557. assert_equal(1000000000000000000000000000000, x.sub(1, 1))
  558. assert_equal(1300000000000000000000000000000, x.sub(1, 2))
  559. assert_equal(1270000000000000000000000000000, x.sub(1, 3))
  560. end
  561. def test_mult_bigdecimal
  562. x = BigDecimal.new((2**100).to_s)
  563. assert_equal(4000000000000000000000000000000, x.mult(3, 1))
  564. assert_equal(3800000000000000000000000000000, x.mult(3, 2))
  565. assert_equal(3800000000000000000000000000000, x.mult(3, 3))
  566. end
  567. def test_div_bigdecimal
  568. x = BigDecimal.new((2**100).to_s)
  569. assert_equal(422550200076076467165567735125, x.div(3))
  570. assert_equal(400000000000000000000000000000, x.div(3, 1))
  571. assert_equal(420000000000000000000000000000, x.div(3, 2))
  572. assert_equal(423000000000000000000000000000, x.div(3, 3))
  573. end
  574. def test_abs_bigdecimal
  575. x = BigDecimal.new((2**100).to_s)
  576. assert_equal(1267650600228229401496703205376, x.abs)
  577. x = BigDecimal.new("-" + (2**100).to_s)
  578. assert_equal(1267650600228229401496703205376, x.abs)
  579. x = BigDecimal.new("0")
  580. assert_equal(0, x.abs)
  581. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  582. x = BigDecimal.new("NaN")
  583. assert_equal(true, x.abs.nan?)
  584. end
  585. def test_sqrt_bigdecimal
  586. x = BigDecimal.new("0.09")
  587. assert_in_delta(0.3, x.sqrt(1), 0.001)
  588. x = BigDecimal.new((2**100).to_s)
  589. y = BigDecimal("1125899906842624")
  590. e = y.exponent
  591. assert_equal(true, (x.sqrt(100) - y).abs < BigDecimal("1E#{e-100}"))
  592. assert_equal(true, (x.sqrt(200) - y).abs < BigDecimal("1E#{e-200}"))
  593. assert_equal(true, (x.sqrt(300) - y).abs < BigDecimal("1E#{e-300}"))
  594. x = BigDecimal.new("-" + (2**100).to_s)
  595. assert_raise(FloatDomainError) { x.sqrt(1) }
  596. x = BigDecimal.new((2**200).to_s)
  597. assert_equal(2**100, x.sqrt(1))
  598. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  599. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  600. assert_raise(FloatDomainError) { BigDecimal.new("NaN").sqrt(1) }
  601. assert_equal(0, BigDecimal.new("0").sqrt(1))
  602. assert_equal(1, BigDecimal.new("1").sqrt(1))
  603. end
  604. def test_fix
  605. x = BigDecimal.new("1.1")
  606. assert_equal(1, x.fix)
  607. end
  608. def test_frac
  609. x = BigDecimal.new("1.1")
  610. assert_equal(0.1, x.frac)
  611. assert_equal(0.1, BigDecimal.new("0.1").frac)
  612. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  613. assert_equal(true, BigDecimal.new("NaN").frac.nan?)
  614. end
  615. def test_round
  616. assert_equal(3, BigDecimal.new("3.14159").round)
  617. assert_equal(9, BigDecimal.new("8.7").round)
  618. assert_equal(3.142, BigDecimal.new("3.14159").round(3))
  619. assert_equal(13300.0, BigDecimal.new("13345.234").round(-2))
  620. x = BigDecimal.new("111.111")
  621. assert_equal(111 , x.round)
  622. assert_equal(111.1 , x.round(1))
  623. assert_equal(111.11 , x.round(2))
  624. assert_equal(111.111, x.round(3))
  625. assert_equal(111.111, x.round(4))
  626. assert_equal(110 , x.round(-1))
  627. assert_equal(100 , x.round(-2))
  628. assert_equal( 0 , x.round(-3))
  629. assert_equal( 0 , x.round(-4))
  630. x = BigDecimal.new("2.5")
  631. assert_equal(3, x.round(0, BigDecimal::ROUND_UP))
  632. assert_equal(2, x.round(0, BigDecimal::ROUND_DOWN))
  633. assert_equal(3, x.round(0, BigDecimal::ROUND_HALF_UP))
  634. assert_equal(2, x.round(0, BigDecimal::ROUND_HALF_DOWN))
  635. assert_equal(2, x.round(0, BigDecimal::ROUND_HALF_EVEN))
  636. assert_equal(3, x.round(0, BigDecimal::ROUND_CEILING))
  637. assert_equal(2, x.round(0, BigDecimal::ROUND_FLOOR))
  638. assert_raise(ArgumentError) { x.round(0, 256) }
  639. ROUNDING_MODE_MAP.each do |const, sym|
  640. assert_equal(x.round(0, const), x.round(0, sym))
  641. end
  642. bug3803 = '[ruby-core:32136]'
  643. 15.times do |n|
  644. x = BigDecimal.new("5#{'0'*n}1")
  645. assert_equal(10**(n+2), x.round(-(n+2), BigDecimal::ROUND_HALF_DOWN), bug3803)
  646. assert_equal(10**(n+2), x.round(-(n+2), BigDecimal::ROUND_HALF_EVEN), bug3803)
  647. x = BigDecimal.new("0.5#{'0'*n}1")
  648. assert_equal(1, x.round(0, BigDecimal::ROUND_HALF_DOWN), bug3803)
  649. assert_equal(1, x.round(0, BigDecimal::ROUND_HALF_EVEN), bug3803)
  650. x = BigDecimal.new("-0.5#{'0'*n}1")
  651. assert_equal(-1, x.round(0, BigDecimal::ROUND_HALF_DOWN), bug3803)
  652. assert_equal(-1, x.round(0, BigDecimal::ROUND_HALF_EVEN), bug3803)
  653. end
  654. end
  655. def test_truncate
  656. assert_equal(3, BigDecimal.new("3.14159").truncate)
  657. assert_equal(8, BigDecimal.new("8.7").truncate)
  658. assert_equal(3.141, BigDecimal.new("3.14159").truncate(3))
  659. assert_equal(13300.0, BigDecimal.new("13345.234").truncate(-2))
  660. end
  661. def test_floor
  662. assert_equal(3, BigDecimal.new("3.14159").floor)
  663. assert_equal(-10, BigDecimal.new("-9.1").floor)
  664. assert_equal(3.141, BigDecimal.new("3.14159").floor(3))
  665. assert_equal(13300.0, BigDecimal.new("13345.234").floor(-2))
  666. end
  667. def test_ceil
  668. assert_equal(4, BigDecimal.new("3.14159").ceil)
  669. assert_equal(-9, BigDecimal.new("-9.1").ceil)
  670. assert_equal(3.142, BigDecimal.new("3.14159").ceil(3))
  671. assert_equal(13400.0, BigDecimal.new("13345.234").ceil(-2))
  672. end
  673. def test_to_s
  674. assert_equal('-123.45678 90123 45678 9', BigDecimal.new('-123.45678901234567890').to_s('5F'))
  675. assert_equal('+123.45678901 23456789', BigDecimal.new('123.45678901234567890').to_s('+8F'))
  676. assert_equal(' 123.4567890123456789', BigDecimal.new('123.45678901234567890').to_s(' F'))
  677. assert_equal('0.1234567890123456789E3', BigDecimal.new('123.45678901234567890').to_s)
  678. assert_equal('0.12345 67890 12345 6789E3', BigDecimal.new('123.45678901234567890').to_s(5))
  679. end
  680. def test_split
  681. x = BigDecimal.new('-123.45678901234567890')
  682. assert_equal([-1, "1234567890123456789", 10, 3], x.split)
  683. assert_equal([1, "0", 10, 0], BigDecimal.new("0").split)
  684. assert_equal([-1, "0", 10, 0], BigDecimal.new("-0").split)
  685. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  686. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  687. assert_equal([0, "NaN", 10, 0], BigDecimal.new("NaN").split)
  688. assert_equal([1, "Infinity", 10, 0], BigDecimal.new("Infinity").split)
  689. assert_equal([-1, "Infinity", 10, 0], BigDecimal.new("-Infinity").split)
  690. end
  691. def test_exponent
  692. x = BigDecimal.new('-123.45678901234567890')
  693. assert_equal(3, x.exponent)
  694. end
  695. def test_inspect
  696. x = BigDecimal.new("1234.5678")
  697. prec, maxprec = x.precs
  698. assert_match(/^#<BigDecimal:[0-9a-f]+,'0.12345678E4',#{prec}\(#{maxprec}\)>$/, x.inspect)
  699. end
  700. def test_power_with_nil
  701. assert_raise(TypeError) do
  702. BigDecimal(3) ** nil
  703. end
  704. end
  705. def test_power_of_nan
  706. BigDecimal.save_exception_mode do
  707. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  708. assert_nan(BigDecimal::NAN ** 0)
  709. assert_nan(BigDecimal::NAN ** 1)
  710. assert_nan(BigDecimal::NAN ** 42)
  711. assert_nan(BigDecimal::NAN ** -42)
  712. assert_nan(BigDecimal::NAN ** 42.0)
  713. assert_nan(BigDecimal::NAN ** -42.0)
  714. assert_nan(BigDecimal::NAN ** BigDecimal(42))
  715. assert_nan(BigDecimal::NAN ** BigDecimal(-42))
  716. assert_nan(BigDecimal::NAN ** BigDecimal::INFINITY)
  717. BigDecimal.save_exception_mode do
  718. BigDecimal.mode(BigDecimal::EXCEPTION_INFINITY, false)
  719. assert_nan(BigDecimal::NAN ** (-BigDecimal::INFINITY))
  720. end
  721. end
  722. end
  723. def test_power_with_Bignum
  724. BigDecimal.save_exception_mode do
  725. BigDecimal.mode(BigDecimal::EXCEPTION_INFINITY, false)
  726. assert_equal(0, BigDecimal(0) ** (2**100))
  727. assert_positive_infinite(BigDecimal(0) ** -(2**100))
  728. assert_positive_infinite((-BigDecimal(0)) ** -(2**100))
  729. assert_negative_infinite((-BigDecimal(0)) ** -(2**100 + 1))
  730. assert_equal(1, BigDecimal(1) ** (2**100))
  731. assert_positive_infinite(BigDecimal(3) ** (2**100))
  732. assert_positive_zero(BigDecimal(3) ** (-2**100))
  733. assert_negative_infinite(BigDecimal(-3) ** (2**100))
  734. assert_positive_infinite(BigDecimal(-3) ** (2**100 + 1))
  735. assert_negative_zero(BigDecimal(-3) ** (-2**100))
  736. assert_positive_zero(BigDecimal(-3) ** (-2**100 - 1))
  737. assert_positive_zero(BigDecimal(0.5, Float::DIG) ** (2**100))
  738. assert_positive_infinite(BigDecimal(0.5, Float::DIG) ** (-2**100))
  739. assert_negative_zero(BigDecimal(-0.5, Float::DIG) ** (2**100))
  740. assert_positive_zero(BigDecimal(-0.5, Float::DIG) ** (2**100 - 1))
  741. assert_negative_infinite(BigDecimal(-0.5, Float::DIG) ** (-2**100))
  742. assert_positive_infinite(BigDecimal(-0.5, Float::DIG) ** (-2**100 - 1))
  743. end
  744. end
  745. def test_power_with_BigDecimal
  746. assert_nothing_raised do
  747. assert_in_delta(3 ** 3, BigDecimal(3) ** BigDecimal(3))
  748. end
  749. end
  750. def test_power_of_finite_with_zero
  751. x = BigDecimal(1)
  752. assert_equal(1, x ** 0)
  753. assert_equal(1, x ** 0.quo(1))
  754. assert_equal(1, x ** 0.0)
  755. assert_equal(1, x ** BigDecimal(0))
  756. x = BigDecimal(42)
  757. assert_equal(1, x ** 0)
  758. assert_equal(1, x ** 0.quo(1))
  759. assert_equal(1, x ** 0.0)
  760. assert_equal(1, x ** BigDecimal(0))
  761. x = BigDecimal(-42)
  762. assert_equal(1, x ** 0)
  763. assert_equal(1, x ** 0.quo(1))
  764. assert_equal(1, x ** 0.0)
  765. assert_equal(1, x ** BigDecimal(0))
  766. end
  767. def test_power_of_three
  768. x = BigDecimal(3)
  769. assert_equal(81, x ** 4)
  770. assert_equal(1.quo(81), x ** -4)
  771. assert_in_delta(1.0/81, x ** -4)
  772. end
  773. def test_power_of_zero
  774. zero = BigDecimal(0)
  775. assert_equal(0, zero ** 4)
  776. assert_equal(0, zero ** 4.quo(1))
  777. assert_equal(0, zero ** 4.0)
  778. assert_equal(0, zero ** BigDecimal(4))
  779. assert_equal(1, zero ** 0)
  780. assert_equal(1, zero ** 0.quo(1))
  781. assert_equal(1, zero ** 0.0)
  782. assert_equal(1, zero ** BigDecimal(0))
  783. BigDecimal.save_exception_mode do
  784. BigDecimal.mode(BigDecimal::EXCEPTION_INFINITY, false)
  785. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  786. assert_positive_infinite(zero ** -1)
  787. assert_positive_infinite(zero ** -1.quo(1))
  788. assert_positive_infinite(zero ** -1.0)
  789. assert_positive_infinite(zero ** BigDecimal(-1))
  790. m_zero = BigDecimal("-0")
  791. assert_negative_infinite(m_zero ** -1)
  792. assert_negative_infinite(m_zero ** -1.quo(1))
  793. assert_negative_infinite(m_zero ** -1.0)
  794. assert_negative_infinite(m_zero ** BigDecimal(-1))
  795. assert_positive_infinite(m_zero ** -2)
  796. assert_positive_infinite(m_zero ** -2.quo(1))
  797. assert_positive_infinite(m_zero ** -2.0)
  798. assert_positive_infinite(m_zero ** BigDecimal(-2))
  799. end
  800. end
  801. def test_power_of_positive_infinity
  802. BigDecimal.save_exception_mode do
  803. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  804. assert_positive_infinite(BigDecimal::INFINITY ** 3)
  805. assert_positive_infinite(BigDecimal::INFINITY ** 3.quo(1))
  806. assert_positive_infinite(BigDecimal::INFINITY ** 3.0)
  807. assert_positive_infinite(BigDecimal::INFINITY ** BigDecimal(3))
  808. assert_positive_infinite(BigDecimal::INFINITY ** 2)
  809. assert_positive_infinite(BigDecimal::INFINITY ** 2.quo(1))
  810. assert_positive_infinite(BigDecimal::INFINITY ** 2.0)
  811. assert_positive_infinite(BigDecimal::INFINITY ** BigDecimal(2))
  812. assert_positive_infinite(BigDecimal::INFINITY ** 1)
  813. assert_positive_infinite(BigDecimal::INFINITY ** 1.quo(1))
  814. assert_positive_infinite(BigDecimal::INFINITY ** 1.0)
  815. assert_positive_infinite(BigDecimal::INFINITY ** BigDecimal(1))
  816. assert_equal(1, BigDecimal::INFINITY ** 0)
  817. assert_equal(1, BigDecimal::INFINITY ** 0.quo(1))
  818. assert_equal(1, BigDecimal::INFINITY ** 0.0)
  819. assert_equal(1, BigDecimal::INFINITY ** BigDecimal(0))
  820. assert_positive_zero(BigDecimal::INFINITY ** -1)
  821. assert_positive_zero(BigDecimal::INFINITY ** -1.quo(1))
  822. assert_positive_zero(BigDecimal::INFINITY ** -1.0)
  823. assert_positive_zero(BigDecimal::INFINITY ** BigDecimal(-1))
  824. assert_positive_zero(BigDecimal::INFINITY ** -2)
  825. assert_positive_zero(BigDecimal::INFINITY ** -2.0)
  826. assert_positive_zero(BigDecimal::INFINITY ** BigDecimal(-2))
  827. end
  828. end
  829. def test_power_of_negative_infinity
  830. BigDecimal.save_exception_mode do
  831. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  832. assert_negative_infinite((-BigDecimal::INFINITY) ** 3)
  833. assert_negative_infinite((-BigDecimal::INFINITY) ** 3.quo(1))
  834. assert_negative_infinite((-BigDecimal::INFINITY) ** 3.0)
  835. assert_negative_infinite((-BigDecimal::INFINITY) ** BigDecimal(3))
  836. assert_positive_infinite((-BigDecimal::INFINITY) ** 2)
  837. assert_positive_infinite((-BigDecimal::INFINITY) ** 2.quo(1))
  838. assert_positive_infinite((-BigDecimal::INFINITY) ** 2.0)
  839. assert_positive_infinite((-BigDecimal::INFINITY) ** BigDecimal(2))
  840. assert_negative_infinite((-BigDecimal::INFINITY) ** 1)
  841. assert_negative_infinite((-BigDecimal::INFINITY) ** 1.quo(1))
  842. assert_negative_infinite((-BigDecimal::INFINITY) ** 1.0)
  843. assert_negative_infinite((-BigDecimal::INFINITY) ** BigDecimal(1))
  844. assert_equal(1, (-BigDecimal::INFINITY) ** 0)
  845. assert_equal(1, (-BigDecimal::INFINITY) ** 0.quo(1))
  846. assert_equal(1, (-BigDecimal::INFINITY) ** 0.0)
  847. assert_equal(1, (-BigDecimal::INFINITY) ** BigDecimal(0))
  848. assert_negative_zero((-BigDecimal::INFINITY) ** -1)
  849. assert_negative_zero((-BigDecimal::INFINITY) ** -1.quo(1))
  850. assert_negative_zero((-BigDecimal::INFINITY) ** -1.0)
  851. assert_negative_zero((-BigDecimal::INFINITY) ** BigDecimal(-1))
  852. assert_positive_zero((-BigDecimal::INFINITY) ** -2)
  853. assert_positive_zero((-BigDecimal::INFINITY) ** -2.quo(1))
  854. assert_positive_zero((-BigDecimal::INFINITY) ** -2.0)
  855. assert_positive_zero((-BigDecimal::INFINITY) ** BigDecimal(-2))
  856. end
  857. end
  858. def test_power_without_prec
  859. pi = BigDecimal("3.14159265358979323846264338327950288419716939937511")
  860. e = BigDecimal("2.71828182845904523536028747135266249775724709369996")
  861. pow = BigDecimal("22.4591577183610454734271522045437350275893151339967843873233068")
  862. assert_equal(pow, pi.power(e))
  863. end
  864. def test_power_with_prec
  865. pi = BigDecimal("3.14159265358979323846264338327950288419716939937511")
  866. e = BigDecimal("2.71828182845904523536028747135266249775724709369996")
  867. pow = BigDecimal("22.459157718361045473")
  868. assert_equal(pow, pi.power(e, 20))
  869. end
  870. def test_limit
  871. BigDecimal.limit(1)
  872. x = BigDecimal.new("3")
  873. assert_equal(90, x ** 4) # OK? must it be 80?
  874. # 3 * 3 * 3 * 3 = 10 * 3 * 3 = 30 * 3 = 90 ???
  875. assert_raise(ArgumentError) { BigDecimal.limit(-1) }
  876. end
  877. def test_sign
  878. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  879. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  880. BigDecimal.mode(BigDecimal::EXCEPTION_ZERODIVIDE, false)
  881. assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, BigDecimal.new("0").sign)
  882. assert_equal(BigDecimal::SIGN_NEGATIVE_ZERO, BigDecimal.new("-0").sign)
  883. assert_equal(BigDecimal::SIGN_POSITIVE_FINITE, BigDecimal.new("1").sign)
  884. assert_equal(BigDecimal::SIGN_NEGATIVE_FINITE, BigDecimal.new("-1").sign)
  885. assert_equal(BigDecimal::SIGN_POSITIVE_INFINITE, (BigDecimal.new("1") / 0).sign)
  886. assert_equal(BigDecimal::SIGN_NEGATIVE_INFINITE, (BigDecimal.new("-1") / 0).sign)
  887. assert_equal(BigDecimal::SIGN_NaN, (BigDecimal.new("0") / 0).sign)
  888. end
  889. def test_inf
  890. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  891. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  892. inf = BigDecimal.new("Infinity")
  893. assert_equal(inf, inf + inf)
  894. assert_equal(true, (inf + (-inf)).nan?)
  895. assert_equal(true, (inf - inf).nan?)
  896. assert_equal(inf, inf - (-inf))
  897. assert_equal(inf, inf * inf)
  898. assert_equal(true, (inf / inf).nan?)
  899. assert_equal(inf, inf + 1)
  900. assert_equal(inf, inf - 1)
  901. assert_equal(inf, inf * 1)
  902. assert_equal(true, (inf * 0).nan?)
  903. assert_equal(inf, inf / 1)
  904. assert_equal(inf, 1 + inf)
  905. assert_equal(-inf, 1 - inf)
  906. assert_equal(inf, 1 * inf)
  907. assert_equal(-inf, -1 * inf)
  908. assert_equal(true, (0 * inf).nan?)
  909. assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, (1 / inf).sign)
  910. assert_equal(BigDecimal::SIGN_NEGATIVE_ZERO, (-1 / inf).sign)
  911. end
  912. def test_to_special_string
  913. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  914. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  915. nan = BigDecimal.new("NaN")
  916. assert_equal("NaN", nan.to_s)
  917. inf = BigDecimal.new("Infinity")
  918. assert_equal("Infinity", inf.to_s)
  919. assert_equal(" Infinity", inf.to_s(" "))
  920. assert_equal("+Infinity", inf.to_s("+"))
  921. assert_equal("-Infinity", (-inf).to_s)
  922. pzero = BigDecimal.new("0")
  923. assert_equal("0.0", pzero.to_s)
  924. assert_equal(" 0.0", pzero.to_s(" "))
  925. assert_equal("+0.0", pzero.to_s("+"))
  926. assert_equal("-0.0", (-pzero).to_s)
  927. end
  928. def test_to_string
  929. assert_equal("0.01", BigDecimal("0.01").to_s("F"))
  930. s = "0." + "0" * 100 + "1"
  931. assert_equal(s, BigDecimal(s).to_s("F"))
  932. s = "1" + "0" * 100 + ".0"
  933. assert_equal(s, BigDecimal(s).to_s("F"))
  934. end
  935. def test_ctov
  936. assert_equal(0.1, BigDecimal.new("1E-1"))
  937. assert_equal(10, BigDecimal.new("1E+1"))
  938. assert_equal(1, BigDecimal.new("+1"))
  939. BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
  940. assert_equal(BigDecimal::SIGN_POSITIVE_INFINITE, BigDecimal.new("1E1" + "0" * 10000).sign)
  941. assert_equal(BigDecimal::SIGN_NEGATIVE_INFINITE, BigDecimal.new("-1E1" + "0" * 10000).sign)
  942. assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, BigDecimal.new("1E-1" + "0" * 10000).sign)
  943. assert_equal(BigDecimal::SIGN_NEGATIVE_ZERO, BigDecimal.new("-1E-1" + "0" * 10000).sign)
  944. end
  945. def test_split_under_gc_stress
  946. bug3258 = '[ruby-dev:41213]'
  947. stress, GC.stress = GC.stress, true
  948. 10.upto(20) do |i|
  949. b = BigDecimal.new("1"+"0"*i)
  950. assert_equal([1, "1", 10, i+1], b.split, bug3258)
  951. end
  952. ensure
  953. GC.stress = stress
  954. end
  955. def test_coerce_under_gc_stress
  956. expect = ":too_long_to_embed_as_string can't be coerced into BigDecimal"
  957. under_gc_stress do
  958. b = BigDecimal.new("1")
  959. 10.times do
  960. begin
  961. b.coerce(:too_long_to_embed_as_string)
  962. rescue => e
  963. assert_instance_of TypeError, e
  964. assert_equal expect, e.message
  965. end
  966. end
  967. end
  968. end
  969. def test_INFINITY
  970. assert(BigDecimal::INFINITY.infinite?, "BigDecimal::INFINITY is not a infinity")
  971. end
  972. def test_NAN
  973. assert(BigDecimal::NAN.nan?, "BigDecimal::NAN is not NaN")
  974. end
  975. def test_exp_with_zerp_precision
  976. assert_raise(ArgumentError) do
  977. BigMath.exp(1, 0)
  978. end
  979. end
  980. def test_exp_with_negative_precision
  981. assert_raise(ArgumentError) do
  982. BigMath.exp(1, -42)
  983. end
  984. end
  985. def test_exp_with_complex
  986. assert_raise(ArgumentError) do
  987. BigMath.exp(Complex(1, 2), 20)
  988. end
  989. end
  990. def test_exp_with_negative_infinite
  991. BigDecimal.save_exception_mode do
  992. BigDecimal.mode(BigDecimal::EXCEPTION_INFINITY, false)
  993. assert_equal(0, BigMath.exp(-BigDecimal::INFINITY, 20))
  994. end
  995. end
  996. def test_exp_with_positive_infinite
  997. BigDecimal.save_exception_mode do
  998. BigDecimal.mode(BigDecimal::EXCEPTION_INFINITY, false)
  999. assert(BigMath.exp(BigDecimal::INFINITY, 20) > 0)
  1000. assert(BigMath.exp(BigDecimal::INFINITY, 20).infinite?)
  1001. end
  1002. end
  1003. def test_exp_with_nan
  1004. BigDecimal.save_exception_mode do
  1005. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  1006. assert(BigMath.exp(BigDecimal::NAN, 20).nan?)
  1007. end
  1008. end
  1009. def test_exp_with_1
  1010. assert_in_epsilon(Math::E, BigMath.exp(1, 20))
  1011. end
  1012. def test_BigMath_exp
  1013. n = 20
  1014. assert_in_epsilon(Math.exp(n), BigMath.exp(BigDecimal("20"), n))
  1015. assert_in_epsilon(Math.exp(40), BigMath.exp(BigDecimal("40"), n))
  1016. assert_in_epsilon(Math.exp(-n), BigMath.exp(BigDecimal("-20"), n))
  1017. assert_in_epsilon(Math.exp(-40), BigMath.exp(BigDecimal("-40"), n))
  1018. end
  1019. def test_BigMath_exp_under_gc_stress
  1020. expect = ":too_long_to_embed_as_string can't be coerced into BigDecimal"
  1021. under_gc_stress do
  1022. 10.times do
  1023. begin
  1024. BigMath.exp(:too_long_to_embed_as_string, 6)
  1025. rescue => e
  1026. assert_instance_of ArgumentError, e
  1027. assert_equal expect, e.message
  1028. end
  1029. end
  1030. end
  1031. end
  1032. def test_BigMath_log_with_nil
  1033. assert_raise(ArgumentError) do
  1034. BigMath.log(nil, 20)
  1035. end
  1036. end
  1037. def test_BigMath_log_with_nil_precision
  1038. assert_raise(ArgumentError) do
  1039. BigMath.log(1, nil)
  1040. end
  1041. end
  1042. def test_BigMath_log_with_complex
  1043. assert_raise(Math::DomainError) do
  1044. BigMath.log(Complex(1, 2), 20)
  1045. end
  1046. end
  1047. def test_BigMath_log_with_zerp_precision
  1048. assert_raise(ArgumentError) do
  1049. BigMath.log(1, 0)
  1050. end
  1051. end
  1052. def test_BigMath_log_with_negative_precision
  1053. assert_raise(ArgumentError) do
  1054. BigMath.log(1, -42)
  1055. end
  1056. end
  1057. def test_BigMath_log_with_negative_infinite
  1058. BigDecimal.save_exception_mode do
  1059. BigDecimal.mode(BigDecimal::EXCEPTION_INFINITY, false)
  1060. assert_raise(Math::DomainError) do
  1061. BigMath.log(-BigDecimal::INFINITY, 20)
  1062. end
  1063. end
  1064. end
  1065. def test_BigMath_log_with_positive_infinite
  1066. BigDecimal.save_exception_mode do
  1067. BigDecimal.mode(BigDecimal::EXCEPTION_INFINITY, false)
  1068. assert(BigMath.log(BigDecimal::INFINITY, 20) > 0)
  1069. assert(BigMath.log(BigDecimal::INFINITY, 20).infinite?)
  1070. end
  1071. end
  1072. def test_BigMath_log_with_nan
  1073. BigDecimal.save_exception_mode do
  1074. BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
  1075. assert(BigMath.log(BigDecimal::NAN, 20).nan?)
  1076. end
  1077. end
  1078. def test_BigMath_log_with_1
  1079. assert_in_delta(0.0, BigMath.log(1, 20))
  1080. assert_in_delta(0.0, BigMath.log(1.0, 20))
  1081. assert_in_delta(0.0, BigMath.log(BigDecimal(1), 20))
  1082. end
  1083. def test_BigMath_log_with_exp_1
  1084. assert_in_delta(1.0, BigMath.log(BigMath.exp(1, 20), 20))
  1085. end
  1086. def test_BigMath_log_with_2
  1087. assert_in_delta(Math.log(2), BigMath.log(2, 20))
  1088. assert_in_delta(Math.log(2), BigMath.log(2.0, 20))
  1089. assert_in_delta(Math.log(2), BigMath.log(BigDecimal(2), 20))
  1090. end
  1091. def test_BigMath_log_with_square_of_exp_2
  1092. assert_in_delta(2, BigMath.log(BigMath.exp(1, 20)**2, 20))
  1093. end
  1094. def test_BigMath_log_with_42
  1095. assert_in_delta(Math.log(42), BigMath.log(42, 20))
  1096. assert_in_delta(Math.log(42), BigMath.log(42.0, 20))
  1097. assert_in_delta(Math.log(42), BigMath.log(BigDecimal(42), 20))
  1098. end
  1099. def test_BigMath_log_with_reciprocal_of_42
  1100. assert_in_delta(Math.log(1e-42), BigMath.log(1e-42, 20))
  1101. assert_in_delta(Math.log(1e-42), BigMath.log(BigDecimal("1e-42"), 20))
  1102. end
  1103. def test_BigMath_log_under_gc_stress
  1104. expect = ":too_long_to_embed_as_string can't be coerced into BigDecimal"
  1105. under_gc_stress do
  1106. 10.times do
  1107. begin
  1108. BigMath.log(:too_long_to_embed_as_string, 6)
  1109. rescue => e
  1110. assert_instance_of ArgumentError, e
  1111. assert_equal expect, e.message
  1112. end
  1113. end
  1114. end
  1115. end
  1116. def test_to_d
  1117. bug6093 = '[ruby-core:42969]'
  1118. code = "exit(BigDecimal.new('10.0') == 10.0.to_d)"
  1119. assert_ruby_status(%w[-rbigdecimal -rbigdecimal/util -rmathn -], code, bug6093)
  1120. end
  1121. def test_to_d
  1122. bug6093 = '[ruby-core:42969]'
  1123. code = "exit(BigDecimal.new('10.0') == 10.0.to_d)"
  1124. assert_ruby_status(%w[-rbigdecimal -rbigdecimal/util -rmathn -], code, bug6093)
  1125. end
  1126. def test_bug6406
  1127. assert_in_out_err(%w[-rbigdecimal --disable-gems], <<-EOS, [], [])
  1128. Thread.current.keys.to_s
  1129. EOS
  1130. end
  1131. end