Skip to content

Instantly share code, notes, and snippets.

@mdmueller
Created July 30, 2014 22:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mdmueller/3883ed6caa2c2efa326a to your computer and use it in GitHub Desktop.
Save mdmueller/3883ed6caa2c2efa326a to your computer and use it in GitHub Desktop.
{
"metadata": {
"name": "xstrtod"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": "import pandas as pd\nfrom cStringIO import StringIO\nimport random\nfrom decimal import Decimal\nimport numpy as np\nimport matplotlib.pyplot as plt",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": "def xstrtod(s):\n return pd.read_csv(StringIO(s), header=None)[0][0]",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": "def randnum():\n s = '0.'\n for i in range(20):\n s += random.choice('0123456789')\n return s",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": "def ulp(s):\n num = Decimal(s)\n f = np.float64(s)\n a = f.view((np.uint8, 8))\n if Decimal(f) < num:\n a[0] += 1\n elif Decimal(f) > num:\n a[0] -= 1\n f2 = a.view(np.float64)[0]\n return abs(f2 - f)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": "y = []\ngood_vals = 0\n\nfor i in range(10000):\n val = randnum()\n guess = xstrtod(val)\n ulp_diff = abs(Decimal(val) - Decimal(guess)) / Decimal(ulp(val))\n y.append(float(ulp_diff))\n if float(ulp_diff) < 1.0:\n good_vals += 1\n\nprint('{0}% of values within 1.0 ULP'.format(good_vals * 100.0 / 10000))\nplt.hist(y, bins=20)\nplt.show()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "74.14% of values within 1.0 ULP\n"
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nr6anp7VlyxYFg0Ft27ZNsVhsxu1+9Gm+mvzo09e//nX98Ic/1AMPzP4S6dfjab66FtorzwOg1H1k\nP5hiS7lvbSnL/vjHP65MJqO//vWv+upXv6rW1tYlq2chvOxTKfzs0/vvv6/Pf/7zeuGFF7RixYo7\nbvejV3eryY9ePfDAA3r77beVzWb1xhtvzHpaA6/7NF9NXvfp1VdfVVVVleLx+F3fTXvdp1LqWmiv\nPA+AUg4I++A82WxWoVDI15pWrlxZ3FTdtWuXJicndfmyv0f8ed2nUvjVp8nJSe3Zs0df+tKXZn3Q\n+9Gr+Wry8zH18MMP67Of/az+/Oc/z5ju52Nqrpq87tObb76pgYEBrV27Vu3t7fr973+vffv2zZjH\njz6VUteCe1Xe1xELNzk5aR599FEzMjJi/vOf/8z7JfCf/vSnJf+CpZSaLl68aKanp40xxgwNDZmP\nfvSjS1rTLSMjIyV9CexFn0qpyY8+TU9Pm71795pnnnlmznm87lUpNXndq/fee89cuXLFGGPMtWvX\nzNatW83rr78+Yx6v+1RKTX4994wxJplMms997nN3TPfruTdfXQvtlec/CTnXAWEvvfSSJOnLX/6y\nmpub9dprr6mmpkYf+tCH9Mtf/tL3mn71q1/p5z//uQKBgB566CH19fUtaU2S1N7ertOnT+vSpUta\ns2aNOjs7NTk5WazJ6z6VUpMffTpz5oxefvllbdq0SfF4XJL0/e9/X//85z+LdXndq1Jq8rpX+Xxe\nHR0dmp6e1vT0tPbu3avt27f7+twrpSY/HlO3u/XRjp99KrWuhfaKA8EAwFL8JCQAWIoAAABLEQAA\nYCkCAAAsRQAAgKUIAACwFAEAAJYiAADAUv8Ps+zQXJ9Um6UAAAAASUVORK5CYII=\n",
"text": "<matplotlib.figure.Figure at 0x7f4de5ac4310>"
}
],
"prompt_number": 5
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment