學(xué)習(xí)LabVIEW(十)——關(guān)于Matlab的eps函數(shù)(十三)
- 在《關(guān)于Matlab的eps函數(shù)》中,我們討論了eps的本質(zhì),并使用Matlab的typecast函數(shù)(用來實現(xiàn)reinterpret cast)實現(xiàn)了eps的計算;
- 在《關(guān)于Matlab的eps函數(shù)(續(xù))》,《關(guān)于Matlab的eps函數(shù)(又續(xù))》,《關(guān)于Matlab的eps函數(shù)(六)》和《關(guān)于Matlab的eps函數(shù)(七)——“又續(xù)”的續(xù)》中,我們利用位段結(jié)構(gòu)體實現(xiàn)了eps計算,這種版本的可讀性比最初用typecast實現(xiàn)的版本要好多了;
- 在《關(guān)于Matlab的eps函數(shù)(再續(xù))》中,我們根據(jù)mathworks上的一個帖子,討論了利用純粹的數(shù)學(xué)運算而不是位運算實現(xiàn)eps的方法;
- 在《關(guān)于Matlab的eps函數(shù)(五)》和《Article 4 in 1: 關(guān)于Matlab的eps函數(shù)(八) &讀Matlab7.7的rank函數(shù) &讀Matlab7.7的orth》中,討論了eps函數(shù)的幾個實際應(yīng)用;
- 在《關(guān)于Matlab的eps函數(shù)(九)——Java也有"eps"函數(shù)》中,我們展示了Java中,與eps功能類似的方法ulp的用法,并討論了ulp和eps的不同;
- 在《關(guān)于Matlab的eps函數(shù)(十)——MATLAB Coder生成的C代碼》中,我們通過MATLAB Coder窺見了官方的eps實現(xiàn)方法;
- 在《GPU Powered Matlab(三)——關(guān)于Matlab的eps函數(shù)(十一)》和《GPU Powered Matlab(三點一)——關(guān)于Matlab的eps函數(shù)(十二)》中,我們試著將eps搬到CUDA GPU上執(zhí)行。
上圖中數(shù)值顯示控件“數(shù)值3”輸出的數(shù)值為0,說明LabVIEW節(jié)點“計算機?”和Matlab的eps(1)相等。實際上,由于MATLAB的函數(shù)支持可變個數(shù)的參數(shù),且函數(shù)調(diào)用的時候可以省去括號,因此eps(1)也可以寫成eps這種形式,這就是導(dǎo)致很多人認(rèn)為Matlab中的eps是一個常數(shù)而非函數(shù)的原因。如果勤快的話,在Matlab的Command Window中敲上一行“doc eps”就能看到關(guān)于eps的更多信息。
eps(1) * 2 ^ E
得到了eps(R)的值。這里我們也可以使用這種手法。
*(type *) &R
的變換,正是我們所需要的。
>> format hex
取一個雙精度浮點數(shù)15,轉(zhuǎn)換成字節(jié)數(shù)組:
>> bytes = typecast(15, uint8)
bytes =
我們知道,浮點數(shù)是由符號,指數(shù),尾數(shù)三個部分組成的。這里試著將字節(jié)數(shù)組最后一個字節(jié)的最高位改成1,對應(yīng)的浮點數(shù)就是符號位變成1,會變成負(fù)數(shù):
>> bytes(end) = hex2dec(c0);
>> format; dbl = typecast(bytes, double)
dbl =
再試試對浮點數(shù)的指數(shù)部分進行操作。雙精度浮點數(shù)有8個字節(jié),64位。其中符號位1位,指數(shù)位11位,尾數(shù)位52位,如果想把指數(shù)加上1(等效于浮點數(shù)乘以2),只需要執(zhí)行下面的操作:
>> typecast(typecast(15, uint64) bitshift(uint64(1), 52), double)
ans =
首先將雙精度浮點數(shù)15 reinterpret成unsigned int64,然后加上1左移52位,再reinterpret成double。就是這么簡單。
評論