Module: Nio::Clinger
- Defined in:
- lib/nio/fmt.rb
Overview
:nodoc: all
Class Method Summary collapse
- .algM(f, e, round_mode, eb = 10, beta = Float::RADIX, n = Float::MANT_DIG, min_e = Float::MIN_EXP-Float::MANT_DIG, max_e = Float::MAX_EXP-Float::MANT_DIG) ⇒ Object
-
.nextfloat(x) ⇒ Object
valid only for non-negative x.
-
.prevfloat(x) ⇒ Object
valid only for non-negative x.
- .ratio_float(u, v, k, round_mode, beta = Float::RADIX, n = Float::MANT_DIG) ⇒ Object
Class Method Details
.algM(f, e, round_mode, eb = 10, beta = Float::RADIX, n = Float::MANT_DIG, min_e = Float::MIN_EXP-Float::MANT_DIG, max_e = Float::MAX_EXP-Float::MANT_DIG) ⇒ Object
1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 |
# File 'lib/nio/fmt.rb', line 1278 def algM(f,e,round_mode,eb=10,beta=Float::RADIX,n=Float::MANT_DIG,min_e=Float::MIN_EXP-Float::MANT_DIG,max_e=Float::MAX_EXP-Float::MANT_DIG) if e<0 u,v,k = f,eb**(-e),0 else u,v,k = f*(eb**e),1,0 end loop do x = u.div(v) # overflow if k>=max_e if (x>=beta**(n-1) && x<beta**n) || k==min_e || k==max_e return ratio_float(u,v,k,round_mode,beta,n) elsif x<beta**(n-1) u *= beta k -= 1 elsif x>=beta**n v *= beta k += 1 end end end |
.nextfloat(x) ⇒ Object
valid only for non-negative x
1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 |
# File 'lib/nio/fmt.rb', line 1318 def nextfloat(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) if f==(1.0 - Math.ldexp(1,-Float::MANT_DIG)) x + dx*2 else x + dx end end |
.prevfloat(x) ⇒ Object
valid only for non-negative x
1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 |
# File 'lib/nio/fmt.rb', line 1331 def prevfloat(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) if e==Float::MIN_EXP || f!=0.5 #0.5==Math.ldexp(2**(bits-1),-Float::MANT_DIG) x - dx else x - dx/2 # x - Math.ldexp(Math.ldexp(1.0,-Float::MANT_DIG),e-1) end end |
.ratio_float(u, v, k, round_mode, beta = Float::RADIX, n = Float::MANT_DIG) ⇒ Object
1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 |
# File 'lib/nio/fmt.rb', line 1302 def ratio_float(u,v,k,round_mode,beta=Float::RADIX,n=Float::MANT_DIG) q,r = u.divmod(v) v_r = v-r z = Math.ldexp(q,k) if r<v_r z elsif r>v_r nextfloat z elsif (round_mode==:even && q.even?) || (round_mode==:zero) z else nextfloat z end end |