2013-02-14 47 views
3

在Windows API的MulDiv便利功能相當於(a*b)/c,但將其除以c避免整數溢出其中a*b大於MAX_INT(a*b)/c不是之前存儲的a*b在64位變量中間結果。是否有與MulDiv for Linux相當的功能?

WINBASEAPI 
int 
WINAPI 
MulDiv(
    _In_ int nNumber, 
    _In_ int nNumerator, 
    _In_ int nDenominator 
    ); 

在Linux中進行編程時,是否有相當的便利功能?

+4

'MulDiv'從16位Windows日期(我還沒有與64位編譯儘管測試過),並在手工製作的彙編程序被執行: http://blogs.msdn.com/b/oldnewthing/archive/2012/05/14/10304701.aspx。它比編譯器的時間更快。現在,只需使用內聯函數。你的編譯器會做正確的事情。 – 2013-02-14 10:22:59

+0

只是好奇,編譯器可以爲64位整數和128位中間結果嗎?無論如何,我認爲乘法的結果存儲在2個寄存器中。 – sashoalm 2013-02-14 10:28:20

+0

但'MulDiv'不等於'(a * b)/ c'!它將結果四捨五入到最接近的整數,而後者向0舍入。(如果將INT_MIN作爲參數傳遞,它也會出現問題:https://blogs.msdn.microsoft.com/oldnewthing/20120514-00/?p=7633 ) – mwfearnley 2016-11-12 17:06:53

回答

2

看來Linux沒有相應的功能。

我創建了一個可行的簡單的內聯函數

inline int mul_div(int number, int numerator, int denominator) { 
    long long ret = number; 
    ret *= numerator; 
    ret /= denominator; 
    return (int) ret; 
} 
相關問題