Почему этот код печатает 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.