{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notebook fyrir fyrirlestur 11. jan í Stærðfræði og reiknifræði.\n",
    "\n",
    "\n",
    "Nokkur hjálparföll til að prenta út bitaframsetningu á fleytitölum\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import struct\n",
    "import numpy as np\n",
    "\n",
    "def myord(x):\n",
    "    #virkar fyrir python 2 og 3\n",
    "     return ord(x) if type(x) is str else x\n",
    "\n",
    "def pretty32(num):\n",
    "    s = ''.join(bin(myord(c)).replace('0b', '').rjust(8, '0') for c in struct.pack('!f', np.float32(num)))\n",
    "    print(s[0] + ' ' + s[1:9] + ' ' + s[9:] \\\n",
    "          + '\\n- -------- -----------------------'\\\n",
    "          + '\\nf        e                       m')\n",
    "\n",
    "def pretty64(num):\n",
    "    s = ''.join(bin(myord(c)).replace('0b', '').rjust(8, '0') for c in struct.pack('!d', np.float64(num)))\n",
    "    print(s[0] + ' ' + s[1:12] + ' ' + s[12:] \\\n",
    "          + '\\n- ----------- ' + '-'*52 \\\n",
    "          + '\\nf           e ' + ' '*51 + 'm')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Prentum út fleytitölurnar 1.25 sem 32 og 64 bita tölur."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 01111111 01000000000000000000000\n",
      "- -------- -----------------------\n",
      "f        e                       m\n",
      "0 01111111111 0100000000000000000000000000000000000000000000000000\n",
      "- ----------- ----------------------------------------------------\n",
      "f           e                                                    m\n"
     ]
    }
   ],
   "source": [
    "pretty32(1.25)\n",
    "pretty64(1.25)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 10000000 10010010000111111011011\n",
      "- -------- -----------------------\n",
      "f        e                       m\n"
     ]
    }
   ],
   "source": [
    "import math\n",
    "pretty32(math.pi)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Samlagning er ekki tengin"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 01111111110 0011001100110011001100110011001100110011001100110011\n",
      "- ----------- ----------------------------------------------------\n",
      "f           e                                                    m\n",
      "0 01111111110 0011001100110011001100110011001100110011001100110100\n",
      "- ----------- ----------------------------------------------------\n",
      "f           e                                                    m\n",
      "0 01111111110 0011001100110011001100110011001100110011001100110011\n",
      "- ----------- ----------------------------------------------------\n",
      "f           e                                                    m\n"
     ]
    }
   ],
   "source": [
    "pretty64((0.2 + 0.3) + 0.1)\n",
    "pretty64(0.2 + (0.3 + 0.1))\n",
    "pretty64(0.6)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sérstakar tölur td. $+\\infty$ og $-\\infty$, þurfum að nota strengi til að Python reyni ekki að túlka þær."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 11111111 00000000000000000000000\n",
      "- -------- -----------------------\n",
      "f        e                       m\n",
      "1 11111111 00000000000000000000000\n",
      "- -------- -----------------------\n",
      "f        e                       m\n",
      "0 11111111 10000000000000000000000\n",
      "- -------- -----------------------\n",
      "f        e                       m\n",
      "0 00000000 00000000000000000000000\n",
      "- -------- -----------------------\n",
      "f        e                       m\n",
      "1 00000000 00000000000000000000000\n",
      "- -------- -----------------------\n",
      "f        e                       m\n"
     ]
    }
   ],
   "source": [
    "pretty32('Inf')\n",
    "pretty32('-Inf')\n",
    "pretty32('nan')\n",
    "pretty32('0')\n",
    "pretty32('-0')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Fáum fram $\\pm\\infty$ og NaN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 11111111 00000000000000000000000\n",
      "- -------- -----------------------\n",
      "f        e                       m\n",
      "1 11111111 00000000000000000000000\n",
      "- -------- -----------------------\n",
      "f        e                       m\n",
      "1 11111111 10000000000000000000000\n",
      "- -------- -----------------------\n",
      "f        e                       m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.5/site-packages/ipykernel/__main__.py:3: RuntimeWarning: divide by zero encountered in float_scalars\n",
      "  app.launch_new_instance()\n",
      "/usr/local/lib/python3.5/site-packages/ipykernel/__main__.py:4: RuntimeWarning: divide by zero encountered in float_scalars\n",
      "/usr/local/lib/python3.5/site-packages/ipykernel/__main__.py:5: RuntimeWarning: divide by zero encountered in float_scalars\n",
      "/usr/local/lib/python3.5/site-packages/ipykernel/__main__.py:5: RuntimeWarning: invalid value encountered in float_scalars\n"
     ]
    }
   ],
   "source": [
    "one = np.float32(1.0)\n",
    "x = np.float32(0.0)\n",
    "pretty32(one/x)\n",
    "pretty32(one/(-x))\n",
    "pretty32(one/x - one / x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sýnum underflow, $x\\neq 0$ en $x^2 = 0$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 00101111 00000000000000000000000\n",
      "- -------- -----------------------\n",
      "f        e                       m\n",
      "0 00000000 00000000000000000000000\n",
      "- -------- -----------------------\n",
      "f        e                       m\n"
     ]
    }
   ],
   "source": [
    "x = np.float32(2**(-80))\n",
    "pretty32(x)\n",
    "pretty32(x*x)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "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.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
