你如何在Erlang中做模数或余数?

时间:2008-12-09 15:52:40

标签: erlang modulo

我是Erlang的新手。你怎么做模数(得到除法的其余部分)?它在大多数类C语言中都是%,但它在Erlang中指定了一个注释。

有几个人回复了rem,在大多数情况下都很好。但是我正在重新审视这个因为现在我需要使用负数而rem会给你一个除法的余数,这与负数的模数不同。

8 个答案:

答案 0 :(得分:37)

在Erlang中,5 rem 3.给出2,而-5 rem 3.给-2。如果我理解你的问题,你会想要-5 rem 3.而不是1,因为-5 = -2 * 3 + 1.

这样做你想要的吗?

mod(X,Y) when X > 0 -> X rem Y;
mod(X,Y) when X < 0 -> Y + X rem Y;
mod(0,Y) -> 0.

答案 1 :(得分:28)

erlang模数运算符是rem

Eshell V5.6.4  (abort with ^G)
1> 97 rem 10.
7

答案 2 :(得分:8)

我在灵药中使用了以下内容:

defp mod(x,y) when x > 0, do: rem(x, y);
defp mod(x,y) when x < 0, do: rem(x, y) + y;
defp mod(0,_y), do: 0

请不要忽略这一点,因为它是另一种语言而不是问题。我们都过着梦想,因为我们都拥有光束。

答案 3 :(得分:3)

根据this blog post,它是rem

答案 4 :(得分:2)

上述Y + X rem Y似乎是错误的:要么(Y + X)rem Y或Y +(X rem Y)产生不正确的结果。例如:让Y = 3。如果X = -4,则第一个形式返回-1,如果X = -3,则第二个形式返回3,其中没有一个形式为[0; 3 [。

我改用它:

% Returns the positive remainder of the division of X by Y, in [0;Y[. 
% In Erlang, -5 rem 3 is -2, whereas this function will return 1,  
% since -5 =-2 * 3 + 1.

modulo(X,Y) when X > 0 ->   
   X rem Y;

modulo(X,Y) when X < 0 ->   
    K = (-X div Y)+1,
    PositiveX = X + K*Y,
    PositiveX rem Y;

modulo(0,_Y) -> 
    0.

答案 5 :(得分:1)

Erlang余数不适用于负数,因此您必须为负参数编写自己的函数。

答案 6 :(得分:1)

mod(A, B) when A > 0 -> A rem B;
mod(A, B) when A < 0 -> mod(A+B, B); 
mod(0, _) -> 0.

% console:
3> my:mod(-13, 5).
2

答案 7 :(得分:1)

接受的答案是错误的。

public class CustomHandlerResolver implements HandlerResolver { /** * Overrode in order to load custom handlers. * @see javax.xml.ws.handler.HandlerResolver#getHandlerChain(javax.xml.ws.handler.PortInfo) */ public List<Handler> getHandlerChain(PortInfo portInfo) { List<Handler> handlerChain = new ArrayList<Handler>(); LoggingSOAPHandler hh = new LoggingSOAPHandler(); handlerChain.add(hh); return handlerChain; } } 的行为与现代C中的 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> <!-- Use custom HandlerResolver that loads a list of custom SOAP handlers --> <bean id="CustomHandlerResolver" class="com.ws.handler.CustomHandlerResolver"/> <bean id="registrationService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"> <property name="lookupServiceOnStartup" value="false" /> <property name="serviceName" value="TestService" /> <property name="serviceInterface" value="com.ws.registration.TestService" /> <property name="wsdlDocumentUrl" value="${registration.service}?wsdl" /> <property name="namespaceUri" value="${registration.namespace}" /> <property name="endpointAddress" value="${registration.service}" /> <property name="username" value="${registration.username}"/> <property name="password" value="${registration.password}"/> <property name="customProperties" ref="jaxwsCustomProperties" /> <property name="handlerResolver" ref="CustomHandlerResolver"/> </bean> ....... </beans> 运算符完全相同。它使用截断的除法。

对于X <0且Y <0,接受的答案失败。考虑.wizard > .actions > ul > li.disabled { display: none; }

rem

模运算符的替代实现使用floored division和Euclidean division。这些结果是

%

所以

mod(-5,-3)

不会为X&lt;重现任何模运算符。 0和Y&lt; 0.

并且C: -5 % -3 == -2 rem: -5 rem -3 == -2 Y + X rem Y: -3 + -5 rem -3 == -5 !! wrong !! 按预期工作 - 它使用截断的除法。