चल बिन्दु संख्या की प्रकृति का मतलब है कि यह जांच को कोई मतलब नहीं है एक फ्लोटिंग प्वाइंट संख्या तर्कसंगत है, के बाद से सभी चल बिन्दु संख्या वास्तव में प्रपत्र n/2 ई की भिन्न हैं। हालांकि, आप शायद यह जानना चाहें कि सरल अंश (2 की एक बड़ी शक्ति के बजाए एक छोटे से denominator के साथ) है जो किसी दिए गए फ़्लोटिंग-पॉइंट नंबर का बारीकी से अनुमान लगाता है।
डोनाल्ड Knuth में इस बाद की समस्या पर चर्चा करता है कंप्यूटर प्रोग्रामिंग की कला मात्रा II। 4.53-39 व्यायाम करने का उत्तर देखें। विचार श्रेणी के अंत बिंदुओं को निरंतर भिन्नताओं के रूप में विस्तारित करके, सीमा के अंत में सबसे कम मूल्य वाले अंश को खोजना है, जब तक कि उनके गुणांक बराबर हों, और फिर जब वे भिन्न हों, तो उनके बीच सबसे सरल मूल्य लें।
from fractions import Fraction
from math import modf
def simplest_fraction_in_interval(x, y):
"""Return the fraction with the lowest denominator in [x,y]."""
if x == y:
# The algorithm will not terminate if x and y are equal.
raise ValueError("Equal arguments.")
elif x < 0 and y < 0:
# Handle negative arguments by solving positive case and negating.
return -simplest_fraction_in_interval(-y, -x)
elif x <= 0 or y <= 0:
# One argument is 0, or arguments are on opposite sides of 0, so
# the simplest fraction in interval is 0 exactly.
return Fraction(0)
else:
# Remainder and Coefficient of continued fractions for x and y.
xr, xc = modf(1/x);
yr, yc = modf(1/y);
if xc < yc:
return Fraction(1, int(xc) + 1)
elif yc < xc:
return Fraction(1, int(yc) + 1)
else:
return 1/(int(xc) + simplest_fraction_in_interval(xr, yr))
def approximate_fraction(x, e):
"""Return the fraction with the lowest denominator that differs
from x by no more than e."""
return simplest_fraction_in_interval(x - e, x + e)
और यहाँ हैं कुछ परिणाम:
>>> approximate_fraction(6.75, 0.01)
Fraction(27, 4)
>>> approximate_fraction(math.pi, 0.00001)
Fraction(355, 113)
>>> approximate_fraction((1 + math.sqrt(5))/2, 0.00001)
Fraction(377, 233)
स्रोत
2010-11-24 12:53:44
इरेशनल्स को अनुपात (नाल) द्वारा प्रतिनिधित्व नहीं किया जा सकता है - यह कि बहुत परिभाषा और नाम का स्रोत है! – delnan
@ डेलनान, एफडब्ल्यूआईडब्ल्यू, उन्हें राशन के रूप में दर्शाया जा सकता है। औपचारिक रूप से ऐसा करने के लिए सामान्य उपयोग में दोनों विधियां (डेडेकेंड कट और कौची श्रृंखला) ऐसा करने के लिए राशन का उपयोग करती हैं। वे सिर्फ एक अनंत राशि का उपयोग करते हैं :) – aaronasterling
कुछ वास्तविक मज़ेदार निरंतर भिन्नताओं को देखने के लिए। स्वयं को एक समाधान लागू करने के लिए, आप निरंतर अंश करते हैं जब तक कि यह सटीक अंश न हो या आपके स्वाद के लिए denominator बहुत बड़ा हो जाए। – phkahler