Skip to content

Instantly share code, notes, and snippets.

@mizar
Last active June 7, 2024 10:33
Show Gist options
  • Save mizar/9dcae32696a03a1a0012a758fc324cd7 to your computer and use it in GitHub Desktop.
Save mizar/9dcae32696a03a1a0012a758fc324cd7 to your computer and use it in GitHub Desktop.
decimal_rounding_error.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"authorship_tag": "ABX9TyNCp5LyUD/auAjhlGQAAiib",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/mizar/9dcae32696a03a1a0012a758fc324cd7/decimal_rounding_error.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "MxAl6kX9GGAN",
"outputId": "ff2f1d4d-e83a-41d3-fc5b-9c6efff8bb7d"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0.0001881483434415405554543084391 +0E-27 \n",
"0.4686439112877793129887381779 -2E-28 \n",
"0.4955373031114877242725771383 -2E-28 \n",
"0.2303266426951414140530441189 -1E-28 \n",
"0.1162573779445482369275348384 +0E-27 \n",
"0.7868142377753561207146801681 +0E-27 \n",
"0.4603278416588289680216309266 +0E-27 \n",
"0.4872791641551212303624405512 -1E-28 \n",
"0.5658713320454171747067290396 +0E-27 \n",
"0.4681214209630200786811256193 -1E-28 \n",
"0.5778372416377828165581896810 +0E-27 \n",
"0.9984287819613553173186462070 +0E-27 \n",
"0.1596782927351656523332803596 +0E-27 \n",
"0.9284865347810143258920247377 +0E-27 \n",
"0.3163392421462190771530781942 +0E-27 \n",
"0.6550081249356266548447406017 -3E-28 \n",
"0.6032816167322882686003167702 +0E-27 \n",
"0.06533038833398367921402468894 -1E-28 \n",
"0.8466648532539280738333902885 +0E-27 \n",
"0.9047939727353826315346374484 -1E-28 \n",
"0.9924148685334297283027040548 +0E-27 \n",
"0.8613522435099173371948094056 -2E-28 \n",
"0.1252936669058218782857959048 +0E-27 \n",
"0.7935736837189343815721364980 +0E-27 \n",
"0.6856628946280070427367026796 +0E-27 \n",
"0.4658497203611133396735281162 -1E-28 \n",
"0.5217660183205865576454563173 +0E-27 \n",
"0.2325274675632003292881801609 -1E-28 \n",
"0.3263737335974094784053141191 +0E-27 \n",
"0.6991995950225985759321010173 +0E-27 \n",
"0.5039184104496712161606400991 -2E-28 \n",
"0.2842674573779219122923399968 +0E-27 \n",
"0.4504735215737639859594331604 -2E-28 \n",
"0.6011125356735125696391790926 +0E-27 \n",
"0.02657544242834733393597177172 +0E-27 \n",
"0.4116419943980652772960006128 +0E-27 \n",
"0.7709119264141850086579164835 +0E-27 \n",
"0.4261880425525697930004663555 -1E-28 \n",
"0.1360945436826449454563344406 +0E-27 \n",
"0.4097392257898193287389516963 +0E-27 \n",
"0.3895851956130025177011059168 -1E-28 \n",
"0.6710808838285774955164213171 +0E-27 \n",
"0.3547854005200968782587431753 +0E-27 \n",
"0.01391524328050508834306242945 +0E-27 \n",
"0.3070594209292863148739682613 +0E-27 \n",
"0.4298968749926767664611606608 +0E-27 \n",
"0.6063295156069307741967726961 +0E-27 \n",
"0.3446134547231292537528592144 +0E-27 \n",
"0.6593358580156999261895486630 +0E-27 \n",
"0.5906836699879189860261534763 +0E-27 \n",
"0.004343557131694803310058611166 -2E-28 \n",
"0.2677249588706350871111658429 +0E-27 \n",
"0.3760854957746783842705515305 +0E-27 \n",
"0.08675348245591637225116913540 -2E-28 \n",
"0.3130275028797333023666756163 +0E-27 \n",
"0.6630251372344228663233916156 -3E-28 \n",
"0.2316424793652593663289554667 -1E-28 \n",
"0.8895883024913366527910167218 +0E-27 \n",
"0.3448748869064983671757978986 -2E-28 \n",
"0.9672425775694941302874491912 -5E-28 \n",
"0.9223993438288156128330447825 -2E-28 \n",
"0.4005020619513139749399341277 +0E-27 \n",
"0.3548199827693256032346433375 -1E-28 \n",
"0.3106703570437166558202830171 -1E-28 \n",
"0.5796839681792767556263444427 -1E-28 \n",
"0.4102002879370543062630409119 +0E-27 \n",
"0.4897769962252555436757873553 +0E-27 \n",
"0.1529909172670919434296423547 +0E-27 \n",
"0.6017870694364057777264575634 +0E-27 \n",
"0.009581187343038193554481224898 -4E-28 \n",
"0.2764895203401406389769290946 +0E-27 \n",
"0.3518987282722992064157819567 +0E-27 \n",
"0.1781067401559357317379991055 +0E-27 \n",
"0.6266780896495151733724316258 -1E-28 \n",
"0.9399472796024895352826479118 +0E-27 \n",
"0.4977870583900090160326840443 +0E-27 \n",
"0.1171153364727898153751449101 +0E-27 \n",
"0.8746303033948208914281510134 -3E-28 \n",
"0.1562471734183820461576828891 +0E-27 \n",
"0.3804712010894388373200352281 -1E-28 \n",
"0.7965629157323031296266504177 -2E-28 \n",
"0.2943966820133477572383318890 -1E-28 \n",
"0.4712202700794501397794502666 +0E-27 \n",
"0.4452743173966663912433176375 -1E-28 \n",
"0.5095997899457956347740788980 +0E-27 \n",
"0.8649285472012918186571725499 +0E-27 \n",
"0.4276995684049795540926010315 +0E-27 \n",
"0.1287908611865515810971964322 +0E-27 \n",
"0.1316228148029621708046789894 +0E-27 \n",
"0.9812477786880379327970485496 +0E-27 \n",
"0.6057342588350780817272566240 +0E-27 \n",
"0.05855638757518968482104305462 -1E-28 \n",
"0.9407850748101512694418163142 -2E-28 \n",
"0.9489860087564671558834056098 -4E-28 \n",
"0.9166955174121178190898361972 +0E-27 \n",
"0.4144814625030375782395257934 +0E-27 \n",
"0.9204863766238935560276822988 +0E-27 \n",
"0.3678500059019424342754975195 +0E-27 \n",
"0.6227391183110678640351396742 -2E-28 \n",
"0.9490657588975000732736072296 +0E-27 \n"
]
}
],
"source": [
"import random\n",
"import decimal\n",
"\n",
"prec28 = decimal.Context()\n",
"\n",
"for _ in range(100):\n",
" a, b = random.random(), random.random()\n",
" x = prec28.create_decimal_from_float(a) + prec28.create_decimal_from_float(b / 2**52)\n",
" print(f\"{x:<32} {(1/x)*x-1:<+10}\")\n"
]
},
{
"cell_type": "code",
"source": [
"import random\n",
"import decimal\n",
"\n",
"precl = decimal.Context(prec=1)\n",
"prec28 = decimal.Context()\n",
"\n",
"for _ in range(100):\n",
" a = random.random()\n",
" x = prec28.create_decimal(precl.create_decimal_from_float(a))\n",
" print(f\"{x:<32} {1/x*x-1:<+10}\")\n"
],
"metadata": {
"id": "WJMmXRvsL45T",
"outputId": "1fda43e5-6018-464f-e694-eedb0020bdeb",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0.3 -1E-28 \n",
"0.1 +0 \n",
"0.8 +0.000 \n",
"0.9 -1E-28 \n",
"0.03 -1E-28 \n",
"0.9 -1E-28 \n",
"0.2 +0.0 \n",
"0.09 -1E-28 \n",
"0.2 +0.0 \n",
"0.4 +0.00 \n",
"0.06 +0E-27 \n",
"0.1 +0 \n",
"0.3 -1E-28 \n",
"0.6 +0E-27 \n",
"0.5 +0.0 \n",
"0.7 +0E-27 \n",
"0.9 -1E-28 \n",
"0.2 +0.0 \n",
"0.4 +0.00 \n",
"0.7 +0E-27 \n",
"0.3 -1E-28 \n",
"0.3 -1E-28 \n",
"0.4 +0.00 \n",
"0.4 +0.00 \n",
"0.9 -1E-28 \n",
"0.4 +0.00 \n",
"0.3 -1E-28 \n",
"0.5 +0.0 \n",
"0.05 +0.0 \n",
"0.8 +0.000 \n",
"0.4 +0.00 \n",
"0.4 +0.00 \n",
"0.4 +0.00 \n",
"0.7 +0E-27 \n",
"0.6 +0E-27 \n",
"0.3 -1E-28 \n",
"0.7 +0E-27 \n",
"0.8 +0.000 \n",
"1 +0 \n",
"0.3 -1E-28 \n",
"0.8 +0.000 \n",
"0.3 -1E-28 \n",
"0.7 +0E-27 \n",
"0.3 -1E-28 \n",
"0.9 -1E-28 \n",
"0.6 +0E-27 \n",
"0.6 +0E-27 \n",
"0.6 +0E-27 \n",
"0.2 +0.0 \n",
"0.07 +0E-27 \n",
"1 +0 \n",
"0.2 +0.0 \n",
"0.3 -1E-28 \n",
"0.5 +0.0 \n",
"0.4 +0.00 \n",
"0.3 -1E-28 \n",
"0.7 +0E-27 \n",
"0.8 +0.000 \n",
"0.7 +0E-27 \n",
"0.2 +0.0 \n",
"0.9 -1E-28 \n",
"0.7 +0E-27 \n",
"0.5 +0.0 \n",
"0.9 -1E-28 \n",
"0.6 +0E-27 \n",
"0.3 -1E-28 \n",
"0.6 +0E-27 \n",
"0.3 -1E-28 \n",
"0.4 +0.00 \n",
"0.1 +0 \n",
"0.1 +0 \n",
"0.3 -1E-28 \n",
"0.09 -1E-28 \n",
"0.6 +0E-27 \n",
"0.9 -1E-28 \n",
"1 +0 \n",
"0.1 +0 \n",
"0.9 -1E-28 \n",
"0.4 +0.00 \n",
"0.2 +0.0 \n",
"0.2 +0.0 \n",
"0.1 +0 \n",
"0.6 +0E-27 \n",
"0.4 +0.00 \n",
"0.4 +0.00 \n",
"0.04 +0.00 \n",
"0.4 +0.00 \n",
"0.7 +0E-27 \n",
"0.3 -1E-28 \n",
"0.5 +0.0 \n",
"0.9 -1E-28 \n",
"0.6 +0E-27 \n",
"0.1 +0 \n",
"0.4 +0.00 \n",
"0.2 +0.0 \n",
"0.8 +0.000 \n",
"0.7 +0E-27 \n",
"0.7 +0E-27 \n",
"0.7 +0E-27 \n",
"0.6 +0E-27 \n"
]
}
]
},
{
"cell_type": "code",
"source": [
"import random\n",
"import decimal\n",
"\n",
"precl = decimal.Context(prec=3)\n",
"prec28 = decimal.Context()\n",
"\n",
"for i in range(100):\n",
" a = i / 100 + 1\n",
" x = prec28.create_decimal(precl.create_decimal_from_float(a))\n",
" print(f\"{x:<32} {1/x*x-1:<+10}\")\n"
],
"metadata": {
"id": "fkYjT6RDP4IJ",
"outputId": "17635c2d-215e-4a3e-e1f8-b5723518247c",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"1 +0 \n",
"1.01 +0E-27 \n",
"1.02 +0E-27 \n",
"1.03 +0E-27 \n",
"1.04 +0E-27 \n",
"1.05 +0E-27 \n",
"1.06 +0E-27 \n",
"1.07 +0E-27 \n",
"1.08 +0E-27 \n",
"1.09 +0E-27 \n",
"1.10 +0E-27 \n",
"1.11 +0E-27 \n",
"1.12 +0E-27 \n",
"1.13 +0E-27 \n",
"1.14 +0E-27 \n",
"1.15 +0E-27 \n",
"1.16 +0E-27 \n",
"1.17 +0E-27 \n",
"1.18 +0E-27 \n",
"1.19 +0E-27 \n",
"1.20 +0E-27 \n",
"1.21 +0E-27 \n",
"1.22 -1E-28 \n",
"1.23 +0E-27 \n",
"1.24 +0E-27 \n",
"1.25 +0.000 \n",
"1.26 +0E-27 \n",
"1.27 +0E-27 \n",
"1.28 +0E-7 \n",
"1.29 +0E-27 \n",
"1.30 +0E-27 \n",
"1.31 -1E-28 \n",
"1.32 +0E-27 \n",
"1.33 -1E-28 \n",
"1.34 +0E-27 \n",
"1.35 -1E-28 \n",
"1.36 +0E-27 \n",
"1.37 +0E-27 \n",
"1.38 +0E-27 \n",
"1.39 +0E-27 \n",
"1.40 +0E-27 \n",
"1.41 +0E-27 \n",
"1.42 +0E-27 \n",
"1.43 +0E-27 \n",
"1.44 -1E-28 \n",
"1.45 +0E-27 \n",
"1.46 +0E-27 \n",
"1.47 +0E-27 \n",
"1.48 +0E-27 \n",
"1.49 +0E-27 \n",
"1.5 +0E-27 \n",
"1.51 +0E-27 \n",
"1.52 -1E-28 \n",
"1.53 +0E-27 \n",
"1.54 +0E-27 \n",
"1.55 +0E-27 \n",
"1.56 +0E-27 \n",
"1.57 +0E-27 \n",
"1.58 +0E-27 \n",
"1.59 +0E-27 \n",
"1.60 +0.00000 \n",
"1.61 -1E-28 \n",
"1.62 +0E-27 \n",
"1.63 +0E-27 \n",
"1.64 +0E-27 \n",
"1.65 +0E-27 \n",
"1.66 +0E-27 \n",
"1.67 +0E-27 \n",
"1.68 -1E-28 \n",
"1.69 +0E-27 \n",
"1.70 +0E-27 \n",
"1.71 -1E-28 \n",
"1.72 -1E-28 \n",
"1.73 +0E-27 \n",
"1.74 +0E-27 \n",
"1.75 +0E-27 \n",
"1.76 +0E-27 \n",
"1.77 +0E-27 \n",
"1.78 +0E-27 \n",
"1.79 -1E-28 \n",
"1.80 +0E-27 \n",
"1.81 +0E-27 \n",
"1.82 +0E-27 \n",
"1.83 +0E-27 \n",
"1.84 +0E-27 \n",
"1.85 -1E-28 \n",
"1.86 +0E-27 \n",
"1.87 +0E-27 \n",
"1.88 +0E-27 \n",
"1.89 +0E-27 \n",
"1.90 +0E-27 \n",
"1.91 +0E-27 \n",
"1.92 -1E-28 \n",
"1.93 +0E-27 \n",
"1.94 +0E-27 \n",
"1.95 +0E-27 \n",
"1.96 +0E-27 \n",
"1.97 -1E-28 \n",
"1.98 +0E-27 \n",
"1.99 -1E-28 \n"
]
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment