二つのdatetime時刻をコンマ7桁単位で取得した時の関数での相違点
Show older comments
下記のようなdatetimeを設定し、時刻差を二通りの関数で取得しました
%年、月、日またぎの確認
TIME1=datetime(2017,1,1,0,0,0.0001000);
TIME2=datetime(2016,12,31,23,59,59.9999000);
%計算①
S1=posixtime(TIME1)-posixtime(TIME2);
S11=round(S1*(double(10000000)));
%計算②
S2=seconds(TIME1- TIME2);
S22=round(S2*(double(10000000)));
上記のコードの場合、計算①と②がそれぞれ下記のような結果となりました
--------------------------------------------------------
計算① S1= 2.002716e-04
0.1μsでの表示(7桁でまるめこみ)
計算① S11= 2003
--------------------------------------------------------
計算② S2= 2.000000e-04
0.1μsでの表示(7桁でまるめこみ)
計算② S22= 2000
なぜこのような結果になったのか、わかる方がいれば教えていただければと思います。
MATLABはR2020bを使用しています。
よろしくお願いいたします。
Accepted Answer
More Answers (1)
コンピュータの中は2進数なので、表現できる数字とそうで無い数字があります。
表現不可能な場合は近似するわけですが、MATLABの標準の double 型は 8byte のメモリを必要とします。従って、数値を近似した際に、浮動小数点の仮数部に使うことができるbitサイズが大きいほど正確に近似できます。
つまり 52 bit が仮数部に用いられるわけですが、答えが同じになるべき計算でも、使っているbit によって答えが変わります。
a =(100000000000000+ 4/3) - (100000000000000+ 1)
b = 4/3 - 1
a == b
a と b は答えが一緒になるはずですが、4/3 の近似の良さが a, b で異なるため、答えが変わってきます。
上のコードでは、差分が同じになるはずですが、基準となる原点を posixtime は大幅にずらしており、それにより数値が大きくなっています。つまり近似の精度が下がっている状態だと考えられます。これが理由です。
1 Comment
Kyohei Fujimoto
on 3 Jun 2021
Categories
Find more on Creating, Deleting, and Querying Graphics Objects in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!