討論區快速選單
知識庫快速選單
政府補助!學嵌入式+物聯網 網路投保旅行平安險 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
how to design a function ?
更改我的閱讀文章字型大小
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4498 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/10/31 下午 06:39:39
Assume that we have a machine and its architecture is IA-64 ( Intel Architecture, 64-bits ). According to IA-64 architecture , its double representation also follows IEEE-754 standard , more information about it - http://en.wikipedia.org/wiki/double-precision_floating-point_format .
Now we want to design a customized routine - abs ( it means an absolute value function ).
Can you write some codes and without any branch instructions ?
作者 : rollboy(roller) 貼文超過200則人氣指數超過10000點
[ 貼文 396 | 人氣 24176 | 評價 370 | 評價/貼文 0.93 | 送出評價 62 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/5 下午 10:52:08
我不知道64bits的差別在哪 ...

若完全只是針對不使用branch instructions,
有個搞笑的方法,
弄個array存好相對應的正負值,
取原始值的sign bit當陣列索引值就可以取得絕對值.


>Assume that we have a machine and its architecture is IA-64 ( Intel Architecture, 64-bits ). According to IA-64 architecture , its double representation also follows IEEE-754 standard , more information about it - http://en.wikipedia.org/wiki/double-precision_floating-point_format .
>Now we want to design a customized routine - abs ( it means an absolute value function ).
>Can you write some codes and without any branch instructions ?
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4498 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/5 下午 11:21:40
may you write ur answer and prove its correctness ?
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/5 下午 11:58:10
IA-32/64 assembly (VC++ 2005 abs() 函式), 原數值在 eax, abs() 的結果同樣在 eax:
  cdq
  xor eax, edx
  sub eax, edx

用 C 的寫法就是:
  int const mask = x >> sizeof(int) * CHAR_BIT - 1;
  return (x ^ mask) - mask;

這個邏輯據說是已註冊專利的, 所以可以用:
IA-32/64:
  cdq
  add eax, edx
  xor eax, edx

C:
  return (x + mask) ^ mask;

作者 : rollboy(roller) 貼文超過200則人氣指數超過10000點
[ 貼文 396 | 人氣 24176 | 評價 370 | 評價/貼文 0.93 | 送出評價 62 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/6 上午 12:29:12
如此而已, 根據你的題目要求, 我沒有犯規喔! :P

    float original_value = 0.1;
    float mapping_value[2];

    mapping_value[0] = original_value;
    mapping_value[1] = -original_value;

    original_value = mapping_value[*((unsigned int *)&original_value) >> 31];

相關討論亦可見StackOverflow http://stackoverflow.com/questions/9772348/get-absolute-value-without-using-abs-function-nor-if-statement
然後, 我真是笨蛋, 取sign bit的動作其實可以用 (original_value < 0) 直接取代.


>may you write ur answer and prove its correctness ?
作者 : rollboy(roller) 貼文超過200則人氣指數超過10000點
[ 貼文 396 | 人氣 24176 | 評價 370 | 評價/貼文 0.93 | 送出評價 62 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/6 上午 12:37:36
抱歉, 忘記說上述Stackoverflow的討論只是單單針對int 型別.
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/11/6 上午 02:55:21
沒注意到樓主要的是浮點數的絕對值, 既然標明是 IA32/64 架構, 直接把 IEEE-754 浮點格式的 sign bit 清除掉應該就可以了:

// x = abs(x)
*(((unsigned char*)&x) + sizeof x - 1) &= 0x7f;

x 可以是 float double.
注意, 只能用在特定平台 (little-endian) 上.

 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.15625