二つのdatetime時刻をコンマ7桁単位で取得した時の関数での相違点
Mostrar comentarios más antiguos
下記のような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を使用しています。
よろしくお願いいたします。
Respuesta aceptada
Más respuestas (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 comentario
Kyohei Fujimoto
el 3 de Jun. de 2021
Categorías
Más información sobre Creating, Deleting, and Querying Graphics Objects en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!