¿Se puede demostrar que `num > 0 && num < denom` es siempre lo mismo que 0% < num / denom < 100%?

En Solidity, quiero verificar que el numerador y el denominador pasados ​​a mi función evalúen 0% < num / denom < 100%.

Intenté el enfoque más directo: num / denom > 0 && num / denom < 1pero, por ejemplo, 1% ( 1 / 100 > 0 && 1 / 100 < 1) se evalúa como falso, porque Solidity no tiene decimales.

Mi otra idea es num > 0 && num < denom. ¿Se puede demostrar formalmente que eso es siempre lo mismo que 0% < num / denom < 100%?

Respuestas (2)

Si no está preocupado por los casos exactamente 0% y exactamente 100% (o alternativamente, los casos num == 0y num == denom), entonces sí, num > 0 && num < denomes correcto (con un denom > 1, de todos modos implícito).

La prueba es bastante simple: 0 < num / denom < 1se puede reescribir como 0 * denom < num < 1 * denom, lo que se reduce a 0 < num < denom. Esto se puede reescribir como 0 < num && num < denom, que es equivalente anum > 0 && num < denom

Tenga cuidado con estas cosas: el significado matemático de "0 < num / denom < 1", en el sentido de números racionales o reales, es diferente del significado en lenguajes de programación que tratan con números enteros como Solidity.

Por ejemplo, si num es 1 y denom es 2, entonces num / denom será 0 en Solidity pero 0,5 en el sentido matemático y, por lo tanto, mayor que cero.

En resumen: "num > 0 && num < denom" no es la verificación correcta en Solidity, pero todo depende de lo que hagas con esto después.

Pero eso es exactamente lo que se pregunta. ¿Por qué no es ese el cheque correcto en Solidity? ¿Puedes probarlo formalmente?