Class: Flt::Num
- Inherits:
-
Object
- Object
- Flt::Num
- Includes:
- Nio::Formattable
- Defined in:
- lib/nio/rtnlzr.rb,
lib/nio/rtnlzr.rb,
lib/nio/fmt.rb
Class Method Summary collapse
Instance Method Summary collapse
Methods included from Nio::Formattable
append_features, #nio_round, #nio_write
Class Method Details
.nio_read_neutral(neutral) ⇒ Object
1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 |
# File 'lib/nio/fmt.rb', line 1730 def self.nio_read_neutral(neutral) x = nil if neutral.special? case neutral.special when :nan x = num_class.nan when :inf x = num_class.infinity(neutral.sign=='-' ? '-1.0' : '+1.0') end elsif neutral.rep_pos<neutral.digits.length # uses num_clas.context.precision TODO: ? x = num_class.new Rational(*neutral.to_RepDec.getQ) else if neutral.base==num_class.radix if neutral.base==10 str = neutral.sign str += neutral.digits str += "E#{(neutral.dec_pos-neutral.digits.length)}" x = num_class.new(str) else f = neutral.digits.to_i(neutral.base) e = neutral.dec_pos-neutral.digits.length s = neutral.sign=='-' ? -1 : +1 x = num_class.Num(s, f, e) end else # uses num_clas.context.precision TODO: ? if num_class.respond_to?(:power) x = num_class.Num(neutral.digits.to_i(neutral.base).to_s) x *= num_class.Num(neutral.base.to_s)**(neutral.dec_pos-neutral.digits.length) x = -x if neutral.sign=='-' else # uses num_clas.context.precision TODO: ? x = num_class.new Rational(*neutral.to_RepDec.getQ) end end end return x end |
Instance Method Details
#nio_r(tol = nil) ⇒ Object
132 133 134 135 136 137 138 139 140 |
# File 'lib/nio/rtnlzr.rb', line 132 def nio_r(tol = nil) tol ||= Flt.Tolerance(Rational(1,2),:ulps) case tol when Integer Rational(*Nio::Rtnlzr.max_denominator(self,tol,num_class)) else Rational(*Nio::Rtnlzr.new(tol).rationalize(self)) end end |
#nio_write_neutral(fmt) ⇒ Object
1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 |
# File 'lib/nio/fmt.rb', line 1775 def nio_write_neutral(fmt) neutral = Nio::NeutralNum.new x = self if x.nan? neutral.set_special(:nan) elsif x.infinite? neutral.set_special(:inf, x<0 ? '-' : '+') else converted = false if fmt.get_ndig==:exact && fmt.get_approx==:simplify neutral = x.nio_r(Flt.Tolerance('0.5', :ulps)).nio_write_neutral(fmt) # TODO: find better method to accept the conversion prc = (fmt.get_base==num_class.radix) ? x.number_of_digits : x.coefficient.to_s(fmt.get_base).length prc = [prc, 8].max converted = true if neutral.digits.length<prc elsif fmt.get_approx==:exact && fmt.get_base!=num_class.radix # TODO: num_class.context(:precision=>fmt.... neutral = x.to_r.nio_write_neutral(fmt) converted = true end if !converted if fmt.get_base==num_class.radix sign = x.sign==-1 ? '-' : '+' txt = x.coefficient.to_s(fmt.get_base) # TODO: can use x.digits directly? dec_pos = rep_pos = x.fractional_exponent neutral.set sign, txt, dec_pos, nil, fmt.get_base_digits, false ,fmt.get_round converted = true end end if !converted min_exp = num_class.context.etiny n = x.number_of_digits s,f,e = x.split b = num_class.radix if s < 0 sign = '-' else sign = '+' end prc = x.number_of_digits f = num_class.int_mult_radix_power(f, prc-n) e -= (prc-n) inexact = true rounding = case fmt.get_round when :even :half_even when :zero :half_down when :inf :half_up when :truncate :down when :directed_up :up when :floor :floor when :ceil :ceil else nil end # TODO: use Num#format instead # Note: it is assumed that fmt will be used for for input too, otherwise # rounding should be Float.context.rounding (input rounding for Float) rather than fmt.get_round (output) formatter = Flt::Support::Formatter.new(num_class.radix, num_class.context.etiny, fmt.get_base) formatter.format(x, f, e, rounding, prc, fmt.get_all_digits?) inexact = formatter.round_up if formatter.round_up.is_a?(Symbol) dec_pos,digits = formatter.digits txt = '' digits.each{|d| txt << fmt.get_base_digits.digit_char(d)} neutral.set sign, txt, dec_pos, nil, fmt.get_base_digits, inexact, fmt.get_round end end return neutral end |
#nio_xr ⇒ Object
80 81 82 |
# File 'lib/nio/rtnlzr.rb', line 80 def nio_xr to_r end |