Стандарт не определяет, как должна быть реализована функция exp
(или любая другая функция математической библиотеки 1 sup>), таким образом, каждая реализация библиотеки может использовать разные вычислительные методы.
Например, библиотека Android C ( bionic ) использует приближение exp (r) специальной рациональной функцией на интервале [0,0.34658] и сокращает результат. [ 117]
Вероятно, библиотека Microsoft использует другой вычислительный метод (не может найти информацию о нем), что приводит к другим результатам.
Кроме того, библиотеки могут использовать стратегию динамической загрузки (т.е. загрузить .dll
, содержащую фактическую реализацию), чтобы использовать различные аппаратные специфические функции, что делает его еще более непредсказуемым, даже при использовании одного и того же компилятора. [ 119]
Чтобы получить одинаковую реализацию на обеих (всех) платформах, вы можете использовать собственную реализацию функции exp
, не полагаясь на разные реализации разных библиотек.
Примите во внимание, что, возможно, процессоры используют разные подходы к округлению, что также привело бы к другому результату.
1 sup> Есть некоторые исключения из них, например, функция sqrt или std :: fma и некоторые функции округления и базовая арифметика. операции
Помните, что, когда Вы имеете дело с лямбда-выражением как дерево выражений, у Вас нет исполняемого кода. Скорее у Вас есть дерево элементов выражения, которые составляют выражение, которое Вы записали.
У Charlie Calvert есть хорошее сообщение, которое обсуждает это подробно. Включенный пример использования выражения visualiser для отладки выражений.
В Вашем случае, для получения значения правой стороны выражения равенства необходимо будет создать новое лямбда-выражение, скомпилировать его и затем вызвать его.
Я взломал вместе быстрый пример этого - надеются, что он поставляет то, в чем Вы нуждаетесь.
public class Class1
{
public string Selection { get; set; }
public void Sample()
{
Selection = "Example";
Example<Book, bool>(p => p.Title == Selection);
}
public void Example<T,TResult>(Expression<Func<T,TResult>> exp)
{
BinaryExpression equality = (BinaryExpression)exp.Body;
Debug.Assert(equality.NodeType == ExpressionType.Equal);
// Note that you need to know the type of the rhs of the equality
var accessorExpression = Expression.Lambda<Func<string>>(equality.Right);
Func<string> accessor = accessorExpression.Compile();
var value = accessor();
Debug.Assert(value == Selection);
}
}
public class Book
{
public string Title { get; set; }
}
Для получения фактического значения необходимо применить логику дерева выражений к любому контексту, который Вы имеете.
Смысл деревьев выражений - то, что они представляют логику как данные вместо того, чтобы оценить выражение. Необходимо будет разработать то, что действительно означает лямбда-выражение. Это может означать оценивать некоторые части его против локальных данных - необходимо будет решить это для себя. Деревья выражений очень мощны, но это не простой вопрос, чтобы проанализировать и использовать их. (Спросите любого, кто записал поставщику LINQ... Frans Bouma несколько раз оплакивал трудности.)
Я не уверен, что понимаю. Где Вы "видите" это? Это во время проектирования или время выполнения? Лямбда-выражения могут считаться по существу анонимными делегатами и будут работать с задержанным выполнением. Таким образом, Вы не должны ожидать видеть значение, присвоенное, пока выполнение не передало ту строку, очевидно.
Я не думаю, что это действительно, что Вы имеете в виду, хотя..., если Вы разъясняете вопрос немного, возможно, я могу помочь :)