test/test_fmt.rb in nio-0.2.1 vs test/test_fmt.rb in nio-0.2.2
- old
+ new
@@ -1,376 +1,410 @@
-
-
-# Copyright (C) 2003-2005, Javier Goizueta <javier@goizueta.info>
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-
-#require File.dirname(__FILE__) + '/test_helper.rb'
-require 'test/unit'
-require 'nio/rtnlzr'
-require 'nio/repdec'
-require 'nio/fmt'
-include Nio
-require 'yaml'
-
-def neighbours(x)
- f,e = Math.frexp(x)
- e = Float::MIN_EXP if f==0
- e = [Float::MIN_EXP,e].max
- dx = Math.ldexp(1,e-Float::MANT_DIG) #Math.ldexp(Math.ldexp(1.0,-Float::MANT_DIG),e)
- high = x + dx
- if e==Float::MIN_EXP || f!=0.5 #0.5==Math.ldexp(2**(bits-1),-Float::MANT_DIG)
- low = x - dx
- else
- low = x - dx/2 # x - Math.ldexp(Math.ldexp(1.0,-Float::MANT_DIG),e-1)
- end
- [low, high]
-end
-
-def prv(x)
- neighbours(x)[0]
-end
-def nxt(x)
- neighbours(x)[1]
-end
-MIN_N = Math.ldexp(0.5,Float::MIN_EXP) # == nxt(MAX_D) == Float::MIN
-MAX_D = Math.ldexp(Math.ldexp(1,Float::MANT_DIG-1)-1,Float::MIN_EXP-Float::MANT_DIG)
-MIN_D = Math.ldexp(1,Float::MIN_EXP-Float::MANT_DIG);
-
-class TestFmt < Test::Unit::TestCase
-
- def setup
-
- $data = YAML.load(File.read(File.join(File.dirname(__FILE__) ,'data.yaml'))).collect{|x| [x].pack('H*').unpack('E')[0]}
- $data << MIN_N
- $data << MAX_D
- $data << MIN_D
-
- end
-
- def teardown
-
- Fmt.default = Fmt.new
-
- end
-
-
- def test_basic_fmt
- # test correct rounding: 1.448997445238699 -> 6525704354437805*2^-52
- assert_equal Rational(6525704354437805,4503599627370496), Float.nio_read('1.448997445238699').nio_xr
-
- assert_equal "0",0.0.nio_write
- assert_equal "0",0.nio_write
- assert_equal "0",BigDecimal('0').nio_write
- assert_equal "0",Rational(0,1).nio_write
-
- assert_equal "123456789",123456789.0.nio_write
- assert_equal "123456789",123456789.nio_write
- assert_equal "123456789",BigDecimal('123456789').nio_write
- assert_equal "123456789",Rational(123456789,1).nio_write
- assert_equal "123456789.25",123456789.25.nio_write
- assert_equal "123456789.25",BigDecimal('123456789.25').nio_write
- assert_equal "123456789.25",(Rational(123456789)+Rational(1,4)).nio_write
- end
-
- def test_basic_fmt_float
-
- assert_equal 2,Float::RADIX
- assert_equal 53,Float::MANT_DIG
-
- fmt = Fmt.new {|f|
- f.rep! '[','','...',0,true
- f.width! 20,:right,'*'
- }
- fmt.sep! '.',',',[3]
-
- assert_equal "0.1",0.1.nio_write
- assert_equal "0.10000000000000001",0.1.nio_write(Fmt.mode(:gen,:exact).show_all_digits)
- assert_equal "0.10000000000000001",0.1.nio_write(Fmt.mode(:gen,:exact).show_all_digits(true))
- assert_equal "0.10000000000000001",0.1.nio_write(Fmt.mode(:gen,:exact,:show_all_digits=>true))
- assert_equal "0.1000000000000000055511151231257827021181583404541015625",0.1.nio_write(Fmt.mode(:gen,:exact,:approx=>:exact))
-
-
- assert_equal "******643,454,333.32",fmt.nio_write_formatted(fmt.nio_read_formatted("643,454,333.32"))
- assert_equal "******643.454.333,32",fmt.sep(',').nio_write_formatted(fmt.nio_read_formatted("643,454,333.32"))
- fmt.pad0s! 10
- num = fmt.nio_read_formatted("0.3333...")
- assert_equal "0000000.[3",fmt.nio_write_formatted(num)
- fmt.mode! :fix, 3
- assert_equal "000000.333",fmt.nio_write_formatted(num)
- num = fmt.nio_read_formatted("-0.666...")
- fmt.prec! :exact
- fmt.sep! ',','.'
- assert_equal "-000000,[6",fmt.nio_write_formatted(num)
- fmt.width! 20,:center,'*'
- fmt.mode! :fix,3
- assert_equal "*******-0,667*******",fmt.nio_write_formatted(num)
- num = fmt.nio_read_formatted("0,5555")
- fmt.prec! :exact
- assert_equal "*******0,5555*******",fmt.nio_write_formatted(num)
-
- Fmt.default = Fmt[:comma_th]
- x = Float.nio_read("11123,2343")
- assert_equal 11123.2343,x
- assert_equal "11.123,2343", x.nio_write
- assert_equal "11123,2343", x.nio_write(Fmt[:comma])
-
- x = Float.nio_read("-1234,5678901234e-33")
- # assert_equal -1.2345678901234e-030, x
- assert_equal "-1,2345678901234E-30", x.nio_write()
- assert_equal "-0,0000000000000000000000000000012346",x.nio_write(Fmt[:comma].mode(:sig,5))
-
- assert_equal "0,333...",
- (1.0/3).nio_write(Fmt.prec(:exact).show_all_digits(true).approx_mode(:simplify))
-
- fmt = Fmt.default
- assert_raises TypeError do fmt.prec! 4 end
- fmt = Fmt.default {|f| f.prec! 4 }
- assert_equal "1,235", 1.23456.nio_write(fmt)
- assert_equal "1,23456", 1.23456.nio_write()
-
- Fmt.default = Fmt.new
- assert_equal '11123.2343', 11123.2343.nio_write
- end
-
- def test_tol_fmt_float
- tol = Tolerance.new.decimals(12,:sig)
- fmt = Fmt.prec(12,:sig)
- $data.each do |x|
- assert tol.equals?(x, Float.nio_read(x.nio_write(fmt),fmt)), "out of tolerance: #{x.inspect} #{Float.nio_read(x.nio_write(fmt),fmt)}"
- assert tol.equals?(-x, Float.nio_read((-x).nio_write(fmt),fmt)), "out of tolerance: #{(-x).inspect} #{Float.nio_read((-x).nio_write(fmt),fmt)}"
- end
- end
-
- def test_BigDec
- assert_equal "0",BigDec(0).nio_write
- fmt = Fmt.mode(:gen,:exact)
- assert_equal "0",BigDec(0).nio_write(fmt)
- $data.each do |x|
- x = BigDecimal(x.to_s)
- assert_equal x,BigDecimal.nio_read(x.nio_write(fmt),fmt)
- end
- assert_equal "1E500",BigDec('1E500').nio_write
- assert_equal "1E-500",BigDec('1E-500').nio_write
- assert_equal "-1E500",BigDec('-1E500').nio_write
- assert_equal "-1E-500",BigDec('-1E-500').nio_write
- end
-
- def test_Rational
- assert_equal "0",Rational(0,1).nio_write
- fmt = Fmt.mode(:gen,:exact)
- assert_equal "0",Rational(0,1).nio_write(fmt)
- $data.each do |x|
- x = x.nio_xr # nio_r
- assert_equal x,Rational.nio_read(x.nio_write(fmt),fmt)
- end
- end
-
- def test_float_bases
- nfmt2 = Fmt[:comma].base(2).prec(:exact)
- nfmt8 = Fmt[:comma].base(8).prec(:exact)
- nfmt10 = Fmt[:comma].base(10).prec(:exact)
- nfmt16 = Fmt[:comma].base(16).prec(:exact)
- $data.each do |x|
- assert_equal(x,Float.nio_read(x.nio_write(nfmt2),nfmt2))
- assert_equal(x,Float.nio_read(x.nio_write(nfmt8),nfmt8))
- assert_equal(x,Float.nio_read(x.nio_write(nfmt10),nfmt10))
- assert_equal(x,Float.nio_read(x.nio_write(nfmt16),nfmt16))
- assert_equal(-x,Float.nio_read((-x).nio_write(nfmt2),nfmt2))
- assert_equal(-x,Float.nio_read((-x).nio_write(nfmt8),nfmt8))
- assert_equal(-x,Float.nio_read((-x).nio_write(nfmt10),nfmt10))
- assert_equal(-x,Float.nio_read((-x).nio_write(nfmt16),nfmt16))
- end
- end
-
- def rational_bases
- assert_equal "0.0001100110011...", (Rational(1)/10).nio_write(Fmt.new.base(2))
- end
-
- def test_big_decimal_bases
-
- assert_equal "0.1999A",(BigDec(1)/10).nio_write(Fmt.new.base(16).prec(5))
- assert_equal "0.1999...",(BigDec(1)/10).nio_write(Fmt.mode(:gen,:exact,:round=>:inf,:approx=>:simplify).base(16))
-
- nfmt2 = Fmt[:comma].base(2).prec(:exact)
- nfmt8 = Fmt[:comma].base(8).prec(:exact)
- nfmt10 = Fmt[:comma].base(10).prec(:exact)
- nfmt16 = Fmt[:comma].base(16).prec(:exact)
- $data.each do |x|
- x = BigDec(x.to_s)
- xs,xdig,xb,xe = x.split
- ndig = xdig.size
- round_dig = ndig-xe
- # note that BigDecimal.nio_read produces a BigDecimal with the exact value of the text representation
- # since the representation here is only aproximate (because of the base difference), we must
- # round the results to the precision of the original number
- assert_equal(x,BigDecimal.nio_read(x.nio_write(nfmt2),nfmt2).round(round_dig))
- assert_equal(x,BigDecimal.nio_read(x.nio_write(nfmt8),nfmt8).round(round_dig))
- assert_equal(x,BigDecimal.nio_read(x.nio_write(nfmt10),nfmt10).round(round_dig))
- assert_equal(x,BigDecimal.nio_read(x.nio_write(nfmt16),nfmt16).round(round_dig))
- assert_equal(-x,BigDecimal.nio_read((-x).nio_write(nfmt2),nfmt2).round(round_dig))
- assert_equal(-x,BigDecimal.nio_read((-x).nio_write(nfmt8),nfmt8).round(round_dig))
- assert_equal(-x,BigDecimal.nio_read((-x).nio_write(nfmt10),nfmt10).round(round_dig))
- assert_equal(-x,BigDecimal.nio_read((-x).nio_write(nfmt16),nfmt16).round(round_dig))
- end
- end
-
- def test_exact_all_float
- #fmt = Fmt.prec(:exact).show_all_digits(true).approx_mode(:exact)
- fmt = Fmt.mode(:gen,:exact,:round=>:inf,:approx=>:exact)
- assert_equal "0.1000000000000000055511151231257827021181583404541015625",Float.nio_read('0.1',fmt).nio_write(fmt)
- assert_equal "64.099999999999994315658113919198513031005859375",Float.nio_read('64.1',fmt).nio_write(fmt)
- assert_equal '0.5',Float.nio_read('0.5',fmt).nio_write(fmt)
- assert_equal "0.333333333333333314829616256247390992939472198486328125", (1.0/3.0).nio_write(fmt)
- assert_equal "0.66666666666666662965923251249478198587894439697265625", (2.0/3.0).nio_write(fmt)
- assert_equal "-0.333333333333333314829616256247390992939472198486328125", (-1.0/3.0).nio_write(fmt)
- assert_equal "-0.66666666666666662965923251249478198587894439697265625", (-2.0/3.0).nio_write(fmt)
- assert_equal "1267650600228229401496703205376", (2.0**100).nio_write(fmt)
- assert_equal "0.10000000000000001942890293094023945741355419158935546875", nxt(0.1).nio_write(fmt)
- assert_equal "1023.9999999999998863131622783839702606201171875", prv(1024).nio_write(fmt)
-
- assert_equal "2.225073858507201383090232717332404064219215980462331830553327416887204434813918195854283159012511020564067339731035811005152434161553460108856012385377718821130777993532002330479610147442583636071921565046942503734208375250806650616658158948720491179968591639648500635908770118304874799780887753749949451580451605050915399856582470818645113537935804992115981085766051992433352114352390148795699609591288891602992641511063466313393663477586513029371762047325631781485664350872122828637642044846811407613911477062801689853244110024161447421618567166150540154285084716752901903161322778896729707373123334086988983175067838846926092773977972858659654941091369095406136467568702398678315290680984617210924625396728515625E-308",
- MIN_N.nio_write(fmt)
- assert_equal "2.2250738585072008890245868760858598876504231122409594654935248025624400092282356951787758888037591552642309780950434312085877387158357291821993020294379224223559819827501242041788969571311791082261043971979604000454897391938079198936081525613113376149842043271751033627391549782731594143828136275113838604094249464942286316695429105080201815926642134996606517803095075913058719846423906068637102005108723282784678843631944515866135041223479014792369585208321597621066375401613736583044193603714778355306682834535634005074073040135602968046375918583163124224521599262546494300836851861719422417646455137135420132217031370496583210154654068035397417906022589503023501937519773030945763173210852507299305089761582519159720757232455434770912461317493580281734466552734375E-308",
- MAX_D.nio_write(fmt)
- assert_equal "2.225073858507200394958941034839315711081630244019587100433722188237675583642553194503268618595007289964394616459051051412023043270117998255542591673498126023581185971968246077878183766819774580380287229348978296356771103136809189170558146173902184049999817014701706089569539838241444028984739501272818269238398287937541863482503350197395249647392622007205322474852963190178391854932391064931720791430455764953943127215325436859833344767109289929102154994338687742727610729450624487971196675896144263447425089844325111161570498002959146187656616550482084690619235135756396957006047593447154776156167693340095043268338435252390549256952840748419828640113148805198563919935252207510837343961185884248936392555587988206944151446491086954182492263498716056346893310546875E-308",
- prv(MAX_D).nio_write(fmt)
- assert_equal "9.88131291682493088353137585736442744730119605228649528851171365001351014540417503730599672723271984759593129390891435461853313420711879592797549592021563756252601426380622809055691634335697964207377437272113997461446100012774818307129968774624946794546339230280063430770796148252477131182342053317113373536374079120621249863890543182984910658610913088802254960259419999083863978818160833126649049514295738029453560318710477223100269607052986944038758053621421498340666445368950667144166486387218476578691673612021202301233961950615668455463665849580996504946155275185449574931216955640746893939906729403594535543517025132110239826300978220290207572547633450191167477946719798732961988232841140527418055848553508913045817507736501283943653106689453125E-324",
- nxt(MIN_D).nio_write(fmt)
- assert_equal "4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625E-324",
- MIN_D.nio_write(fmt)
-
- end
-
- def test_float_nonsig
-
- assert_equal "100.000000000000000#####", 100.0.nio_write(Fmt.prec(20,:fix).insignificant_digits('#'))
-
- fmt = Fmt.mode(:sci,20).insignificant_digits('#').sci_digits(1)
- assert_equal "3.3333333333333331###E-1", (1.0/3).nio_write(fmt)
- assert_equal "3.3333333333333335###E6", (1E7/3).nio_write(fmt)
- assert_equal "3.3333333333333334###E-8", (1E-7/3).nio_write(fmt)
- assert_equal "3.3333333333333333333E-1", Rational(1,3).nio_write(fmt)
- assert_equal "3.3333333333333331###E-1", (1.0/3).nio_write(fmt.dup.sci_digits(1))
- assert_equal "33333333333333331###.E-20", (1.0/3).nio_write(fmt.dup.sci_digits(-1))
- assert_equal "33333333333333333333.E-20", (Rational(1,3)).nio_write(fmt.dup.sci_digits(-1))
-
- fmt.sci_digits! :eng
- assert_equal "333.33333333333331###E-3", (1.0/3).nio_write(fmt)
- assert_equal "3.3333333333333335###E6", (1E7/3).nio_write(fmt)
- assert_equal "33.333333333333334###E-9",(1E-7/3).nio_write(fmt)
-
- fmt = Fmt[:comma].mode(:sci,20).insignificant_digits('#').sci_digits(0)
- assert_equal "0,33333333333333331###E0",(1.0/3).nio_write(fmt)
- assert_equal "0,33333333333333335###E7",(1E7/3).nio_write(fmt)
- assert_equal "0,33333333333333334###E-7",(1E-7/3).nio_write(fmt)
-
- fmt = Fmt.mode(:sci,20).insignificant_digits('#').sci_digits(0)
- assert_equal "0.10000000000000001###E0",(1E-1).nio_write(fmt)
- assert_equal "0.50000000000000000###E0",(0.5).nio_write(fmt)
- assert_equal "0.49999999999999994###E0",prv(0.5).nio_write(fmt)
- assert_equal "0.50000000000000011###E0",nxt(0.5).nio_write(fmt)
- assert_equal "0.22250738585072014###E-307",MIN_N.nio_write(fmt)
- assert_equal "0.22250738585072009###E-307",MAX_D.nio_write(fmt)
- assert_equal "0.5###################E-323",MIN_D.nio_write(fmt)
- assert_equal "0.64000000000000000###E2",(64.0).nio_write(fmt)
- assert_equal "0.6400000000000001####E2",(nxt(64.0)).nio_write(fmt)
- assert_equal "0.6409999999999999####E2",(64.1).nio_write(fmt)
- assert_equal "0.6412312300000001####E2",(64.123123).nio_write(fmt)
- assert_equal "0.10000000000000001###E0",(0.1).nio_write(fmt)
- assert_equal "0.6338253001141148####E30",nxt(Math.ldexp(0.5,100)).nio_write(fmt)
- assert_equal "0.39443045261050599###E-30",nxt(Math.ldexp(0.5,-100)).nio_write(fmt)
- assert_equal "0.10##################E-322",nxt(MIN_D).nio_write(fmt)
- assert_equal "0.15##################E-322",nxt(nxt(MIN_D)).nio_write(fmt)
-
- # note: 1E23 is equidistant from 2 Floats; one or the other will be chosen based on the rounding mode
- x = Float.nio_read('1E23',Fmt.prec(:exact,:gen,:round=>:even))
- assert_equal "1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:zero))
- assert_equal "9.999999999999999E22",x.nio_write(Fmt.prec(:exact,:gen,:round=>:inf))
- assert_equal "1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:even))
-
- x = Float.nio_read('1E23',Fmt.prec(:exact,:gen,:round=>:zero))
- assert_equal "1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:zero))
- assert_equal "9.999999999999999E22",x.nio_write(Fmt.prec(:exact,:gen,:round=>:inf))
- assert_equal "1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:even))
-
- x = Float.nio_read('1E23',Fmt.prec(:exact,:gen,:round=>:inf))
- assert_equal "1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:inf))
- assert_equal "1.0000000000000001E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:zero))
- assert_equal "1.0000000000000001E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:even))
-
- x = Float.nio_read('-1E23',Fmt.prec(:exact,:gen,:round=>:even))
- assert_equal "-1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:zero))
- assert_equal "-9.999999999999999E22",x.nio_write(Fmt.prec(:exact,:gen,:round=>:inf))
- assert_equal "-1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:even))
-
- x = Float.nio_read('-1E23',Fmt.prec(:exact,:gen,:round=>:zero))
- assert_equal "-1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:zero))
- assert_equal "-9.999999999999999E22",x.nio_write(Fmt.prec(:exact,:gen,:round=>:inf))
- assert_equal "-1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:even))
-
- x = Float.nio_read('-1E23',Fmt.prec(:exact,:gen,:round=>:inf))
- assert_equal "-1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:inf))
- assert_equal "-1.0000000000000001E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:zero))
- assert_equal "-1.0000000000000001E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:even))
-
- # note: for 64.1 there's only one closest Float;
- # but it can be univocally expressed in decimal either as 64.09999999999999 or 64.1
- x = Float.nio_read('64.1',Fmt.prec(:exact,:gen,:round=>:even))
- assert_equal "64.09999999999999",x.nio_write(Fmt.prec(:exact,:gen).show_all_digits(true))
- assert_equal "64.1",x.nio_write(Fmt.prec(:exact,:gen))
-
- # to do: exact conversion of Rational(32095022417, 54517) should throw and exception
- # (unless RepDec.max_d is greater than 27300 or so)
-
-
- end
-
- def test_special
- assert BigDecimal.nio_read("NaN").nan?
- assert Float.nio_read("NaN").nan?
- assert_equal "NAN", BigDec("NaN").nio_write.upcase
- assert_equal "NAN", BigDecimal.nio_read("NaN").nio_write.upcase
- assert_equal "NAN", Float.nio_read("NaN").nio_write.upcase
- assert_raises ZeroDivisionError do Rational.nio_read("NaN") end
-
- assert !BigDecimal.nio_read('Infinity').finite?
- assert !BigDecimal.nio_read('+Infinity').finite?
- assert !BigDecimal.nio_read('-Infinity').finite?
- assert !Float.nio_read('Infinity').finite?
- assert !Float.nio_read('+Infinity').finite?
- assert !Float.nio_read('-Infinity').finite?
- assert_raises ZeroDivisionError do Rational.nio_read("Infinity") end
- assert_raises ZeroDivisionError do Rational.nio_read("+Infinity") end
- assert_raises ZeroDivisionError do Rational.nio_read("-Infinity") end
- assert_equal BigDec(1)/0, BigDecimal.nio_read('Infinity')
- assert_equal BigDec(-1)/0, BigDecimal.nio_read('-Infinity')
- assert_equal '+Infinity', BigDecimal.nio_read('Infinity').nio_write
- assert_equal '+Infinity', BigDecimal.nio_read('+Infinity').nio_write
- assert_equal '-Infinity', BigDecimal.nio_read('-Infinity').nio_write
- assert_equal '+Infinity', Float.nio_read('Infinity').nio_write
- assert_equal '+Infinity', Float.nio_read('+Infinity').nio_write
- assert_equal '-Infinity', Float.nio_read('-Infinity').nio_write
-
- end
-
- def test_conversions
- x_txt = '1.234567890123456'
- x_d = BigDecimal.nio_read(x_txt)
- x_f = Float.nio_read(x_txt)
- assert_equal 1.234567890123456, x_f
- assert_equal BigDecimal(x_txt), x_d
- assert_equal Nio.convert(x_d,Float,:exact), x_f
- assert_equal Nio.convert(x_d,Float,:approx), x_f
-
- x_d = BigDec(355)/226
- x_f = Float(355)/226
- assert_equal Nio.convert(x_d,Float,:exact), x_f
- assert_equal Nio.convert(x_d,Float,:approx), x_f
-
- end
-
-
-end
+
+
+# Copyright (C) 2003-2005, Javier Goizueta <javier@goizueta.info>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+
+#require File.dirname(__FILE__) + '/test_helper.rb'
+require 'test/unit'
+require 'nio/rtnlzr'
+require 'nio/repdec'
+require 'nio/fmt'
+include Nio
+require 'yaml'
+
+def neighbours(x)
+ f,e = Math.frexp(x)
+ e = Float::MIN_EXP if f==0
+ e = [Float::MIN_EXP,e].max
+ dx = Math.ldexp(1,e-Float::MANT_DIG) #Math.ldexp(Math.ldexp(1.0,-Float::MANT_DIG),e)
+ high = x + dx
+ if e==Float::MIN_EXP || f!=0.5 #0.5==Math.ldexp(2**(bits-1),-Float::MANT_DIG)
+ low = x - dx
+ else
+ low = x - dx/2 # x - Math.ldexp(Math.ldexp(1.0,-Float::MANT_DIG),e-1)
+ end
+ [low, high]
+end
+
+def prv(x)
+ neighbours(x)[0]
+end
+def nxt(x)
+ neighbours(x)[1]
+end
+MIN_N = Math.ldexp(0.5,Float::MIN_EXP) # == nxt(MAX_D) == Float::MIN
+MAX_D = Math.ldexp(Math.ldexp(1,Float::MANT_DIG-1)-1,Float::MIN_EXP-Float::MANT_DIG)
+MIN_D = Math.ldexp(1,Float::MIN_EXP-Float::MANT_DIG);
+
+class TestFmt < Test::Unit::TestCase
+
+ def setup
+
+ $data = YAML.load(File.read(File.join(File.dirname(__FILE__) ,'data.yaml'))).collect{|x| [x].pack('H*').unpack('E')[0]}
+ $data << MIN_N
+ $data << MAX_D
+ $data << MIN_D
+
+ end
+
+ def teardown
+
+ Fmt.default = Fmt.new
+
+ end
+
+
+ def test_basic_fmt
+ # test correct rounding: 1.448997445238699 -> 6525704354437805*2^-52
+ assert_equal Rational(6525704354437805,4503599627370496), Float.nio_read('1.448997445238699').nio_xr
+
+ assert_equal "0",0.0.nio_write
+ assert_equal "0",0.nio_write
+ assert_equal "0",BigDecimal('0').nio_write
+ assert_equal "0",Rational(0,1).nio_write
+
+ assert_equal "123456789",123456789.0.nio_write
+ assert_equal "123456789",123456789.nio_write
+ assert_equal "123456789",BigDecimal('123456789').nio_write
+ assert_equal "123456789",Rational(123456789,1).nio_write
+ assert_equal "123456789.25",123456789.25.nio_write
+ assert_equal "123456789.25",BigDecimal('123456789.25').nio_write
+ assert_equal "123456789.25",(Rational(123456789)+Rational(1,4)).nio_write
+ end
+
+ def test_basic_fmt_float
+
+ assert_equal 2,Float::RADIX
+ assert_equal 53,Float::MANT_DIG
+
+ fmt = Fmt.new {|f|
+ f.rep! '[','','...',0,true
+ f.width! 20,:right,'*'
+ }
+ fmt.sep! '.',',',[3]
+
+ assert_equal "0.1",0.1.nio_write
+ assert_equal "0.10000000000000001",0.1.nio_write(Fmt.mode(:gen,:exact).show_all_digits)
+ assert_equal "0.10000000000000001",0.1.nio_write(Fmt.mode(:gen,:exact).show_all_digits(true))
+ assert_equal "0.10000000000000001",0.1.nio_write(Fmt.mode(:gen,:exact,:show_all_digits=>true))
+ assert_equal "0.1000000000000000055511151231257827021181583404541015625",0.1.nio_write(Fmt.mode(:gen,:exact,:approx=>:exact))
+
+
+ assert_equal "******643,454,333.32",fmt.nio_write_formatted(fmt.nio_read_formatted("643,454,333.32"))
+ assert_equal "******643.454.333,32",fmt.sep(',').nio_write_formatted(fmt.nio_read_formatted("643,454,333.32"))
+ fmt.pad0s! 10
+ num = fmt.nio_read_formatted("0.3333...")
+ assert_equal "0000000.[3",fmt.nio_write_formatted(num)
+ fmt.mode! :fix, 3
+ assert_equal "000000.333",fmt.nio_write_formatted(num)
+ num = fmt.nio_read_formatted("-0.666...")
+ fmt.prec! :exact
+ fmt.sep! ',','.'
+ assert_equal "-000000,[6",fmt.nio_write_formatted(num)
+ fmt.width! 20,:center,'*'
+ fmt.mode! :fix,3
+ assert_equal "*******-0,667*******",fmt.nio_write_formatted(num)
+ num = fmt.nio_read_formatted("0,5555")
+ fmt.prec! :exact
+ assert_equal "*******0,5555*******",fmt.nio_write_formatted(num)
+
+ Fmt.default = Fmt[:comma_th]
+ x = Float.nio_read("11123,2343")
+ assert_equal 11123.2343,x
+ assert_equal "11.123,2343", x.nio_write
+ assert_equal "11123,2343", x.nio_write(Fmt[:comma])
+
+ x = Float.nio_read("-1234,5678901234e-33")
+ # assert_equal -1.2345678901234e-030, x
+ assert_equal "-1,2345678901234E-30", x.nio_write()
+ assert_equal "-0,0000000000000000000000000000012346",x.nio_write(Fmt[:comma].mode(:sig,5))
+
+ assert_equal "0,333...",
+ (1.0/3).nio_write(Fmt.prec(:exact).show_all_digits(true).approx_mode(:simplify))
+
+ fmt = Fmt.default
+ if RUBY_VERSION>='1.9.0'
+ assert_raises RuntimeError do fmt.prec! 4 end
+ else
+ assert_raises TypeError do fmt.prec! 4 end
+ end
+ fmt = Fmt.default {|f| f.prec! 4 }
+ assert_equal "1,235", 1.23456.nio_write(fmt)
+ assert_equal "1,23456", 1.23456.nio_write()
+
+ Fmt.default = Fmt.new
+ assert_equal '11123.2343', 11123.2343.nio_write
+ end
+
+ def test_tol_fmt_float
+ tol = Tolerance.new.decimals(12,:sig)
+ fmt = Fmt.prec(12,:sig)
+ $data.each do |x|
+ assert tol.equals?(x, Float.nio_read(x.nio_write(fmt),fmt)), "out of tolerance: #{x.inspect} #{Float.nio_read(x.nio_write(fmt),fmt)}"
+ assert tol.equals?(-x, Float.nio_read((-x).nio_write(fmt),fmt)), "out of tolerance: #{(-x).inspect} #{Float.nio_read((-x).nio_write(fmt),fmt)}"
+ end
+ end
+
+ def test_BigDec
+ assert_equal "0",BigDec(0).nio_write
+ fmt = Fmt.mode(:gen,:exact)
+ assert_equal "0",BigDec(0).nio_write(fmt)
+ $data.each do |x|
+ x = BigDecimal(x.to_s)
+ assert_equal x,BigDecimal.nio_read(x.nio_write(fmt),fmt)
+ end
+ assert_equal "1E500",BigDec('1E500').nio_write
+ assert_equal "1E-500",BigDec('1E-500').nio_write
+ assert_equal "-1E500",BigDec('-1E500').nio_write
+ assert_equal "-1E-500",BigDec('-1E-500').nio_write
+ end
+
+ def test_Rational
+ assert_equal "0",Rational(0,1).nio_write
+ fmt = Fmt.mode(:gen,:exact)
+ assert_equal "0",Rational(0,1).nio_write(fmt)
+ $data.each do |x|
+ x = x.nio_xr # nio_r
+ assert_equal x,Rational.nio_read(x.nio_write(fmt),fmt)
+ end
+ end
+
+ def test_float_bases
+ nfmt2 = Fmt[:comma].base(2).prec(:exact)
+ nfmt8 = Fmt[:comma].base(8).prec(:exact)
+ nfmt10 = Fmt[:comma].base(10).prec(:exact)
+ nfmt16 = Fmt[:comma].base(16).prec(:exact)
+ $data.each do |x|
+ assert_equal(x,Float.nio_read(x.nio_write(nfmt2),nfmt2))
+ assert_equal(x,Float.nio_read(x.nio_write(nfmt8),nfmt8))
+ assert_equal(x,Float.nio_read(x.nio_write(nfmt10),nfmt10))
+ assert_equal(x,Float.nio_read(x.nio_write(nfmt16),nfmt16))
+ assert_equal(-x,Float.nio_read((-x).nio_write(nfmt2),nfmt2))
+ assert_equal(-x,Float.nio_read((-x).nio_write(nfmt8),nfmt8))
+ assert_equal(-x,Float.nio_read((-x).nio_write(nfmt10),nfmt10))
+ assert_equal(-x,Float.nio_read((-x).nio_write(nfmt16),nfmt16))
+ end
+ end
+
+ def rational_bases
+ assert_equal "0.0001100110011...", (Rational(1)/10).nio_write(Fmt.new.base(2))
+ end
+
+ def test_big_decimal_bases
+
+ assert_equal "0.1999A",(BigDec(1)/10).nio_write(Fmt.new.base(16).prec(5))
+ assert_equal "0.1999...",(BigDec(1)/10).nio_write(Fmt.mode(:gen,:exact,:round=>:inf,:approx=>:simplify).base(16))
+
+ nfmt2 = Fmt[:comma].base(2).prec(:exact)
+ nfmt8 = Fmt[:comma].base(8).prec(:exact)
+ nfmt10 = Fmt[:comma].base(10).prec(:exact)
+ nfmt16 = Fmt[:comma].base(16).prec(:exact)
+ $data.each do |x|
+ x = BigDec(x.to_s)
+ xs,xdig,xb,xe = x.split
+ ndig = xdig.size
+ round_dig = ndig-xe
+ # note that BigDecimal.nio_read produces a BigDecimal with the exact value of the text representation
+ # since the representation here is only aproximate (because of the base difference), we must
+ # round the results to the precision of the original number
+ assert_equal(x,BigDecimal.nio_read(x.nio_write(nfmt2),nfmt2).round(round_dig))
+ assert_equal(x,BigDecimal.nio_read(x.nio_write(nfmt8),nfmt8).round(round_dig))
+ assert_equal(x,BigDecimal.nio_read(x.nio_write(nfmt10),nfmt10).round(round_dig))
+ assert_equal(x,BigDecimal.nio_read(x.nio_write(nfmt16),nfmt16).round(round_dig))
+ assert_equal(-x,BigDecimal.nio_read((-x).nio_write(nfmt2),nfmt2).round(round_dig))
+ assert_equal(-x,BigDecimal.nio_read((-x).nio_write(nfmt8),nfmt8).round(round_dig))
+ assert_equal(-x,BigDecimal.nio_read((-x).nio_write(nfmt10),nfmt10).round(round_dig))
+ assert_equal(-x,BigDecimal.nio_read((-x).nio_write(nfmt16),nfmt16).round(round_dig))
+ end
+ end
+
+ def test_exact_all_float
+ #fmt = Fmt.prec(:exact).show_all_digits(true).approx_mode(:exact)
+ fmt = Fmt.mode(:gen,:exact,:round=>:inf,:approx=>:exact)
+ assert_equal "0.1000000000000000055511151231257827021181583404541015625",Float.nio_read('0.1',fmt).nio_write(fmt)
+ assert_equal "64.099999999999994315658113919198513031005859375",Float.nio_read('64.1',fmt).nio_write(fmt)
+ assert_equal '0.5',Float.nio_read('0.5',fmt).nio_write(fmt)
+ assert_equal "0.333333333333333314829616256247390992939472198486328125", (1.0/3.0).nio_write(fmt)
+ assert_equal "0.66666666666666662965923251249478198587894439697265625", (2.0/3.0).nio_write(fmt)
+ assert_equal "-0.333333333333333314829616256247390992939472198486328125", (-1.0/3.0).nio_write(fmt)
+ assert_equal "-0.66666666666666662965923251249478198587894439697265625", (-2.0/3.0).nio_write(fmt)
+ assert_equal "1267650600228229401496703205376", (2.0**100).nio_write(fmt)
+ assert_equal "0.10000000000000001942890293094023945741355419158935546875", nxt(0.1).nio_write(fmt)
+ assert_equal "1023.9999999999998863131622783839702606201171875", prv(1024).nio_write(fmt)
+
+ assert_equal "2.225073858507201383090232717332404064219215980462331830553327416887204434813918195854283159012511020564067339731035811005152434161553460108856012385377718821130777993532002330479610147442583636071921565046942503734208375250806650616658158948720491179968591639648500635908770118304874799780887753749949451580451605050915399856582470818645113537935804992115981085766051992433352114352390148795699609591288891602992641511063466313393663477586513029371762047325631781485664350872122828637642044846811407613911477062801689853244110024161447421618567166150540154285084716752901903161322778896729707373123334086988983175067838846926092773977972858659654941091369095406136467568702398678315290680984617210924625396728515625E-308",
+ MIN_N.nio_write(fmt)
+ assert_equal "2.2250738585072008890245868760858598876504231122409594654935248025624400092282356951787758888037591552642309780950434312085877387158357291821993020294379224223559819827501242041788969571311791082261043971979604000454897391938079198936081525613113376149842043271751033627391549782731594143828136275113838604094249464942286316695429105080201815926642134996606517803095075913058719846423906068637102005108723282784678843631944515866135041223479014792369585208321597621066375401613736583044193603714778355306682834535634005074073040135602968046375918583163124224521599262546494300836851861719422417646455137135420132217031370496583210154654068035397417906022589503023501937519773030945763173210852507299305089761582519159720757232455434770912461317493580281734466552734375E-308",
+ MAX_D.nio_write(fmt)
+ assert_equal "2.225073858507200394958941034839315711081630244019587100433722188237675583642553194503268618595007289964394616459051051412023043270117998255542591673498126023581185971968246077878183766819774580380287229348978296356771103136809189170558146173902184049999817014701706089569539838241444028984739501272818269238398287937541863482503350197395249647392622007205322474852963190178391854932391064931720791430455764953943127215325436859833344767109289929102154994338687742727610729450624487971196675896144263447425089844325111161570498002959146187656616550482084690619235135756396957006047593447154776156167693340095043268338435252390549256952840748419828640113148805198563919935252207510837343961185884248936392555587988206944151446491086954182492263498716056346893310546875E-308",
+ prv(MAX_D).nio_write(fmt)
+ assert_equal "9.88131291682493088353137585736442744730119605228649528851171365001351014540417503730599672723271984759593129390891435461853313420711879592797549592021563756252601426380622809055691634335697964207377437272113997461446100012774818307129968774624946794546339230280063430770796148252477131182342053317113373536374079120621249863890543182984910658610913088802254960259419999083863978818160833126649049514295738029453560318710477223100269607052986944038758053621421498340666445368950667144166486387218476578691673612021202301233961950615668455463665849580996504946155275185449574931216955640746893939906729403594535543517025132110239826300978220290207572547633450191167477946719798732961988232841140527418055848553508913045817507736501283943653106689453125E-324",
+ nxt(MIN_D).nio_write(fmt)
+ assert_equal "4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625E-324",
+ MIN_D.nio_write(fmt)
+
+ end
+
+ def test_float_nonsig
+
+ assert_equal "100.000000000000000#####", 100.0.nio_write(Fmt.prec(20,:fix).insignificant_digits('#'))
+
+ fmt = Fmt.mode(:sci,20).insignificant_digits('#').sci_digits(1)
+ assert_equal "3.3333333333333331###E-1", (1.0/3).nio_write(fmt)
+ assert_equal "3.3333333333333335###E6", (1E7/3).nio_write(fmt)
+ assert_equal "3.3333333333333334###E-8", (1E-7/3).nio_write(fmt)
+ assert_equal "3.3333333333333333333E-1", Rational(1,3).nio_write(fmt)
+ assert_equal "3.3333333333333331###E-1", (1.0/3).nio_write(fmt.dup.sci_digits(1))
+ assert_equal "33333333333333331###.E-20", (1.0/3).nio_write(fmt.dup.sci_digits(-1))
+ assert_equal "33333333333333333333.E-20", (Rational(1,3)).nio_write(fmt.dup.sci_digits(-1))
+
+ fmt.sci_digits! :eng
+ assert_equal "333.33333333333331###E-3", (1.0/3).nio_write(fmt)
+ assert_equal "3.3333333333333335###E6", (1E7/3).nio_write(fmt)
+ assert_equal "33.333333333333334###E-9",(1E-7/3).nio_write(fmt)
+
+ fmt = Fmt[:comma].mode(:sci,20).insignificant_digits('#').sci_digits(0)
+ assert_equal "0,33333333333333331###E0",(1.0/3).nio_write(fmt)
+ assert_equal "0,33333333333333335###E7",(1E7/3).nio_write(fmt)
+ assert_equal "0,33333333333333334###E-7",(1E-7/3).nio_write(fmt)
+
+ fmt = Fmt.mode(:sci,20).insignificant_digits('#').sci_digits(0)
+ assert_equal "0.10000000000000001###E0",(1E-1).nio_write(fmt)
+ assert_equal "0.50000000000000000###E0",(0.5).nio_write(fmt)
+ assert_equal "0.49999999999999994###E0",prv(0.5).nio_write(fmt)
+ assert_equal "0.50000000000000011###E0",nxt(0.5).nio_write(fmt)
+ assert_equal "0.22250738585072014###E-307",MIN_N.nio_write(fmt)
+ assert_equal "0.22250738585072009###E-307",MAX_D.nio_write(fmt)
+ assert_equal "0.5###################E-323",MIN_D.nio_write(fmt)
+ assert_equal "0.64000000000000000###E2",(64.0).nio_write(fmt)
+ assert_equal "0.6400000000000001####E2",(nxt(64.0)).nio_write(fmt)
+ assert_equal "0.6409999999999999####E2",(64.1).nio_write(fmt)
+ assert_equal "0.6412312300000001####E2",(64.123123).nio_write(fmt)
+ assert_equal "0.10000000000000001###E0",(0.1).nio_write(fmt)
+ assert_equal "0.6338253001141148####E30",nxt(Math.ldexp(0.5,100)).nio_write(fmt)
+ assert_equal "0.39443045261050599###E-30",nxt(Math.ldexp(0.5,-100)).nio_write(fmt)
+ assert_equal "0.10##################E-322",nxt(MIN_D).nio_write(fmt)
+ assert_equal "0.15##################E-322",nxt(nxt(MIN_D)).nio_write(fmt)
+
+ # note: 1E23 is equidistant from 2 Floats; one or the other will be chosen based on the rounding mode
+ x = Float.nio_read('1E23',Fmt.prec(:exact,:gen,:round=>:even))
+ assert_equal "1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:zero))
+ assert_equal "9.999999999999999E22",x.nio_write(Fmt.prec(:exact,:gen,:round=>:inf))
+ assert_equal "1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:even))
+
+ x = Float.nio_read('1E23',Fmt.prec(:exact,:gen,:round=>:zero))
+ assert_equal "1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:zero))
+ assert_equal "9.999999999999999E22",x.nio_write(Fmt.prec(:exact,:gen,:round=>:inf))
+ assert_equal "1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:even))
+
+ x = Float.nio_read('1E23',Fmt.prec(:exact,:gen,:round=>:inf))
+ assert_equal "1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:inf))
+ assert_equal "1.0000000000000001E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:zero))
+ assert_equal "1.0000000000000001E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:even))
+
+ x = Float.nio_read('-1E23',Fmt.prec(:exact,:gen,:round=>:even))
+ assert_equal "-1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:zero))
+ assert_equal "-9.999999999999999E22",x.nio_write(Fmt.prec(:exact,:gen,:round=>:inf))
+ assert_equal "-1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:even))
+
+ x = Float.nio_read('-1E23',Fmt.prec(:exact,:gen,:round=>:zero))
+ assert_equal "-1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:zero))
+ assert_equal "-9.999999999999999E22",x.nio_write(Fmt.prec(:exact,:gen,:round=>:inf))
+ assert_equal "-1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:even))
+
+ x = Float.nio_read('-1E23',Fmt.prec(:exact,:gen,:round=>:inf))
+ assert_equal "-1E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:inf))
+ assert_equal "-1.0000000000000001E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:zero))
+ assert_equal "-1.0000000000000001E23",x.nio_write(Fmt.prec(:exact,:gen,:round=>:even))
+
+ # note: for 64.1 there's only one closest Float;
+ # but it can be univocally expressed in decimal either as 64.09999999999999 or 64.1
+ x = Float.nio_read('64.1',Fmt.prec(:exact,:gen,:round=>:even))
+ assert_equal "64.09999999999999",x.nio_write(Fmt.prec(:exact,:gen).show_all_digits(true))
+ assert_equal "64.1",x.nio_write(Fmt.prec(:exact,:gen))
+
+ # to do: exact conversion of Rational(32095022417, 54517) should throw and exception
+ # (unless RepDec.max_d is greater than 27300 or so)
+
+
+ end
+
+ def test_special
+ assert BigDecimal.nio_read("NaN").nan?
+ assert Float.nio_read("NaN").nan?
+ assert_equal "NAN", BigDec("NaN").nio_write.upcase
+ assert_equal "NAN", BigDecimal.nio_read("NaN").nio_write.upcase
+ assert_equal "NAN", Float.nio_read("NaN").nio_write.upcase
+ assert_raises ZeroDivisionError do Rational.nio_read("NaN") end
+
+ assert !BigDecimal.nio_read('Infinity').finite?
+ assert !BigDecimal.nio_read('+Infinity').finite?
+ assert !BigDecimal.nio_read('-Infinity').finite?
+ assert !Float.nio_read('Infinity').finite?
+ assert !Float.nio_read('+Infinity').finite?
+ assert !Float.nio_read('-Infinity').finite?
+ assert_raises ZeroDivisionError do Rational.nio_read("Infinity") end
+ assert_raises ZeroDivisionError do Rational.nio_read("+Infinity") end
+ assert_raises ZeroDivisionError do Rational.nio_read("-Infinity") end
+ assert_equal BigDec(1)/0, BigDecimal.nio_read('Infinity')
+ assert_equal BigDec(-1)/0, BigDecimal.nio_read('-Infinity')
+ assert_equal '+Infinity', BigDecimal.nio_read('Infinity').nio_write
+ assert_equal '+Infinity', BigDecimal.nio_read('+Infinity').nio_write
+ assert_equal '-Infinity', BigDecimal.nio_read('-Infinity').nio_write
+ assert_equal '+Infinity', Float.nio_read('Infinity').nio_write
+ assert_equal '+Infinity', Float.nio_read('+Infinity').nio_write
+ assert_equal '-Infinity', Float.nio_read('-Infinity').nio_write
+
+ end
+
+ def test_conversions
+ x_txt = '1.234567890123456'
+ x_d = BigDecimal.nio_read(x_txt)
+ x_f = Float.nio_read(x_txt)
+ assert_equal 1.234567890123456, x_f
+ assert_equal BigDecimal(x_txt), x_d
+ assert_equal Fmt.convert(x_d,Float,:exact), x_f
+ assert_equal Fmt.convert(x_d,Float,:approx), x_f
+
+ x_d = BigDec(355)/226
+ x_f = Float(355)/226
+ assert_equal Fmt.convert(x_d,Float,:exact), x_f
+ assert_equal Fmt.convert(x_d,Float,:approx), x_f
+
+ end
+
+ def test_sign
+ assert_equal '1.23', 1.23.nio_write
+ assert_equal '+1.23', 1.23.nio_write(Fmt.show_plus)
+ assert_equal ' 1.23', 1.23.nio_write(Fmt.show_plus(' '))
+ assert_equal '-1.23', -1.23.nio_write
+ assert_equal '-1.23', -1.23.nio_write(Fmt.show_plus)
+ assert_equal '1.23E5', 1.23E5.nio_write(Fmt.mode(:sci))
+ assert_equal '-1.23E5', -1.23E5.nio_write(Fmt.mode(:sci))
+ assert_equal '1.23E-5', 1.23E-5.nio_write(Fmt.mode(:sci))
+ assert_equal '-1.23E-5', -1.23E-5.nio_write(Fmt.mode(:sci))
+ assert_equal '+1.23E5', 1.23E5.nio_write(Fmt.mode(:sci).show_plus)
+ assert_equal '-1.23E5', -1.23E5.nio_write(Fmt.mode(:sci).show_plus)
+ assert_equal ' 1.23E5', 1.23E5.nio_write(Fmt.mode(:sci).show_plus(' '))
+ assert_equal '-1.23E5', -1.23E5.nio_write(Fmt.mode(:sci).show_plus(' '))
+ assert_equal '1.23E+5', 1.23E5.nio_write(Fmt.mode(:sci).show_exp_plus)
+ assert_equal '-1.23E+5', -1.23E5.nio_write(Fmt.mode(:sci).show_exp_plus)
+ assert_equal '1.23E 5', 1.23E5.nio_write(Fmt.mode(:sci).show_exp_plus(' '))
+ assert_equal '-1.23E 5', -1.23E5.nio_write(Fmt.mode(:sci).show_exp_plus(' '))
+ assert_equal '1.23E-5', 1.23E-5.nio_write(Fmt.mode(:sci).show_exp_plus(' '))
+ assert_equal '-1.23E-5', -1.23E-5.nio_write(Fmt.mode(:sci).show_exp_plus(' '))
+ assert_equal ' 1.23E-5', 1.23E-5.nio_write(Fmt.mode(:sci).show_exp_plus(' ').show_plus)
+ assert_equal '-1.23E-5', -1.23E-5.nio_write(Fmt.mode(:sci).show_exp_plus(' ').show_plus)
+ assert_equal ' 1.23E 5', 1.23E5.nio_write(Fmt.mode(:sci).show_exp_plus(' ').show_plus)
+ assert_equal '-1.23E 5', -1.23E5.nio_write(Fmt.mode(:sci).show_exp_plus(' ').show_plus)
+ assert_equal '+1.23E-5', 1.23E-5.nio_write(Fmt.mode(:sci).show_exp_plus.show_plus)
+ assert_equal '-1.23E-5', -1.23E-5.nio_write(Fmt.mode(:sci).show_exp_plus.show_plus)
+ assert_equal '+1.23E+5', 1.23E5.nio_write(Fmt.mode(:sci).show_exp_plus.show_plus)
+ assert_equal '-1.23E+5', -1.23E5.nio_write(Fmt.mode(:sci).show_exp_plus.show_plus)
+ end
+
+
+end