Приведение результата к типу float в методе, возвращающем float, изменяет результат

Почему этот код печатает False в .NET 4? Похоже, явное приведение приводит к неожиданному поведению.

Я хотел бы получить ответ, кроме «числа с плавающей запятой неточно» или «не делайте этого».

float a(float x, float y)
{
  return ( x * y );
}

float b(float x, float y)
{
  return (float)( x * y );
}

void Main()
{
  Console.WriteLine( a( 10f, 1f/10f ) == b( 10f, 1f/10f ) );
}

PS: Этот код взят из модульного теста, а не из кода выпуска. Код был написан таким образом намеренно. Я подозревал, что в конечном итоге он потерпит неудачу, но я хотел точно знать, когда и почему. Ответ доказывает правильность этого метода, поскольку он обеспечивает понимание, выходящее за рамки обычного понимания детерминизма с плавающей запятой. Вот в чем смысл написания этого кода таким образом; сознательное исследование.

PPS: Модульный тест проходил в .NET 3.5, но теперь не работает после обновления до .NET 4.

53
задан Rz Mk 19 January 2018 в 05:32
поделиться