Добавлен , не публикуется
Unboxing - операция распаковки значения в стек.
Общая информация описана на MSDN.
По весьма странной причине наблюдается разница в работе типа float при нахождении в куче и нахождении в стеке.
Например, формула псевдоскалярного произведения
a.x*b.y - b.x*a.y
при некоторых, вполне корректных и легко рассчитываемых ситуациях возвращает результат с погрешностью.
В случае если погрешность наблюдается по необъяснимым причинам можно попробовать этого избежать, сделав принудительную распаковку значения в стек.
Это можно сделать следующими способами:
  1. Выгрузить результат в отдельные переменные:
var c1 = a.x*b.y;
var c2 = b.x*a.y;
return c1 - c2;
  1. Преобразовать к типу object и обратно к float.
return (float)(object)(a.x*b.y) - (float)(object)(b.x*a.y);
  1. Пропустить через пустой метод:
return (a.x*b.y).unbox() - (b.x*a.y).unbox() ;
public static float unbox(this float value) 
{
    return value;
}
Важно понимать, что операция распаковки является ресурсоемкой, так как подразумевает копирование. Потому не стоит ее использовать, если вы не уверены в необходимости данной операции.
`
ОЖИДАНИЕ РЕКЛАМЫ...