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