точность с плавающей точкой
-
05-07-2019 - |
Вопрос
У меня есть программа, написанная на C #, а некоторые части пишутся на родном C / C ++. Я использую double для вычисления некоторых значений, и иногда результат неверен из-за слишком малой точности. После некоторого исследования я выяснил, что кто-то устанавливает точность с плавающей точкой на 24 бита. Мой код работает нормально, когда я сбрасываю точность как минимум до 53 бит (используя _fpreset или _controlfp), но мне все равно нужно выяснить, кто в первую очередь отвечает за установку точности до 24 бит.
Есть идеи, кому я могу этого достичь?
Решение
Это вызвано инициализацией устройства Direct3D по умолчанию. Вы можете указать Direct3D не связываться с точностью FPU, передав D3DCREATE_FPU_PRESERVE
пометить CreateDevice
. Также существует управляемый код, эквивалентный этому флагу ( CreateFlags.FpuPreserve код>
) если вам это нужно.
Дополнительную информацию можно найти на Direct3D и FPU а>. р>
Другие советы
Как насчет бинарного поиска по разделам в вашей программе и определения того, какие вызовы снижают точность?
Ваш код вообще использует DirectX или XNA? Я, конечно, слышал, что из-за этого возникают проблемы - некоторый код инициализации DirectX (возможно, только в управляемой оболочке?) Снижает точность.