{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 丸め誤差\n", "大きな数どおしのわずかな差は,丸め誤差にとくに影響を受ける.\n", "1. 23.173-23.094 を有効数字がそれぞれ5桁,4桁,3桁,2桁で計算した結果を示せ. \n", "2. 同様に,0.81321/(23.173-23.094) を有効数字がそれぞれ5桁,4桁,3桁,2桁で計算した結果を示せ." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from decimal import *\n", "\n", "def pretty_p(result,a,b,operator):\n", " print('context.prec:{}'.format(getcontext().prec))\n", " print(' %20.14f' % (a))\n", " print( '%1s%20.14f' % (operator, b))\n", " print('-----------')\n", " print( ' %20.14f' % (result))" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "context.prec:5\n", " 23.17300000000000\n", "- 23.09400000000000\n", "-----------\n", " 0.07900000000000\n" ] }, { "data": { "text/plain": [ "Decimal('10.294')" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "getcontext().prec = 5\n", "\n", "a=Decimal('0.81321')\n", "b=Decimal('23.173')\n", "c=Decimal('23.094')\n", "pretty_p(b-c,b,c,'-')\n", "\n", "a/(b-c)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "context.prec:4\n", " 23.17000000000000\n", "- 23.09000000000000\n", "-----------\n", " 0.08000000000000\n" ] }, { "data": { "text/plain": [ "Decimal('10.16')" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "TWOPLACES = Decimal(10) ** -2 \n", "getcontext().prec = 4\n", "a=Decimal('0.81321').quantize(Decimal(10) ** -4)\n", "b=Decimal('23.173').quantize(Decimal('0.01'))\n", "c=Decimal('23.094').quantize(Decimal('0.01'))\n", "\n", "pretty_p(b-c,b,c,'-')\n", "a/(b-c)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "context.prec:3\n", " 23.20000000000000\n", "- 23.10000000000000\n", "-----------\n", " 0.10000000000000\n" ] }, { "data": { "text/plain": [ "Decimal('8.13')" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ONEPLACES = Decimal(10) ** -1\n", "getcontext().prec = 3\n", "a=Decimal('0.81321').quantize(Decimal(10) ** -3)\n", "b=Decimal('23.173').quantize(ONEPLACES)\n", "c=Decimal('23.094').quantize(ONEPLACES)\n", "\n", "pretty_p(b-c,b,c,'-')\n", "a/(b-c)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "context.prec:2\n", " 23.00000000000000\n", "- 23.00000000000000\n", "-----------\n", " 0.00000000000000\n" ] }, { "ename": "DivisionByZero", "evalue": "[