成人AV在线无码|婷婷五月激情色,|伊人加勒比二三四区|国产一区激情都市|亚洲AV无码电影|日av韩av无码|天堂在线亚洲Av|无码一区二区影院|成人无码毛片AV|超碰在线看中文字幕

java浮點(diǎn)數(shù)運(yùn)算不精確的原因 float和double區(qū)別?

float和double區(qū)別?浮動(dòng)的解釋:動(dòng)詞 (verb的縮寫)飄,飄;漂泊,飄動(dòng);漂移;安排(貸款)被提出來考慮(一個(gè)想法或計(jì)劃);發(fā)行(股票)上市;自由浮動(dòng)(貨幣匯率)零錢(用于酒吧等給顧客找錢

float和double區(qū)別?

浮動(dòng)的解釋:

動(dòng)詞 (verb的縮寫)飄,飄;漂泊,飄動(dòng);漂移;安排(貸款)被提出來考慮(一個(gè)想法或計(jì)劃);發(fā)行(股票)上市;自由浮動(dòng)(貨幣匯率)

零錢(用于酒吧等給顧客找錢);飄,飄;浮板;漂浮物;魚漂;浮動(dòng);冰淇淋飲料;浮動(dòng)期;坐在漂浮的盒子里(為了治療、康復(fù)或放松);救生圈

雙重解釋:

雙倍;配對(duì);(指花)有重瓣的;對(duì)于兩個(gè)人來說;兩倍

非常相似的對(duì)應(yīng)物;身體替身;兩個(gè)人的東西;雙倍;(復(fù)數(shù))雙打,尤指網(wǎng)球;雙料冠軍(同一賽季或同一年度兩次奪冠者);(棒球)雙重打擊;雙精度浮點(diǎn)數(shù)(在C語(yǔ)言中)

動(dòng)詞 (v

Java和C# 最大的不同是什么?

我覺得除了語(yǔ)法,最重要的是對(duì)底層的掌控能力不同。

雖然C#一開始借鑒了Java,但其目的根本不是為了構(gòu)建一個(gè)更好的Java,而是為了構(gòu)建一個(gè)更好的C,游戲引擎更喜歡C#就是這個(gè)原因。

例如,在C#中可以做什么:

上面的代碼會(huì)輸出10,為什么?因?yàn)閿?shù)組的長(zhǎng)度。NET存儲(chǔ)在數(shù)組第一個(gè)元素之前的8字節(jié)內(nèi)存中。如果您隨后輸出*(long *)p-2),您將直接獲得該對(duì)象的TypeHandle地址:

然后拿著這個(gè)指針,就可以訪問對(duì)象的MethodTable了。

此外,您可以在堆棧上手動(dòng)分配空間:

然后,您希望繞過GC,直接手動(dòng)分配堆內(nèi)存:

以上調(diào)用相當(dāng)于C語(yǔ)言中你調(diào)用的malloc,此外還有AllocAligned,Realloc,AllocZeroed等等,可以直接控制內(nèi)存對(duì)齊。

接下來,您希望創(chuàng)建一個(gè)具有顯式內(nèi)存布局的結(jié)構(gòu)Foo:

那么你就成功模擬了C的一個(gè)并集,之所以會(huì)有上面的輸出,是因?yàn)閱尉雀↑c(diǎn)數(shù)1的二進(jìn)制表示是0x 01111111000000000000000000000000,在小終端模式存儲(chǔ)后占用了4個(gè)字節(jié),分別是0x000000000000、0x 00000000000、0x 000000000。

此外,您可以直接從內(nèi)存數(shù)據(jù)構(gòu)造對(duì)象,而無需任何復(fù)制開銷:

甚至像這樣:

從堆內(nèi)存中創(chuàng)建自然很好:

再比如,此時(shí)你有一個(gè)用C寫的庫(kù),里面有這樣一段代碼:

然后我們編寫下面的C#代碼:

上面的代碼做了什么?我們把C#的函數(shù)指針傳入C代碼,然后在C端調(diào)用C#函數(shù)。數(shù)字生成一個(gè)字符串wwwww,然后把這個(gè)字符串返回給C#端。它不 使用委托而不是函數(shù)指針并不重要,因?yàn)楹瘮?shù)指針在。網(wǎng)。

即使我們沒有。;我不想要。NET要導(dǎo)入foo.dll,而我們想自己決定動(dòng)態(tài)庫(kù)的生命周期,我們也可以寫:

以上都不是特定于Windows和導(dǎo)入的。所以還有。Linux和macOS上的dylib是完全不可能的。

此外,我們有一些數(shù)據(jù),我們想計(jì)算,但我們想使用SIMD進(jìn)行處理,所以我們只需要寫:

您可以看到在X86平臺(tái)上生成了什么代碼:

