Valores máximos/mínimos de tipos de datos estándar

¿Dónde puedo encontrar los valores máximos y mínimos que pueden almacenar varios tipos? ¿Y un valor épsilon para flotadores?

Estoy buscando algo como C's limits.h, pero para Solidity/EVM.

Respuestas (2)

Actualizado 2020

Se introdujo Solidity 0.6.8min y maxpalabras clave que ahora pueden indicarle de forma nativa el mínimo y el máximo de un tipo esperado. Desde la página de lanzamiento:

Se implementaron type(T).min y type(T).max para cada tipo entero T que devuelve el valor más pequeño y más grande representable por el tipo.

Puedes probarlo con el siguiente código. Tenga en cuenta que los uint256valores se pueden intercambiar por cualquier tipo de entero válido:

pragma solidity ^0.6.8;

contract TestContract {
    uint256 public a;
    uint256 public b;
    
    function myTest() external {
        a = type(uint256).min;
        b = type(uint256).max;
    }
}

Supongo que te refieres a los tipos enteros, porque esos son realmente los únicos tipos en Solidity que tienen un máximo y un mínimo.

Solidity no admite tipos de punto flotante, y lo más probable es que nunca lo haga porque se considera que no son lo suficientemente precisos. Los contratos de Ethereum deben ser 100% deterministas y siempre ejecutarse de la misma manera en todo el hardware.

En el futuro, Solidity admitirá tipos de punto fijo, pero aún no.

En primer lugar, intmedios int256y uintmedios uint256. Una vez que sepa la cantidad de bits que tiene su número entero, puede calcular fácilmente el mínimo y el máximo usando aritmética bit a bit:

int256 constant INT256_MIN = int256(uint256(1) << 255);
int256 constant INT256_MAX = int256(~(uint256(1) << 255));
uint256 constant UINT256_MIN = 0;
uint256 constant UINT256_MAX = ~uint256(0);

Todo el cambio bit a bit se realiza en enteros sin firmar para evitar cualquier comportamiento especial en el bit de signo.

¡Salud! FYI, estándar como IEEE754 se ejecutaría de manera determinista en todo el hardware. Independientemente, hay una capa de abstracción de máquina virtual.
@TomHale Sí, un estándar es un estándar, por supuesto. La cuestión es que he tenido problemas con la compilación de aritmética flotante de 64 bits a aritmética flotante de 80 bits de precisión extendida sin que nadie se dé cuenta. Una vez que se realizaron los cálculos, el compilador convirtió el flotante de 80 bits nuevamente en flotante de 64 bits. Esto causó diferencias aparentes en diferentes hardware, lo que fue una especie de desastre. Por supuesto, fue culpa del compilador y de los programadores, no del hardware o del estándar. Supongo que tengo un poco de prejuicio contra los flotadores :-)