I was curious as to why it would be possible to perform operations that
did
not result in zero, on a number smaller than Float::MIN. To me
Float::MIN
should be the smallest representable number that is not 0, yet on my
system
at least, I can perform valid operations on numbers smaller than
Float::MIN.
Is this a system dependent thing? Granted I can’t actually create the
number
by going ‘f = 4.94065645841247e-324’ as I get a ‘Float
4.94065645841247e-324out of range’ warning, and the only way to create
numbers smaller than
Float::MIN is to either unpack a binary representation of a smaller
number,
or divide Float::MIN by some number, but I think that is because of
checks
in the source checking the exponent or something.
It just had me curious as to if this is something people are aware of,
and
if there is some reason for it.
unpacked = “\0\0\0\0\0\0\0\1”.unpack(‘G’).first
smallish = Float::MIN / 100000000000000
smallest = Float::MIN / 3002399751580330.75 # (Smallest divisor that
will
result in a double value of 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01)
toosmall = Float::MIN / 9007199254740991.5 # (Smallest divisor that will
result in a double value of 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00)
floatmin = Float::MIN
puts 'Unpacked: ’ << unpacked.to_s << ’ class: ’ << unpacked.class.to_s
<< ’
Finite: ’ << unpacked.finite?.to_s << ’ Nan: ’ << unpacked.nan?.to_s
puts 'Smallish: ’ << smallish.to_s << ’ class: ’ << smallish.class.to_s
<< ’
Finite: ’ << smallish.finite?.to_s << ’ Nan: ’ << smallish.nan?.to_s
puts 'Smallest: ’ << smallest.to_s << ’ class: ’ << smallest.class.to_s
<< ’
Finite: ’ << smallest.finite?.to_s << ’ Nan: ’ << smallest.nan?.to_s
puts 'TooSmall: ’ << toosmall.to_s << ’ class: ’ << toosmall.class.to_s
<< ’
Finite: ’ << toosmall.finite?.to_s << ’ Nan: ’ << toosmall.nan?.to_s
puts 'Floatmin: ’ << floatmin.to_s << ’ class: ’ << floatmin.class.to_s
<< ’
Finite: ’ << floatmin.finite?.to_s << ’ Nan: ’ << floatmin.nan?.to_s
puts (smallest == unpacked).to_s
puts (unpacked < Float::MIN && smallest < Float::MIN && smallish <
Float::MIN).to_s
puts (smallish - unpacked).to_s
puts (smallish - smallest).to_s
puts (smallish - toosmall).to_s
puts (unpacked - smallish).to_s
puts (smallest - smallish).to_s
puts (toosmall - smallish).to_s
puts (9007199254740991.5 - 3002399751580330.75)
====================
Unpacked: 4.94065645841247e-324 class: Float Finite: true Nan: false
Smallish: 2.22329540628561e-322 class: Float Finite: true Nan: false
Smallest: 4.94065645841247e-324 class: Float Finite: true Nan: false
TooSmall: 0.0 class: Float Finite: true Nan: false
Floatmin: 2.2250738585072e-308 class: Float Finite: true Nan: false
true
true
2.17388884170148e-322
2.17388884170148e-322
2.22329540628561e-322
-2.17388884170148e-322
-2.17388884170148e-322
-2.22329540628561e-322
6.00479950316066e+15
–
“Every child has many wishes. Some include a wallet, two chicks and a
cigar,
but that’s another story.”