3940649673945355 * 3 の計算が合いません。

6 views (last 30 days)
数列の一般項を、ループ処理した漸化式と比べて確かめていたのですが、どうもmatlabの計算が上手くいきません。
Num = 3940649673945355 * 3 % -> 1.182194902183606e+16
3940649673945355 * 3 = 11821949021836065 のはずですよね。しかし1の位を見るために1e16を引くと...
Num - 1e16 % -> 1.821949021836064e+15
となります。どうして 1.821949021836065e+15 ではなく1.821949021836064e+15 となるのでしょうか。解決策を教えてください。
できれば原因も教えてくださるとうれしいです。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 4 Jan 2022
>どうして 1.821949021836065e+15 ではなく1.821949021836064e+15 となるのでしょうか。
MATLABがデフォルトで用いるdouble型(倍精度浮動小数点数(64bit))で表現できる有効桁数を超えたからです。
% 10進数 の 11821949021836065 を 変換 すると…
% IEEE754倍精度(double, 64bit = 8Byte)では… 4344FFFFFFFFE990
% 符号部 0、 指数部 434 仮数部 4FFFFFFFFE990 の値を 変換 すると…
% 10進:11821949021836064
>解決策を教えてください。
  • 整数なら符号付/無の整数型(u)int64を使えば解決します。
Num = int64(3940649673945355) * 3
Num = int64 11821949021836065
Num = vpa(3940649673945355) * 3
Num = 
11821949021836065.0
  1 Comment
昴(Subaru) 吉野(Yoshino)
丁寧な回答ありがとうございます。
「正の数値の範囲は 2.22507 x 10^-308 ~ 1.79769 x 10^308」と書いてあったので、double型で大丈夫なはず...と思っていたのですが、有効桁数があるのですね。
今回は整数しか出てこないのでint64を使用しようと思います。
複数の手法を載せてくださり、ありがとうございました。

Sign in to comment.

More Answers (0)

Products


Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!