我有一種情況,我正在執行大量的行計算,如果我真的可以提高性能可以避開條件語句。獲得1,0,-1作爲正數,零或負的整數只有數學
我需要的是一個給定的正整數,零整數或負整數我想分別得到結果1,0,-1。
所以如果我做col/ABS(col)
,我會得到1爲正數,-1爲負數,但當然,如果col
等於0,那麼我會得到一個錯誤。我無法得到一個錯誤。
這看起來很簡單,但我無法將其前進。
我有一種情況,我正在執行大量的行計算,如果我真的可以提高性能可以避開條件語句。獲得1,0,-1作爲正數,零或負的整數只有數學
我需要的是一個給定的正整數,零整數或負整數我想分別得到結果1,0,-1。
所以如果我做col/ABS(col)
,我會得到1爲正數,-1爲負數,但當然,如果col
等於0,那麼我會得到一個錯誤。我無法得到一個錯誤。
這看起來很簡單,但我無法將其前進。
col/max(1, abs(col))
醜,但工程。對於整數,就是。對於沒有明確定義的最小正值的浮點值,除非語言允許您將其視爲一個位序列,否則您將被卡住,然後您可以對符號標誌和有效位數執行相同的操作。
這是否有助於優化任何事情,但是值得商榷。這當然會讓事情變得更難以閱讀。
謝謝,這個工程。我會盡快檢查你的。在我的應用程序中,IF語句被卸載到不同的引擎中。我不知道Max是否會幫忙,但這正是我所期待的。 – 2014-10-29 16:13:57
但是max只是if語句的包裝...這對我來說沒有多大意義 – 2014-10-29 16:15:04
@TMcKeown是的,這就是爲什麼我對它有點懷疑。但是正如OP所說,如果有兩種不同的引擎在工作,一個是快速的,它有'max()'硬編碼,而慢編碼處理'if'語句(像SQL和PLSQL),它可以避免上下文切換,它可能只是工作。 – biziclop 2014-10-29 16:16:29
假設要麼補32位整數,或沒有負零的補碼擔心,那麼下面的效果很好:
(x>>31) - (-x>>31);
更換31
與63
爲64位整數,所以上。
由於符號位於最後一位,所以這很聰明。我不能使用這個,但這是一個很好的答案。 – 2014-10-29 16:43:09
這不是倒退嗎?對於一個正整數,你會得到'0 - 1'? – beaker 2014-10-29 16:51:19
@beaker不,你會得到'0 - -1',這是'1'。 – 2014-10-29 17:07:22
我在SSAS表格模型中這樣做,它沒有像@ bizclop的答案(這有助於許多其他應用程序,如EXCEL)中的MAX函數。
我落得這樣做這是由接受的答案激發了以下情況:
ROUND([col]/(ABS([col]) + 1), 0)
這最終降低我的查詢時間相當顯著(40%)與IF([col] <> 0, [col]/ABS([col], 0)
。
嗯,乘以'col'這個詞已經產生了什麼影響? – 2014-10-29 16:07:05
根據語言,你可以說:'如果不是值返回0;否則返回值/ abs(值)'。 – fedorqui 2014-10-29 16:07:31
'col/max(1,abs(col))'?醜陋但有用。 (對於整數,就是這樣)。 – biziclop 2014-10-29 16:08:32