diff --git a/02_NumberRepresentation.ipynb b/02_NumberRepresentation.ipynb index 6ac2a2a..8e36862 100644 --- a/02_NumberRepresentation.ipynb +++ b/02_NumberRepresentation.ipynb @@ -18,19 +18,9 @@ }, { "cell_type": "code", - "execution_count": 84, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9223372036854775807\n", - "True\n", - "9223372036854775808\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import sys\n", "print (sys.maxsize)\n", @@ -51,18 +41,9 @@ }, { "cell_type": "code", - "execution_count": 85, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.6666666666666666\n", - "0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print (2/3)\n", "print (2//3)" @@ -79,20 +60,9 @@ }, { "cell_type": "code", - "execution_count": 86, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Binary representation of 18 : 0b10010\n", - "Hexadecimal representation of 18 : 0x12\n", - "Decimal representation of 0b10010 : 18\n", - "Decimal representation of 0x12 : 18\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# an integer in decimal representation\n", "a=18\n", @@ -127,19 +97,9 @@ }, { "cell_type": "code", - "execution_count": 87, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Logical AND 12\n", - "Logical OR 61\n", - "Logical XOR 49\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "a = 60 # 60 = 0011 1100 \n", "b = 13 # 13 = 0000 1101 \n", @@ -163,17 +123,9 @@ }, { "cell_type": "code", - "execution_count": 88, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Negation of a -61\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "c = ~a; # -61 = 1100 0011\n", "print (\"Negation of a \", c)" @@ -252,23 +204,9 @@ }, { "cell_type": "code", - "execution_count": 89, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from IPython.display import Image\n", "Image(url='http://www.dspguide.com/graphics/F_4_2.gif')" @@ -310,17 +248,9 @@ }, { "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import sys\n", "print (sys.float_info)" @@ -338,19 +268,9 @@ }, { "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "7.00000000000001\n", - "7.000000000000001\n", - "7.0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "for e in [14,15,16]: print (7+1.0*10**-e)" ] @@ -369,27 +289,9 @@ }, { "cell_type": "code", - "execution_count": 92, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.1\n" - ] - }, - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 92, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# is 1/10 the same of 0.1?\n", "print (1/10)\n", @@ -409,18 +311,9 @@ }, { "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3.141592653589793\n", - "0x1.921fb54442d18p+1\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import math\n", "x=math.pi\n", @@ -437,18 +330,9 @@ }, { "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3.1415926535898\n", - "1.00000000000000022\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print (format(math.pi, '.13f')) # give 13 significant digits\n", "\n", @@ -466,18 +350,9 @@ }, { "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.1920928955078125e-07\n", - "1.1102230246251565e-16\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# 23 bits are used for f in single precision floating points \n", "print (2**-23)\n", @@ -495,20 +370,9 @@ }, { "cell_type": "code", - "execution_count": 98, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0" - ] - }, - "execution_count": 98, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "1 + 6.022e23 - 6.022e23" ] @@ -522,18 +386,9 @@ }, { "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.0\n", - "0.0\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print (6.022e23 - 6.022e23 + 1)\n", "print (1 + 6.022e23 - 6.022e23)\n" @@ -548,20 +403,9 @@ }, { "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 100, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import math\n", "a = math.exp(1);\n", @@ -572,18 +416,9 @@ }, { "cell_type": "code", - "execution_count": 101, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0\n", - "-1011.7261024082587\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# (we'll see numpy soon, bear with me for the moment)\n", "\n", @@ -619,20 +454,9 @@ }, { "cell_type": "code", - "execution_count": 102, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "t1 = 61249.00853150303\n", - "t2 = 158057.9134162482\n", - "% change in x = 0.0006366263894271296\n", - "% change in tan(x) = 158.05791343536953\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# The tangent function is poorly conditioned\n", "\n", @@ -650,20 +474,9 @@ }, { "cell_type": "code", - "execution_count": 103, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Catastrophic cancellation occurs when subtracitng\n", "# two numbers that are very close to one another\n", @@ -684,19 +497,9 @@ }, { "cell_type": "code", - "execution_count": 104, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.999999999999999888977697537484\n", - "0.000000000000000111022302462516\n", - "0.917540\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# We know from L'Hopital's rule that the answer is 0.5 at 0\n", "# and should be very close to 0.5 throughout this tiny interval\n", @@ -709,20 +512,9 @@ }, { "cell_type": "code", - "execution_count": 105, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Numerically stable version of funtion using simple trignometry\n", "\n", @@ -746,7 +538,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -777,20 +569,9 @@ }, { "cell_type": "code", - "execution_count": 107, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.08239379980573168\n", - "0.0\n", - "0.08247527080374556\n", - "0.08177592628472322\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# check the performances with an array \n", "# of randomly distributed data around 1e12\n", diff --git a/02ex_NumberRepresentation.ipynb b/02ex_NumberRepresentation.ipynb new file mode 100644 index 0000000..b03e2e5 --- /dev/null +++ b/02ex_NumberRepresentation.ipynb @@ -0,0 +1,104 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1\\. Write a function that converts number representation (bin<->dec<->hex)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2\\. Write a function that converts a 32 bit word into a single precision floating point (i.e. interprets the various bits as sign, mantissa and exponent)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3\\. Write a program to determine the underflow and overflow limits (within a factor of 2) for python on your computer. \n", + "\n", + "**Tips**: define two variables inizialized to 1 and halve/double them enough time to exceed the under/over-flow limits " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "4\\. Write a program to determine the machine precision\n", + "\n", + "**Tips**: define a new variable by adding a smaller and smaller value (proceeding similarly to prob. 2) to an original variable and check the point where the two are the same " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "5\\. Write a function that takes in input three parameters $a$, $b$ and $c$ and prints out the two solutions to the quadratic equation $ax^2+bx+c=0$ using the standard formula:\n", + "$$\n", + "x=\\frac{-b\\pm\\sqrt{b^2-4ac}}{2a}\n", + "$$\n", + "\n", + "(a) use the program to compute the solution for $a=0.001$, $b=1000$ and $c=0.001$\n", + "\n", + "(b) re-express the standard solution formula by multiplying top and bottom by $-b\\mp\\sqrt{b^2-4ac}$ and again find the solution for $a=0.001$, $b=1000$ and $c=0.001$. How does it compare with what previously obtained? Why?\n", + "\n", + "(c) write a function that compute the roots of a quadratic equation accurately in all cases" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "6\\. Write a program that implements a function $f(x)$ returning the value of $x(x−1)$\n", + "\n", + "(a)calculates the derivative of the function at the point $x = 1$ using the derivative definition:\n", + "\n", + "$$\n", + "\\frac{{\\rm d}f}{{\\rm d}x} = \\lim_{\\delta\\to0} \\frac{f(x+\\delta)-f(x)}{\\delta}\n", + "$$\n", + "\n", + "with δ = 10−2. Calculate the true value of the same derivative analytically and compare with the answer your program gives. The two will not agree perfectly. Why not?\n", + "\n", + "(b) Repeat the calculation for $\\delta = 10^{−4}, 10^{−6}, 10^{−8}, 10^{−10}, 10^{−12}$ and $10^{−14}$. How does the accuracy scales with $\\delta$?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "7\\. Calculate the integral" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}