[問題] _uint128 library ?

看板C_and_CPP (C/C++)作者 (閉上眼的魚)時間13年前 (2012/11/30 10:02), 編輯推噓2(2016)
留言18則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) vc / mingw, windows, 32-bits 問題(Question): 有 library 和 語法/設計 問題,請不吝指點。 Library 我記得早期 vc6.0 時在某份 header 裡面有定義 "類似" __int128 之類的東西 (也可能是我記錯),但一直都不能被使用,鑑於時間有限, 要份效率較佳的 _uint128 library,C/C++ 均可。 自己有花點時間寫份簡易版 class,prototype 大致如下 http://codepad.org/chxsKqql , 內容採用的是 65536 進位, 加上考慮 unsigned 比 unsigned long long 快、處理溢位問題, 所以 data member 弄成 unsigned u[8]. 一般的大數庫 (像 gmp ) 已不考慮了,裡頭沒針對 128-bits 做效能上優化, 另 "我沒記錯的話",gmp 採用的是萬進位,針對 u128 特例應有很大改善空間, 故請教是否有版友使用過效能還不錯的函式庫? 語法/設計 1. 針對 32-bit/64-bit 環境而言,data member 不知會挑下列哪種? unsigned long long u[2]; unsigned long long u[4]; unsigned int u[4]; ---> 若 64-bit 環境之 unsigned int=64bits,我會選這個 unsigned int u[8]; ---> 我於 32-bit環境選擇 2. member function constructor u128::u128(u128 &) {...whatever...} u128::u128 & operator = (const u128& ) { ...whatever...} u128 u128::operator-( const u128& x) const { u128 rst(x); // ----> vc error C2558 unsigned b=0U, s; for(size_t i=0; i<sizeof(u)/sizeof(u[0]); ++i){ s = x[i]+b; rst[i]=u[i]+( (b=(u[i]<s)) <<16)-s; } return rst; } 我以為做了 constructor 出來後,在 member function 裡也可進行調用, 另外在做除法/取模時類似的東西 u128 rst(*this); 也是噴一樣的 error, 請問我觀念哪出錯了? 3. better designed pattern 除了 source 中之 magic number (16 / 65536 這個沒定義) 外, 我想會可能有更好的架構, 特別是最後要 return reference 還是 return object,我寫到後來整個猶豫 Orz. < 除了少數部份是明顯之外,我也只知道 can't return reference of local var.> 另外我沒記錯的話, operator = 只能在類別裡面在複載,但很尬尷的一點是... u128 x; unsinged a; x = a; // 可以做到, u128 overload operator = a = x; // 這個要怎麼做? operator = 不能做成 global ----------- 問題有點多,在此先謝謝各位先進不吝賜教,小弟感激不盡。 -- 就算把新鮮的肝拿回去,還是一樣寫碼到禿頭,加班到天亮, 永遠當老闆的傀儡 你是不是想這麼做? 是的話你就拿回去~ 拿啊!! 九世宅男 : 下輩子不要再讓我幹工程師了 ~ < Kuso 星爺語錄 > -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.76.161

11/30 10:32, , 1F
問題2. copy constructor參數沒加const
11/30 10:32, 1F

11/30 10:33, , 2F
3. 用typecast overload
11/30 10:33, 2F

11/30 11:08, , 3F
謝謝 littleshan,這兩個都解掉了,感謝 :)
11/30 11:08, 3F
※ 編輯: EdisonX 來自: 180.177.76.161 (11/30 11:09)

11/30 11:19, , 4F
http://goo.gl/72ia <= c++ 的 operator 還有 prototype
11/30 11:19, 4F

11/30 14:53, , 5F
gcc/clang on 64bit platform might have types:
11/30 14:53, 5F

11/30 14:53, , 6F
__(u)int128_t
11/30 14:53, 6F

11/30 15:07, , 7F
or maybe you can try Boost.Multiprecision
11/30 15:07, 7F

11/30 17:23, , 8F
@stimim: wiki 那段我有看過,但一直覺得關鍵的 return
11/30 17:23, 8F

11/30 17:23, , 9F
ref / obj. 它沒做區別,然後也把 const 都拿掉.
11/30 17:23, 9F

11/30 17:24, , 10F
@loveme00835 : 感謝您提供的東西,謝謝。
11/30 17:24, 10F

11/30 17:41, , 11F
可以參考_m128i的作法 http://ppt.cc/tm~o
11/30 17:41, 11F

11/30 17:45, , 12F
k 大您給的 link 太棒了,之前沒找到 M$ 有這個 type,
11/30 17:45, 12F

11/30 17:46, , 13F
_m128i 的宣告我覺得很漂亮說,感謝您的提供 :)
11/30 17:46, 13F

11/30 19:39, , 14F
return type 就看 primitive type 吧,比如說,
11/30 19:39, 14F

11/30 19:43, , 15F
(a=b)=c 算是未定義還是等同於a=b? (++a)=3呢? (a++)=3?
11/30 19:43, 15F

11/30 22:01, , 16F
謝謝 stimim , 我再細思 :)
11/30 22:01, 16F

12/01 22:50, , 17F
Q1:用stdint.h 裡的uint32_t,uint64_t去做...
12/01 22:50, 17F

12/02 12:38, , 18F
@firefox : 謝謝,原本的意思是哪種方式較佳 :)
12/02 12:38, 18F
文章代碼(AID): #1Gk1EOLi (C_and_CPP)
文章代碼(AID): #1Gk1EOLi (C_and_CPP)