質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

3134閲覧

Python3.6 返ってくる数字の桁数を増やしたい

ika_ika

総合スコア7

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/05/19 03:15

前提・実現したいこと

python3.6(spyder)で円周率の値を求めるシステムを作っています。
シグマに300と代入した値と500と代入した値の誤差を調べたいのですがどちらも小数点以下15桁までしか表示されない為同じ値が返ってきてしまい正確な値が分かりません。
返ってくる数字の桁数の増やし方を教えて頂きたいです。
###30~0のソースコード

import math def f(k): return math.sqrt(12)*pow(-1, k)/(pow(3, k)*(2*k+1)) def sigma(func, frm, to): result = 0 for i in reversed(range(frm, to+1)): result += func(i) print(result) sigma(f, 0, 30)

###試したこと

import decimal decimal.getcontext().prec = 16 a = decimal.Decimal(sigma(f, 0, 30)) print(a)

としたのですが

TypeError: conversion from NoneType to Decimal is not supported

とエラーが出てしまいます。
自分では他に方法が思いつかなかったので質問させて頂きました。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Decimalで十分な精度を与えれば誤差がどれだけ出るかわかります。
マニュアル見て覚えて、じゃ初学者にはちょっと辛いと思うのでサンプルコードを書きます。
元のコードと見比べて、どこをDecimalに変更したのか見比べてみてください。
また、精度をいろいろな数値に変えてみて出力結果の違いを確認してみてください。

python

1from decimal import * 2''' 3出力する数値にかかわる部分をDecimal型に変更していく。 4math.sqrtではDecimalの精度が適用されないので、Decimal(12).sqrt()で出力する。 5Decimalにはいろいろな数学関数が用意されている。詳しくはリファレンス見てね。 6''' 7def f(k): 8 return Decimal(12).sqrt()*pow(Decimal(-1), k)/(pow(Decimal(3), k)*(Decimal(2)*k+Decimal(1))) 9 10def sigma(func, frm, to): 11 # 出力結果はDecimalにする 12 result = Decimal(0) 13 # イテレータ回数の数値は出力結果に影響しないし、あとからDecimalに変換しているのでintのまま 14 for i in reversed(range(frm, to+1)): 15 result += func(Decimal(i)) 16 17 print(result) 18 19# 桁数の精度を指定 20getcontext().prec = 30 21# 出力して比べてみる 22sigma(f, 0,30) 23sigma(f, 0,50) 24 25''' 263.14159265358979330574961292716 273.14159265358979323846264339505 28'''

投稿2020/05/19 05:14

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ika_ika

2020/05/19 05:59

コードまで書いて下さり感謝いたします。 そうですね、私の勉強不足もありますが初心者には難しかったです。 他の数値でも実行してみようと思います。 ありがとうございました。
guest

0

他に方法が思いつかなかった

decimalを使うという方法は合っていると思いますので、あとは使い方を学ぶだけで大丈夫です。

TypeError: conversion from NoneType to Decimal is not supported

decimal.Decimalの引数には、変換したい数値を指定します。
sigma(f, 0, 30)は、print結果(None)で数値じゃないので無意味です。

投稿2020/05/19 03:26

otn

総合スコア85949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ika_ika

2020/05/19 04:22

回答ありがとうございます。 やはり小数点以下15桁の数字をdecimalにするしかありませんかね...。 そうすると30~0の時と50~0の時の誤差がないことになるのですがもしかしたらそれで合ってるのかもしれません。 教えて頂きありがとうございました。
otn

2020/05/19 05:19

わりと機械的に書き換えられるので、やってみましょう。 math.sqrt(12)*pow(-1, k)/(pow(3, k)*(2*k+1)) ↓ decimal.Decimal(12).sqrt()*pow(-1, k)/ (decimal.getcontext().power(3, k)*(2*k+1)) decimalとintの演算はdecimalになるので全部にDecimalを付ける必要はないです。
ika_ika

2020/05/19 05:54

なるほど、そのように書き換えられるのですね。 decimalとintの演算はdecimalになるというのも初めて知りました。 とても勉強になりました。ありがとうございました。
guest

0

a = decimal.Decimal(sigma(f, 0, 30))

sigma関数はなにも返さない関数ですね

投稿2020/05/19 03:18

y_waiwai

総合スコア88051

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ika_ika

2020/05/19 04:12

やはりそうですよね...。 関数ごと桁数を増やす方法があればいいのですが...。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問