Является ли .NET "двойной" арифметикой независимой от платформы/архитектуры?
Если я запускаю сложный расчет, включающий System.Double
в .NET под Windows (x86 и x64), а затем в Mono (Linux, Unix, независимо), я абсолютно гарантированно получаю точно такой же результат во всех случаях, или позволяет ли спецификация разрешить некоторую свободу действий в расчете?
Ответы
Ответ 1
Из MSDN
Кроме того, потеря точности что является результатом арифметики, назначение и операции синтаксического анализа с двойными значениями могут отличаться Платформа. Например, результат присвоение буквального двойного значения может отличаются 32-разрядными и 64-разрядными версии .NET Framework
Надеюсь, что это поможет.
Ответ 2
Нет, это не то же самое. Он может компилироваться в инструкции x87 или SSE, которые работают по-разному (например, в отношении поддержки денорма). Я не нашел способа заставить .net использовать воспроизводимую математику с плавающей запятой.
Есть несколько альтернатив, но все они медленные, а некоторые - много работы:
- Реализовать свои собственные номера плавающей/фиксированной точек.
- 32-битные исправления не слишком сложны для кодирования. Но их ограниченный диапазон и точность затрудняют их работу.
Log
и Sqrt
будут медленными. Если вы хотите, я могу выкопать мой незавершенный код для этого.
- Лучше работать с 64-битной фиксированной точкой. Но вы не можете легко реализовать их в высокопроизводительном режиме в байтовом коде, так как некоторые промежуточные значения составляют 96-128 бит, для которых CLR не предлагает поддержку.
- с плавающей запятой (я бы посмотрел на 32-битную мантисс и 16-разрядную экспоненту), с которыми приятно работать, но трудно реализовать. Так как во избежание потери точности вам нужен быстрый способ найти наивысший ненулевой бит. И нет никаких свойств BitScanForward/Reverse в С#/. Net.
- Переместите весь свой математический код в собственные библиотеки, поскольку из того, что я прочитал, вы можете заставить большинство компиляторов С++ создавать воспроизводимый код с плавающей запятой.
-
Decimal
реализован в программном обеспечении и, следовательно, вероятно, воспроизводимый, но он также не быстрый.
Ответ 3
Я так не верю. Такие фразы, как:
Размер внутренней плавающей запятой представление зависит от реализации, может варьироваться и должно иметь точность, по меньшей мере такую же, как и у представляемая переменная или выражение
и
Эта конструкция позволяет CLI выбирать высокопроизводительное представление для конкретной платформы для с плавающей запятой, пока они не будут помещены в места хранения. Например, он может уйти переменные с плавающей запятой в аппаратных регистрах, которые обеспечивают большую точность, чем запрашивал пользователь. На В то же время генераторы CIL могут принуждать операции к соблюдению языковых правил для представлений посредством использование инструкций преобразования
из раздела 12.1.3 раздела MS I, как правило, указывает, что могут возникать различия округления, если все операции происходят во внутреннем представлении