Подтвердить что ты не робот

Является ли .NET "двойной" арифметикой независимой от платформы/архитектуры?

Если я запускаю сложный расчет, включающий System.Double в .NET под Windows (x86 и x64), а затем в Mono (Linux, Unix, независимо), я абсолютно гарантированно получаю точно такой же результат во всех случаях, или позволяет ли спецификация разрешить некоторую свободу действий в расчете?

4b9b3361

Ответ 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, как правило, указывает, что могут возникать различия округления, если все операции происходят во внутреннем представлении