Mi aplicación debe producir exactamente los mismos resultados numéricos en todas las máquinas. Entiendo que float / double math en C # no es determinista, pero ¿qué tal la representación binaria de valores literales?

float x = 1.23f;

¿Cómo se almacenará 1.23f en el archivo DLL compilado? Como una representación binaria de formato flotante de formato IEEE-754 de 32 bits? ¿O como una representación intermedia que necesitará la conversión al punto flotante IEEE-754 por el jitter en la máquina objetivo (una fuente potencial de indeterminismo)?

Entiendo por qué las operaciones de coma flotante en C # no son deterministas. SOLO pregunto si la representación binaria de literales es determinista. Por favor, no hay respuestas sobre el determinismo de coma flotante en general.

1
kaalus 2 abr. 2020 a las 18:35

2 respuestas

La mejor respuesta

Ellas se almacenan como formato IEEE 754.

Puede verificar esto utilizando ILDASM.EXE para desarmar el código generado e inspeccionar los valores binarios.

Por ejemplo, float x = 1.23f; generará:

IL_0000:  /* 22   | A4709D3F         */ ldc.r4     1.23

(Tenga en cuenta que esto se almacena en formato little-endian en las plataformas Intel).

2
Matthew Watson 2 abr. 2020 a las 16:08

El tipo decimal se introdujo por este motivo. Compruébelo en la documentación oficial de Microsoft aquí. https://docs.microsoft.com/ es-es / dotnet / api / system.decimal? view = netframework-4.8

Un número decimal es un valor de punto flotante que consiste en un signo, un valor numérico donde cada dígito en el valor varía de 0 a 9 y un factor de escala que indica la posición de un punto decimal flotante que separa las partes integrales y fraccionarias. del valor numérico.

La representación binaria de un valor decimal consiste en un signo de 1 bit, un número entero de 96 bits y un factor de escala utilizado para dividir el entero de 96 bits y especificar qué porción es una fracción decimal. El factor de escala es implícitamente el número 10, elevado a un exponente que varía de 0 a 28. Por lo tanto, la representación binaria de un valor decimal es la forma, ((-296 a 296) / 10 (0 a 28)), donde - ( 296-1) es igual a MinValue y 296-1 es igual a MaxValue. Para obtener más información sobre la representación binaria de valores decimales y un ejemplo, vea el constructor Decimal (Int32 []) y el método GetBits.

El factor de escala también conserva los ceros finales en un número decimal. Los ceros finales no afectan el valor de un número decimal en operaciones aritméticas o de comparación. Sin embargo, el método ToString puede revelar ceros finales si se aplica una cadena de formato adecuada.

-1
Phoenix Stoneham 2 abr. 2020 a las 15:45