fractions concept (#3555)
* fractions concept * added links, tried to clarify wording * Update concepts/fractions/about.md Co-authored-by: BethanyG <BethanyG@users.noreply.github.com> * Update concepts/fractions/about.md Co-authored-by: BethanyG <BethanyG@users.noreply.github.com> * Update concepts/fractions/about.md Co-authored-by: BethanyG <BethanyG@users.noreply.github.com> * Update concepts/fractions/about.md Co-authored-by: BethanyG <BethanyG@users.noreply.github.com> * Update concepts/fractions/about.md Co-authored-by: BethanyG <BethanyG@users.noreply.github.com> * Update concepts/fractions/about.md Co-authored-by: BethanyG <BethanyG@users.noreply.github.com> * Update concepts/fractions/about.md Co-authored-by: BethanyG <BethanyG@users.noreply.github.com> * Update concepts/fractions/about.md Co-authored-by: BethanyG <BethanyG@users.noreply.github.com> * Update concepts/fractions/about.md Co-authored-by: BethanyG <BethanyG@users.noreply.github.com> * Update concepts/fractions/about.md Co-authored-by: BethanyG <BethanyG@users.noreply.github.com> * Update concepts/fractions/about.md Co-authored-by: BethanyG <BethanyG@users.noreply.github.com> * Introduction from About Added some links and edited config.json. --------- Co-authored-by: BethanyG <BethanyG@users.noreply.github.com>
This commit is contained in:
5
concepts/fractions/.meta/config.json
Normal file
5
concepts/fractions/.meta/config.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"blurb": "The fractions module enables working with rational numbers, which preserve exact values and avoid the rounding errors common with floats.",
|
||||
"authors": ["BethanyG", "colinleach"],
|
||||
"contributors": []
|
||||
}
|
||||
122
concepts/fractions/about.md
Normal file
122
concepts/fractions/about.md
Normal file
@@ -0,0 +1,122 @@
|
||||
# About
|
||||
|
||||
The [`Fractions`][fractions] module allows us to create and work with [`rational numbers`][rational]: fractions with an integer numerator divided by an integer denominator.
|
||||
|
||||
For example, we can store `2/3` as an exact fraction instead of the approximate `float` value `0.6666...`
|
||||
|
||||
## Creating Fractions
|
||||
|
||||
|
||||
Unlike `int`, `float`, and `complex` numbers, fractions do not have a literal form.
|
||||
However, the fractions constructor is quite flexible.
|
||||
|
||||
Most obviously, it can take take two integers.
|
||||
Common factors are automatically removed, converting the fraction to its "lowest form": the smallest integers that accurately represent the fraction.
|
||||
|
||||
|
||||
```python
|
||||
>>> from fractions import Fraction
|
||||
|
||||
>>> f1 = Fraction(2, 3) # 2/3
|
||||
>>> f1
|
||||
Fraction(2, 3)
|
||||
|
||||
>>> f2 = Fraction(6, 9)
|
||||
>>> f2
|
||||
Fraction(2, 3) # automatically simplified
|
||||
|
||||
>>> f1 == f2
|
||||
True
|
||||
```
|
||||
|
||||
The fractions constructor can also parse a string representation:
|
||||
|
||||
|
||||
```python
|
||||
>>> f3 = Fraction('2/3')
|
||||
>>> f3
|
||||
Fraction(2, 3)
|
||||
```
|
||||
|
||||
It can also work with `float` parameters, but this may run into problems with the approximate nature of representing the decimal value internally as binary.
|
||||
For more on this representation issue, see the [0.30000000000000004][0.30000000000000004] website, and [Floating Point Arithmetic: Issues and Limitations ][fp-issues] in the Python documentation.
|
||||
|
||||
For a more reliable result when using floats with fractions, there is the `<fraction>.limit_denominator()` method.
|
||||
|
||||
|
||||
[`.limit_denominator()`][limit_denominator] can take an integer parameter if you have specific requirements, but even the default (`max_denominator=1000000`) can work well and give an acceptable, simple approximation.
|
||||
|
||||
```python
|
||||
>>> Fraction(1.2)
|
||||
Fraction(5404319552844595, 4503599627370496)
|
||||
|
||||
>>> Fraction(1.2).limit_denominator()
|
||||
Fraction(6, 5)
|
||||
```
|
||||
|
||||
## Arithmetic with Fractions
|
||||
|
||||
|
||||
The usual [`arithmetic operators`][operators] `+ - * / **` work with fractions, as with other numeric types.
|
||||
|
||||
Integers and other `Fraction`s can be included and give a `Fraction` result.
|
||||
Including a `float` in the expression results in `float` output, with a consequent (possible) loss in precision.
|
||||
|
||||
|
||||
```python
|
||||
>>> Fraction(2, 3) + Fraction(1, 4) # addition
|
||||
Fraction(11, 12)
|
||||
|
||||
>>> Fraction(2, 3) * Fraction(6, 5) # multiply fractions
|
||||
Fraction(4, 5)
|
||||
|
||||
>>> Fraction(2, 3) * 6 / 5 # fraction with integers
|
||||
Fraction(4, 5)
|
||||
|
||||
>>> Fraction(2, 3) * 1.2 # fraction with float -> float
|
||||
0.7999999999999999
|
||||
|
||||
>>> Fraction(2, 3) ** 2 # exponentiation with integer
|
||||
Fraction(4, 9)
|
||||
```
|
||||
|
||||
## Conversions to and from Fractions
|
||||
|
||||
|
||||
Fractions are great for preserving precision during intermediate calculations, but may not be what you want for the final output.
|
||||
|
||||
It is possible to get the numerator and denominator individually or as a tuple ([`tuples`][tuple] will be discussed in a later Concept):
|
||||
|
||||
```python
|
||||
>>> Fraction(2, 3).numerator
|
||||
2
|
||||
>>> Fraction(2, 3).denominator
|
||||
3
|
||||
>>> Fraction(2, 3).as_integer_ratio()
|
||||
(2, 3)
|
||||
```
|
||||
|
||||
Various standard Python numeric functions also give the result you might expect from working with `int` and `float` types:
|
||||
|
||||
```python
|
||||
>>> round(Fraction(11, 3))
|
||||
4
|
||||
|
||||
>>> from math import floor, ceil
|
||||
>>> floor(Fraction(11, 3))
|
||||
3
|
||||
>>> ceil(Fraction(11, 3))
|
||||
4
|
||||
|
||||
>>> float(Fraction(11, 3))
|
||||
3.6666666666666665
|
||||
```
|
||||
|
||||
[fractions]: https://docs.python.org/3/library/fractions.html
|
||||
[0.30000000000000004]: https://0.30000000000000004.com/
|
||||
[fp-issues]: https://docs.python.org/3/tutorial/floatingpoint.html#tut-fp-issues
|
||||
[tuple]: https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences
|
||||
|
||||
[operators]: https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex
|
||||
[rational]: https://en.wikipedia.org/wiki/Rational_number
|
||||
[limit_denominator]: https://docs.python.org/3/library/fractions.html
|
||||
85
concepts/fractions/introduction.md
Normal file
85
concepts/fractions/introduction.md
Normal file
@@ -0,0 +1,85 @@
|
||||
# Introduction
|
||||
|
||||
The [`Fractions`][fractions] module allows us to create and work with [`rational numbers`][rational]: fractions with an integer numerator divided by an integer denominator.
|
||||
For example, we can store `2/3` as an exact fraction instead of the approximate `float` value `0.6666...`.
|
||||
|
||||
Unlike `int`, `float`, and `complex` numbers, fractions do not have a literal form.
|
||||
However, the fractions constructor is quite flexible.
|
||||
|
||||
Most obviously, it can take take two integers as arguments.
|
||||
Common factors are automatically removed, converting the fraction to its "lowest form": the smallest integers that accurately represent the fraction:
|
||||
|
||||
```python
|
||||
>>> from fractions import Fraction
|
||||
|
||||
>>> f1 = Fraction(2, 3) # 2/3
|
||||
>>> f1
|
||||
Fraction(2, 3)
|
||||
|
||||
>>> f2 = Fraction(6, 9)
|
||||
>>> f2
|
||||
Fraction(2, 3) # automatically simplified
|
||||
|
||||
>>> f1 == f2
|
||||
True
|
||||
```
|
||||
|
||||
The fractions constructor can also parse a string representation:
|
||||
|
||||
```python
|
||||
>>> f3 = Fraction('2/3')
|
||||
>>> f3
|
||||
Fraction(2, 3)
|
||||
```
|
||||
|
||||
Fractions can also work with `float` parameters, but this may run into problems with the approximate nature of representing the decimal value internally as binary.
|
||||
For more on this representation issue, see the [0.30000000000000004][0.30000000000000004] website, and [Floating Point Arithmetic: Issues and Limitations ][fp-issues] in the Python documentation.
|
||||
|
||||
For a more reliable result when using floats with fractions, there is the `<fraction>.limit_denominator()` method.
|
||||
|
||||
|
||||
## Arithmetic with Fractions
|
||||
|
||||
The usual [`arithmetic operators`][operators] `+ - * / **` will work with fractions, as with other numeric types.
|
||||
|
||||
Integers and other `Fraction`s can be included in the equation and give a `Fraction` result.
|
||||
Including a `float` in the expression results in `float` output, with a consequent (possible) loss in precision:
|
||||
|
||||
```python
|
||||
>>> Fraction(2, 3) + Fraction(1, 4) # addition
|
||||
Fraction(11, 12)
|
||||
|
||||
>>> Fraction(2, 3) * Fraction(6, 5) # multiply fractions
|
||||
Fraction(4, 5)
|
||||
|
||||
>>> Fraction(2, 3) * 6 / 5 # fraction with integers
|
||||
Fraction(4, 5)
|
||||
|
||||
>>> Fraction(2, 3) * 1.2 # fraction with float -> float
|
||||
0.7999999999999999
|
||||
|
||||
>>> Fraction(2, 3) ** 2 # exponentiation with integer
|
||||
Fraction(4, 9)
|
||||
```
|
||||
|
||||
Various standard Python numeric functions also give the result you might expect from working with `int` and `float` types:
|
||||
|
||||
```python
|
||||
>>> round(Fraction(11, 3))
|
||||
4
|
||||
|
||||
>>> from math import floor, ceil
|
||||
>>> floor(Fraction(11, 3))
|
||||
3
|
||||
>>> ceil(Fraction(11, 3))
|
||||
4
|
||||
|
||||
>>> float(Fraction(11, 3))
|
||||
3.6666666666666665
|
||||
```
|
||||
|
||||
[0.30000000000000004]: https://0.30000000000000004.com/
|
||||
[fp-issues]: https://docs.python.org/3/tutorial/floatingpoint.html#tut-fp-issues
|
||||
[fractions]: https://docs.python.org/3/library/fractions.html
|
||||
[operators]: https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex
|
||||
[rational]: https://en.wikipedia.org/wiki/Rational_number
|
||||
18
concepts/fractions/links.json
Normal file
18
concepts/fractions/links.json
Normal file
@@ -0,0 +1,18 @@
|
||||
[
|
||||
{
|
||||
"url": "https://docs.python.org/3/library/fractions.html/",
|
||||
"description": "Documentation for the Fractions module."
|
||||
},
|
||||
{
|
||||
"url": "https://docs.python.org/3/tutorial/floatingpoint.html#tut-fp-issues",
|
||||
"description": "Limitations of Floating Point Arithmetic."
|
||||
},
|
||||
{
|
||||
"url": "https://leancrew.com/all-this/2023/08/decimal-to-fraction/",
|
||||
"description": "And now it's all this: Decimal to fraction."
|
||||
},
|
||||
{
|
||||
"url": "https://nrich.maths.org/2515",
|
||||
"description": "History of Fractions."
|
||||
}
|
||||
]
|
||||
@@ -2567,6 +2567,11 @@
|
||||
"uuid": "565f7618-4552-4eb0-b829-d6bacd03deaf",
|
||||
"slug": "with-statement",
|
||||
"name": "With Statement"
|
||||
},
|
||||
{
|
||||
"uuid": "000e7768-38b9-4904-9ae2-9a4e448f366c",
|
||||
"slug": "fractions",
|
||||
"name": "Fractions"
|
||||
}
|
||||
],
|
||||
"key_features": [
|
||||
|
||||
Reference in New Issue
Block a user