From: "Florian G. Pflug" Date: 2005-05-06T02:35:04+09:00 Subject: Re: Float to Rational --------------ms070508070500030009020000 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Jannis Harder wrote: > Luke Galea wrote: > >> Hi All, >> >> I need to convert a float to a fraction.. So 1.5 to 1 1/2.. >> The rational class would represent at least 3/2 well.. but I was >> surprised to find that there is no way to easily go from float to >> rational.. >> Am I missing an easier way? >> Thanks in advance >> > I wrote a small float => rational method: Here is another one - it's probably much slower, but works better for corner-cases like (0.2).to_r class Numeric def to_r chain_fractions.reverse.inject(nil) do |r,a| Rational(a) + (r.nil? ? 0 : (Rational(1) / r)) end end end class Integer def chain_fractions [self] end end class Float def chain_fractions remainder = self if ! block_given? then coefficients = Array::new end while (true) do if block_given? then yield remainder.floor else coefficients << remainder.floor end break if remainder == remainder.floor remainder = 1 / (remainder - remainder.floor) end coefficients end end greetings, Florian Pflug --------------ms070508070500030009020000 Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIL4DCC BewwggVVoAMCAQICAzAABDANBgkqhkiG9w0BAQQFADCByDELMAkGA1UEBhMCQVQxDzANBgNV BAgTBlZpZW5uYTEPMA0GA1UEBxMGVmllbm5hMSEwHwYDVQQKExhzb2x1dGlvbi14IFNvZnR3 YXJlIEdtYkgxHjAcBgNVBAsTFUNlcnRpZmljYXRlIEF1dGhvcml0eTEqMCgGA1UEAxMhc29s dXRpb24teDo6Y2VydGlmaWNhdGUtYXV0aG9yaXR5MSgwJgYJKoZIhvcNAQkBFhlob3N0bWFz dGVyQHNvbHV0aW9uLXguY29tMB4XDTA0MTAwODE4MTkxN1oXDTA5MTAwODE4MTkxN1owgdUx CzAJBgNVBAYTAkFUMQ8wDQYDVQQIEwZWaWVubmExDzANBgNVBAcTBlZpZW5uYTEhMB8GA1UE ChMYc29sdXRpb24teCBTb2Z0d2FyZSBHbWJIMSkwJwYDVQQKEyBjMjFmOTY5YjVmMDNkMzNk NDNlMDRmOGYxMzZlNzY4MjEeMBwGA1UECxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MRkwFwYD VQQDExBGbG9yaWFuIEcuIFBmbHVnMRswGQYJKoZIhvcNAQkBFgxmZ3BAcGhsby5vcmcwgZ8w DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPaQmTO2jrGX3ZKnGs4+VWaQhLkqUYfeL2jzI4Xa 2amxM7T/mdAzEsyXY5yQd2itdgfX2QFeSdIpB7/kF8NdxEK2jCeYSAwbqw+YXulAg3E4XKR5 qOROdEZIy50/K4X0yKeU/xy5LmIfLoqfJQ2Ao5XQarTvBRPbAnJmITSqkBHZAgMBAAGjggLT MIICzzAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIFoDAOBgNVHQ8BAf8EBAMCBeAwHQYD VR0lBBYwFAYIKwYBBQUHAwQGCCsGAQUFBwMCMB0GA1UdDgQWBBSn0xyNYO5HD0vtMeCcUCTz J13zozCB9QYDVR0jBIHtMIHqgBTaa1BCkjUW3vQWeh5IMqml0irzFKGBzqSByzCByDELMAkG A1UEBhMCQVQxDzANBgNVBAgTBlZpZW5uYTEPMA0GA1UEBxMGVmllbm5hMSEwHwYDVQQKExhz b2x1dGlvbi14IFNvZnR3YXJlIEdtYkgxHjAcBgNVBAsTFUNlcnRpZmljYXRlIEF1dGhvcml0 eTEqMCgGA1UEAxMhc29sdXRpb24teDo6Y2VydGlmaWNhdGUtYXV0aG9yaXR5MSgwJgYJKoZI hvcNAQkBFhlob3N0bWFzdGVyQHNvbHV0aW9uLXguY29tggEAMBcGA1UdEQQQMA6BDGZncEBw aGxvLm9yZzAkBgNVHRIEHTAbgRlob3N0bWFzdGVyQHNvbHV0aW9uLXguY29tMEkGA1UdHwRC MEAwPqA8oDqGOGh0dHBzOi8vYWRtaW4uaHEuc29sdXRpb24teC5jb20vcGhwa2kvY2Fjcmwv c3hfY2FjcmwuY3JsMEIGCWCGSAGG+EIBDQQ1FjNQSFBraS9PcGVuU1NMIEdlbmVyYXRlZCBF LW1haWwgKFMvTUlNRSkgQ2VydGlmaWNhdGUwNAYJYIZIAYb4QgECBCcWJWh0dHBzOi8vYWRt aW4uaHEuc29sdXRpb24teC5jb20vcGhwa2kwIwYJYIZIAYb4QgEDBBYWFG5zX3Jldm9rZV9x dWVyeS5waHA/MEAGCWCGSAGG+EIBCAQzFjFodHRwczovL2FkbWluLmhxLnNvbHV0aW9uLXgu Y29tL3BocGtpL3BvbGljeS5odG1sMA0GCSqGSIb3DQEBBAUAA4GBAIpKvrQrG2shBRMGfyGw 4068QBerNs9JMYvkEuaJqZ3Xsdz8Ju+sA4090r9v6BtdZWJ29opyj34+l9Q/BM8mKoIHUB8U Vy0iNpL0rsB9wphSCva4vnyO+Y9okcC+kgCcY8QAqq+z929pMURLtWcJeQS1L4Ae0qzL+3Ry cp+WdH3GMIIF7DCCBVWgAwIBAgIDMAAEMA0GCSqGSIb3DQEBBAUAMIHIMQswCQYDVQQGEwJB VDEPMA0GA1UECBMGVmllbm5hMQ8wDQYDVQQHEwZWaWVubmExITAfBgNVBAoTGHNvbHV0aW9u LXggU29mdHdhcmUgR21iSDEeMBwGA1UECxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSowKAYD VQQDEyFzb2x1dGlvbi14OjpjZXJ0aWZpY2F0ZS1hdXRob3JpdHkxKDAmBgkqhkiG9w0BCQEW GWhvc3RtYXN0ZXJAc29sdXRpb24teC5jb20wHhcNMDQxMDA4MTgxOTE3WhcNMDkxMDA4MTgx OTE3WjCB1TELMAkGA1UEBhMCQVQxDzANBgNVBAgTBlZpZW5uYTEPMA0GA1UEBxMGVmllbm5h MSEwHwYDVQQKExhzb2x1dGlvbi14IFNvZnR3YXJlIEdtYkgxKTAnBgNVBAoTIGMyMWY5Njli NWYwM2QzM2Q0M2UwNGY4ZjEzNmU3NjgyMR4wHAYDVQQLExVDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxGTAXBgNVBAMTEEZsb3JpYW4gRy4gUGZsdWcxGzAZBgkqhkiG9w0BCQEWDGZncEBwaGxv Lm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA9pCZM7aOsZfdkqcazj5VZpCEuSpR h94vaPMjhdrZqbEztP+Z0DMSzJdjnJB3aK12B9fZAV5J0ikHv+QXw13EQraMJ5hIDBurD5he 6UCDcThcpHmo5E50RkjLnT8rhfTIp5T/HLkuYh8uip8lDYCjldBqtO8FE9sCcmYhNKqQEdkC AwEAAaOCAtMwggLPMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgWgMA4GA1UdDwEB/wQE AwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDBAYIKwYBBQUHAwIwHQYDVR0OBBYEFKfTHI1g7kcP S+0x4JxQJPMnXfOjMIH1BgNVHSMEge0wgeqAFNprUEKSNRbe9BZ6HkgyqaXSKvMUoYHOpIHL MIHIMQswCQYDVQQGEwJBVDEPMA0GA1UECBMGVmllbm5hMQ8wDQYDVQQHEwZWaWVubmExITAf BgNVBAoTGHNvbHV0aW9uLXggU29mdHdhcmUgR21iSDEeMBwGA1UECxMVQ2VydGlmaWNhdGUg QXV0aG9yaXR5MSowKAYDVQQDEyFzb2x1dGlvbi14OjpjZXJ0aWZpY2F0ZS1hdXRob3JpdHkx KDAmBgkqhkiG9w0BCQEWGWhvc3RtYXN0ZXJAc29sdXRpb24teC5jb22CAQAwFwYDVR0RBBAw DoEMZmdwQHBobG8ub3JnMCQGA1UdEgQdMBuBGWhvc3RtYXN0ZXJAc29sdXRpb24teC5jb20w SQYDVR0fBEIwQDA+oDygOoY4aHR0cHM6Ly9hZG1pbi5ocS5zb2x1dGlvbi14LmNvbS9waHBr aS9jYWNybC9zeF9jYWNybC5jcmwwQgYJYIZIAYb4QgENBDUWM1BIUGtpL09wZW5TU0wgR2Vu ZXJhdGVkIEUtbWFpbCAoUy9NSU1FKSBDZXJ0aWZpY2F0ZTA0BglghkgBhvhCAQIEJxYlaHR0 cHM6Ly9hZG1pbi5ocS5zb2x1dGlvbi14LmNvbS9waHBraTAjBglghkgBhvhCAQMEFhYUbnNf cmV2b2tlX3F1ZXJ5LnBocD8wQAYJYIZIAYb4QgEIBDMWMWh0dHBzOi8vYWRtaW4uaHEuc29s dXRpb24teC5jb20vcGhwa2kvcG9saWN5Lmh0bWwwDQYJKoZIhvcNAQEEBQADgYEAikq+tCsb ayEFEwZ/IbDjTrxAF6s2z0kxi+QS5ompndex3Pwm76wDjT3Sv2/oG11lYnb2inKPfj6X1D8E zyYqggdQHxRXLSI2kvSuwH3CmFIK9ri+fI75j2iRwL6SAJxjxACqr7P3b2kxREu1Zwl5BLUv gB7SrMv7dHJyn5Z0fcYxggP2MIID8gIBATCB0DCByDELMAkGA1UEBhMCQVQxDzANBgNVBAgT BlZpZW5uYTEPMA0GA1UEBxMGVmllbm5hMSEwHwYDVQQKExhzb2x1dGlvbi14IFNvZnR3YXJl IEdtYkgxHjAcBgNVBAsTFUNlcnRpZmljYXRlIEF1dGhvcml0eTEqMCgGA1UEAxMhc29sdXRp b24teDo6Y2VydGlmaWNhdGUtYXV0aG9yaXR5MSgwJgYJKoZIhvcNAQkBFhlob3N0bWFzdGVy QHNvbHV0aW9uLXguY29tAgMwAAQwCQYFKw4DAhoFAKCCAnswGAYJKoZIhvcNAQkDMQsGCSqG SIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMDUwNTA1MTczNDU2WjAjBgkqhkiG9w0BCQQxFgQU CNRXeKjtEXc3J5F2bIKiYtsG+44wUgYJKoZIhvcNAQkPMUUwQzAKBggqhkiG9w0DBzAOBggq hkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcNAwICASgwgeEG CSsGAQQBgjcQBDGB0zCB0DCByDELMAkGA1UEBhMCQVQxDzANBgNVBAgTBlZpZW5uYTEPMA0G A1UEBxMGVmllbm5hMSEwHwYDVQQKExhzb2x1dGlvbi14IFNvZnR3YXJlIEdtYkgxHjAcBgNV BAsTFUNlcnRpZmljYXRlIEF1dGhvcml0eTEqMCgGA1UEAxMhc29sdXRpb24teDo6Y2VydGlm aWNhdGUtYXV0aG9yaXR5MSgwJgYJKoZIhvcNAQkBFhlob3N0bWFzdGVyQHNvbHV0aW9uLXgu Y29tAgMwAAQwgeMGCyqGSIb3DQEJEAILMYHToIHQMIHIMQswCQYDVQQGEwJBVDEPMA0GA1UE CBMGVmllbm5hMQ8wDQYDVQQHEwZWaWVubmExITAfBgNVBAoTGHNvbHV0aW9uLXggU29mdHdh cmUgR21iSDEeMBwGA1UECxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSowKAYDVQQDEyFzb2x1 dGlvbi14OjpjZXJ0aWZpY2F0ZS1hdXRob3JpdHkxKDAmBgkqhkiG9w0BCQEWGWhvc3RtYXN0 ZXJAc29sdXRpb24teC5jb20CAzAABDANBgkqhkiG9w0BAQEFAASBgBb3H3Ec8rzh1ywt6kiG hvk3IMn6EOv02zH4/k2EaA1z+QNv53nJolOwGfU4Zu7mgn1uJJTJOkoDQaagPFA3CpApB0Ah UcAxQ9Ci4RhuT36rnqSmyRzdndCBy1gE/XiQZerT0h4yMBqchzZ3+ovU2IGS8TqV+EgEgWC3 zPzCzNaVAAAAAAAA --------------ms070508070500030009020000--