He notado un comportamiento interesante con el redondeo/truncamiento del flotador por el compilador C#. A saber, cuando un literal flotante está más allá del rango representable garantizado (7 dígitos decimales), entonces a) se expulsa explícitamente un resultado flotante a flotación (una operación semánticamente innecesaria) yb) se almacenan resultados intermedios de cálculo en una variable local. Un ejemplo:Comportamiento extraño del compilador con literales float vs variables float
using System;
class Program
{
static void Main()
{
float f = 2.0499999f;
var a = f * 100f;
var b = (int) (f * 100f);
var c = (int) (float) (f * 100f);
var d = (int) a;
var e = (int) (float) a;
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Console.WriteLine(e);
}
}
La salida es:
205
204
205
205
205
En la versión de depuración compilados JIT en mi equipo, b se calcula de la siguiente manera:
var b = (int) (f * 100f);
0000005a fld dword ptr [ebp-3Ch]
0000005d fmul dword ptr ds:[035E1648h]
00000063 fstp qword ptr [ebp-5Ch]
00000066 movsd xmm0,mmword ptr [ebp-5Ch]
0000006b cvttsd2si eax,xmm0
0000006f mov dword ptr [ebp-44h],eax
mientras que D se calcula como
var d = (int) a;
00000096 fld dword ptr [ebp-40h]
00000099 fstp qword ptr [ebp-5Ch]
0000009c movsd xmm0,mmword ptr [ebp-5Ch]
000000a1 cvttsd2si eax,xmm0
000000a5 mov dword ptr [ebp-4Ch],eax
Finalmente, mi questi on: ¿por qué la segunda línea de la salida es diferente de la cuarta? ¿Esa fmul adicional hace una gran diferencia? También tenga en cuenta que si el último dígito (ya no representable) del float f se elimina o incluso se reduce, todo "cae en su lugar".
vi contestar a esta pregunta aquí, pero no puede encontrarlo – Andrey