2013-02-14 88 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; 
} 
相关问题