From: Christian Date: 2007-10-21T16:29:05+09:00 Subject: Float::MIN Not an actual minimum? ------=_Part_11756_12275215.1192951747132 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline 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." ------=_Part_11756_12275215.1192951747132--