7

Todos sabemos acerca de un cortocircuito en las expresiones lógicas, es decir, cuando¿Existe tal cosa como la multiplicación de cortocircuitos?

if (False AND myFunc(a)) then 
... 

no molesta a la ejecución de myFunc() porque no hay forma de la condición if puede ser verdad.

tenía curiosidad acerca de si existe un equivalente para su ecuación algebraica todos los días, dicen

result = C*x/y + z 

Si C=0 no hay ningún punto en la evaluación del primer término. No importaría mucho en cuanto a rendimiento si x y y fueran escalares, pero si pretendemos que son matrices grandes y las operaciones son costosas (y aplicables a las matrices) entonces seguramente haría la diferencia. Por supuesto, podrías evitar un caso tan extremo lanzando una declaración if C!=0.

Entonces mi pregunta es si tal característica existe y si es útil. No soy muy programador, por lo que probablemente lo haga bajo algún nombre que no haya encontrado; si es así, por favor aclararme :)

+1

lógico cortocircuitos es un concepto importante desde un punto de vista de la funcionalidad, mientras que "la aritmética cortocircuitos" es simplemente una optimización en el nivel del compilador sin diferencia funcional. Es posible que su idioma de elección ya lo esté haciendo entre bastidores sin que lo note. – deceze

+2

Alguien que sabe más que yo debería contestar, pero me imagino que tendrías problemas si cortocircuitas la división. ¿Qué pasaría, por ejemplo, si y = 0? Si se cortocircuita, devolvería 0 cuando la respuesta es realmente un error. – Nate

+0

@deceze Los cortocircuitos aritméticos ciertamente tendrían diferencias funcionales más allá de la optimización, al igual que los cortocircuitos lógicos. Considera 'result = C * myfunction()'. Si 'C == 0' hace que la expresión aritmética se cortocircuite, entonces' myfunction' nunca se invoca, y no se producen los efectos secundarios que pueda haber tenido (al igual que con un cortocircuito lógico). –

Respuesta

6

El concepto que está hablando se conoce con diferentes nombres: evaluación perezosa, evaluación no estricto, llamada por necesidad, para nombrar unos pocos y en realidad es mucho más potente que sólo evitar una multiplicación aquí y ahí.

Existen lenguajes de programación como Haskell o Frege cuyo modelo de evaluación no es estricto. No sería muy fácil escribir el "cortocircuito" operador de multiplicación, por ejemplo, usted podría escribir algo como:

infixl 7 `*?`  -- tell compiler that ?* is a left associative infix operator 
        -- with precedence 7 (like the normal *) 

0 *? x = 0   -- do not evaluate x 
y *? x = y * x  -- fall back to standard multiplication 
+0

Gracias! Aceptado también para responder algunas preguntas de seguimiento. – Verge

1

Si los datos son grandes y/o complejos y las operaciones son costosas, entonces la implementación de la operación debe realizar comprobaciones de acceso directo apropiadas antes de comprometerse con la costosa operación. Es un detalle interno de la implementación del operador (por ejemplo, matriz *) pero realmente no tiene nada que ver con el concepto de lenguaje de "multiplicar" y debería tener poco impacto en la forma de escribir sus cálculos.

Cuestiones relacionadas