
R言語での極小値の指数形式での出力に関して質問です。
Windows vista, Rのバージョンは x64 2.12.1 です
統計に関する計算処理で exp関数を使うスクリプトを作っています。
入力する値を a とすると
計算する式は
1 - exp(-exp( a )) となります(R script上)
a <- -10 とすると計算結果は
4.53988992012988e-5
となりますが
aが小さい数になってくると
a <- -40
計算結果は 0 となってしまいます。
本来指数表示の極小数が 1.0e-50のように表示されるべきなのですが切り捨てられて0として扱われてしまっているようです。
オプションで変更できるのかと思いoptions の scipen をいじってみましたがうまくいきません。
このような計算の結果の極小数を指数表示(1.0e-50のように)するにはどうすればいいのでしょうか?
------------スクリプト--------------
a <- -4
b <- -38
result_a <- 1- exp(-exp( a ))
result_b <- 1- exp(-exp( b ))
cat(result_a , "\n", result_b )
-----------出力---------------
0.01814893
0
No.4ベストアンサー
- 回答日時:
expm1 なんてのもあるか?
expm1初めて知りました。
説明を読んで、ただexp(a)-1というだけかと思いましたが、小さい数字を扱う場合(今回のよう場合)に正確な値を算出してくれるようですね。
(a <- -4 の場合)
(exp使用)
> 1 - exp(- exp(-4))
[1] 0.01814893
(expm1使用)
> - expm1(- exp(-4))
[1] 0.01814893
(a <- -38 の場合)
(exp使用)
> 1 - exp(- exp(-38))
[1] 0
(expm1使用)
> - expm1(- exp(-38))
[1] 3.139133e-17
のようにすることで特にオプションを設定することなく求める値を得ることが出来ました。(元の式を変えているのでちょっと不思議な感じですが。。。)
No.3
- 回答日時:
なぜa=-40のときに答えは0.0になるか分かりましたか?
Rの計算は倍精度の浮動小数点演算で計算されますので有効桁数が15桁程度です。
-exp(-exp( a ))を計算しますと1.00000と0が続き、18桁目に0でない数字が現れます。有効桁数15桁だと1.0になるわけです。
もっと有効桁数をとれれば計算は可能です。Rではできるのかどうか分かりません。
Rubyではかなり大きな桁数をとることができ、手間はかかりますがこんな式で計算できます。有効桁数を100桁にした例です。
require "bigdecimal"
require "bigdecimal/math"
include BigMath
prec=100 # 有効桁数
a=-40
b=BigDecimal.new("1.0", prec)-exp(-exp(BigDecimal.new(a.to_s,prec), prec),prec)
puts b.to_f
答えは4.24835425529159e-18
となります。
Rも統計計算やグラフ作成に使っていますが、データ構造が複雑でとてもついていけません。
Rubyで前処理をしてそこからRを呼び出して統計計算やグラフ作成をしています。
ANo.2の理由ですが、ヒントはテイラー展開です。
回答ありがとうございます。
内部演算桁数が十分でなく、計算途中で0に丸められているのかな。。。というのが現在の理解です。
>もっと有効桁数をとれれば計算は可能です。Rではできるのかどうか分かりません。
出力用に有効桁数を変えることはできるようですが、Rの内部演算桁数に関しては今も調べている状態です。
>Rubyではかなり大きな桁数をとることができ、手間はかかりますがこんな式で計算できます。
普段はC++も使っているので、C++上で計算させようかなとも思っていました。なるべくR上で簡潔に済ませたいのですが。
>ANo.2の理由ですが、ヒントはテイラー展開です。
早速調べ始めましたが、なかなか難しそうですね。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 物理学 二重障壁の計算 1 2023/03/05 16:49
- 数学 paythonを使用した周回積分に関する質問です。 2 2023/02/17 19:09
- 数学 離散フーリエ逆変換が周波数分割数をNにできる理由について 4 2022/09/18 12:56
- 物理学 電磁気学の問題について教えて欲しいです. 1 2023/05/05 17:01
- 物理学 量子力学 球面調和関数 導出 方位角成分 微分方程式の解 2 2022/07/02 13:40
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 情報処理技術者・Microsoft認定資格 応用情報処理技術者試験のシステム利用率の計算について 2 2022/03/28 07:43
- 工学 制御工学の問題について 1 2022/11/01 23:45
- Excel(エクセル) エクセルのセルの書式設定・ユーザー定義の条件設定について 1 2022/08/17 21:56
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELなどで「返す」という表現
-
65536は2の何乗なのでしょうか?
-
ReportViewerのテキストボック...
-
太陽の位置計算のプログラムを...
-
matlabで計算終了
-
VBAで一時的にオーバーフローを...
-
引き放し法による除算アルゴリ...
-
変化させるセルが変化しない
-
モジュラス103の計算とは何でし...
-
数値計算の高速化 (cos, sin, exp)
-
C言語の課題で助けてください
-
VBでReplace
-
連立方程式を解くプログラムを...
-
排他的論理和 BCC(水平パリテ...
-
ファイルから数式を読み込む
-
MATLABの積分について
-
smartyで計算を行う方法
-
VBAで関数をつくる
-
C#の演算でオーバーフローして...
-
趣味で「乗換案内」みたいなソ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
EXCELなどで「返す」という表現
-
変化させるセルが変化しない
-
エクセルで特定のセルのみを任...
-
CとFORTRANの計算速度はどちら...
-
モジュロ
-
バッチファイルでウインドウを...
-
Visual C++でdebugとreleaseで...
-
y=(x^2 +3x+1)^4を微分の定義を...
-
入射角反射角
-
スレッド処理からダイアログを...
-
60進数の四則計算
-
Javaと他言語比較について
-
VBAで関数をつくる
-
C言語 Σをつかったプログラム
-
CRC8を教えてください
-
C言語についてです。 再帰を使...
-
C言語について 下の画像は do-w...
おすすめ情報