平臺(tái)判斷的分支會(huì)被JIT自動(dòng)淘汰。但實(shí)際上,除了手動(dòng)編寫SIMD代碼,前兩個(gè)分支完全可以省略,只剩下:

因?yàn)樵谶@個(gè)階段,當(dāng)循環(huán)邊界條件是向量長(zhǎng)度時(shí),。NET會(huì)自動(dòng)為我們做定向量化,擴(kuò)展循環(huán)。

然后繼續(xù),我們還有ref,in和out來傳遞引用。

假設(shè)我們有一個(gè)大的struct,為了避免傳遞時(shí)的復(fù)制,我們可以直接使用in進(jìn)行只讀引用傳遞:

對(duì)于小型結(jié)構(gòu),為。NET有特殊的優(yōu)化來幫助我們完全消除內(nèi)存分配,并將結(jié)構(gòu)完全放在寄存器中,如下面的代碼:

上面的代碼GetDistance被認(rèn)為是一個(gè)熱路徑,所以我添加了它來指示JIT有保證地內(nèi)聯(lián)這個(gè)函數(shù),最后生成了下面的代碼進(jìn)行測(cè)試:

整個(gè)過程沒有訪問內(nèi)存的指令,效率非常高。

我們也可以借用ref的引用語(yǔ)義來做就地更新:

它甚至可以用于指針和手動(dòng)分配內(nèi)存:

與Java不同,C#中的泛型真正專門化了所有的類型參數(shù)(雖然運(yùn)行時(shí)分布用于引用類型的共享實(shí)現(xiàn)),這意味著性能可以得到最大程度的保證,對(duì)應(yīng)的類型根據(jù)類型參數(shù)的大小有專門的內(nèi)存布局。還是上面的點(diǎn)例子,我們將下面的數(shù)據(jù)int替換為泛型參數(shù)t,并對(duì)值類型number進(jìn)行泛型約束:

無論是Test1還是Test2,生成的代碼都很優(yōu)秀,不僅沒有打包和解包,而且沒有訪問操作:

然后,我們有時(shí)為了高性能想暫時(shí)中止GC恢復(fù),就一句簡(jiǎn)單的話:

如果你還能分配128mb的內(nèi)存,你可以告訴GC不要回收,然后一段時(shí)間后,即使我們?cè)谶@個(gè)預(yù)算中分配內(nèi)存,也不會(huì)發(fā)生GC。它甚至可以防止在內(nèi)存分配不足時(shí)阻塞完全垃圾收集:

代碼執(zhí)行完畢,最后一次調(diào)用a:

可以恢復(fù)。GC行為。

此外,我們還可以指定GC在運(yùn)行時(shí)的模式,以最大限度地提高性能:

此外,我們甚至可以直接在堆內(nèi)存中執(zhí)行代碼,創(chuàng)建一個(gè)JIT。NET中,直接從內(nèi)存中創(chuàng)建一個(gè)可執(zhí)行區(qū),然后在其中插入一段代碼來添加兩個(gè)32位整數(shù):

除此之外,C#還有無數(shù)底層的編寫方法與操作系統(tǒng)交互,甚至使用C#的編譯器解除與自身標(biāo)準(zhǔn)庫(kù)的鏈接,直接從0開始構(gòu)建基本類型,然后通過NativeAOT編譯出完全無GC、可以在裸機(jī)硬件上執(zhí)行引導(dǎo)系統(tǒng)的EFI固件也是沒有問題的。

另外還有ILGPU可以讓你直接在GPU上運(yùn)行C#代碼,在嵌入式設(shè)備上運(yùn)行可以直接操作I2C、PWM、GPIO等。,所以不再舉例。

而C#已經(jīng)進(jìn)入了roadmap的后續(xù)更新:允許引用字段的聲明,增加類型表示定長(zhǎng)內(nèi)存,允許傳遞數(shù)組時(shí)消除數(shù)組分配,允許棧上任何對(duì)象的分配等等。,所有這些都在改善這些基礎(chǔ)性能設(shè)施。

那個(gè) 這是我認(rèn)為C#和Java最大的區(qū)別。

在C#中,當(dāng)你不 t需要這些東西,它們好像從來不存在,允許動(dòng)態(tài)類型,不斷吸收各種功能特性,各種語(yǔ)法糖加持。簡(jiǎn)單性和靈活性。;甚至不會(huì)失去Python,所以你可以愉快而簡(jiǎn)單地編寫各種代碼。一旦你需要,你就可以擁有從上到下幾乎完全的控制能力,而這些能力會(huì)讓你在必要的時(shí)候不用思考各種奇怪的變通方法,直接把機(jī)器榨干,達(dá)到C和C的性能,甚至因?yàn)檫\(yùn)行時(shí)PGO而超過C和C的性能。