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