學習LabVIEW(十)——關于Matlab的eps函數(十三)
- 在《關于Matlab的eps函數》中,我們討論了eps的本質,并使用Matlab的typecast函數(用來實現reinterpret cast)實現了eps的計算;
- 在《關于Matlab的eps函數(續)》,《關于Matlab的eps函數(又續)》,《關于Matlab的eps函數(六)》和《關于Matlab的eps函數(七)——“又續”的續》中,我們利用位段結構體實現了eps計算,這種版本的可讀性比最初用typecast實現的版本要好多了;
- 在《關于Matlab的eps函數(再續)》中,我們根據mathworks上的一個帖子,討論了利用純粹的數學運算而不是位運算實現eps的方法;
- 在《關于Matlab的eps函數(五)》和《Article 4 in 1: 關于Matlab的eps函數(八) &讀Matlab7.7的rank函數 &讀Matlab7.7的orth》中,討論了eps函數的幾個實際應用;
- 在《關于Matlab的eps函數(九)——Java也有"eps"函數》中,我們展示了Java中,與eps功能類似的方法ulp的用法,并討論了ulp和eps的不同;
- 在《關于Matlab的eps函數(十)——MATLAB Coder生成的C代碼》中,我們通過MATLAB Coder窺見了官方的eps實現方法;
- 在《GPU Powered Matlab(三)——關于Matlab的eps函數(十一)》和《GPU Powered Matlab(三點一)——關于Matlab的eps函數(十二)》中,我們試著將eps搬到CUDA GPU上執行。

上圖中數值顯示控件“數值3”輸出的數值為0,說明LabVIEW節點“計算機?”和Matlab的eps(1)相等。實際上,由于MATLAB的函數支持可變個數的參數,且函數調用的時候可以省去括號,因此eps(1)也可以寫成eps這種形式,這就是導致很多人認為Matlab中的eps是一個常數而非函數的原因。如果勤快的話,在Matlab的Command Window中敲上一行“doc eps”就能看到關于eps的更多信息。
eps(1) * 2 ^ E
得到了eps(R)的值。這里我們也可以使用這種手法。
*(type *) &R
的變換,正是我們所需要的。
>> format hex
取一個雙精度浮點數15,轉換成字節數組:
>> bytes = typecast(15, uint8)
bytes =
我們知道,浮點數是由符號,指數,尾數三個部分組成的。這里試著將字節數組最后一個字節的最高位改成1,對應的浮點數就是符號位變成1,會變成負數:
>> bytes(end) = hex2dec(c0);
>> format; dbl = typecast(bytes, double)
dbl =
再試試對浮點數的指數部分進行操作。雙精度浮點數有8個字節,64位。其中符號位1位,指數位11位,尾數位52位,如果想把指數加上1(等效于浮點數乘以2),只需要執行下面的操作:
>> typecast(typecast(15, uint64) bitshift(uint64(1), 52), double)
ans =
首先將雙精度浮點數15 reinterpret成unsigned int64,然后加上1左移52位,再reinterpret成double。就是這么簡單。


評論