Ваш вопрос в довольно сложных и технических вещах О_о. Однако у меня может быть идея.
Вы точно знаете, что процессор выполняет некоторые настройки после любых операций с плавающей точкой.
И процессор предлагает несколько разных инструкций, которые выполняют разные операции округления.
Так что для выражения ваш компилятор выберет набор инструкций, которые приведут вас к результату. Но любой другой рабочий процесс инструкций, даже если они намереваются вычислить то же выражение, может дать другой результат.
«Ошибки», допущенные при корректировке округления, будут увеличиваться при каждой дальнейшей инструкции.
В качестве примера можно сказать, что на уровне сборки: a * b * c не эквивалентен a * c * b.
Я не совсем уверен в этом, вам нужно будет попросить кого-то, кто знает архитектуру процессора намного больше меня: p
Однако, чтобы ответить на ваш вопрос: в C или C ++ вы можете решить свою проблему, потому что у вас есть некоторый контроль над машинным кодом, сгенерированным вашим компилятором, однако в .NET у вас его нет. Поэтому, если ваш машинный код может отличаться, вы никогда не будете уверены в точном результате.
Мне любопытно, каким образом это может быть проблемой, потому что вариации кажутся очень минимальными, но если вам нужна действительно точная работа, единственное решение, о котором я могу подумать, это увеличить размер ваших плавающих регистров. Используйте двойную точность или даже длинную двойную, если можете (не уверен, что это возможно при использовании CLI).
Надеюсь, я достаточно ясно, я не совершенен в английском (... вообще: s)