Вопрос

У меня есть программа, написанная на C #, а некоторые части пишутся на родном C / C ++. Я использую double для вычисления некоторых значений, и иногда результат неверен из-за слишком малой точности. После некоторого исследования я выяснил, что кто-то устанавливает точность с плавающей точкой на 24 бита. Мой код работает нормально, когда я сбрасываю точность как минимум до 53 бит (используя _fpreset или _controlfp), но мне все равно нужно выяснить, кто в первую очередь отвечает за установку точности до 24 бит.

Есть идеи, кому я могу этого достичь?

Это было полезно?

Решение

Это вызвано инициализацией устройства Direct3D по умолчанию. Вы можете указать Direct3D не связываться с точностью FPU, передав D3DCREATE_FPU_PRESERVE пометить CreateDevice . Также существует управляемый код, эквивалентный этому флагу ( CreateFlags.FpuPreserve ) если вам это нужно.

Дополнительную информацию можно найти на Direct3D и FPU .

Другие советы

Как насчет бинарного поиска по разделам в вашей программе и определения того, какие вызовы снижают точность?

Ваш код вообще использует DirectX или XNA? Я, конечно, слышал, что из-за этого возникают проблемы - некоторый код инициализации DirectX (возможно, только в управляемой оболочке?) Снижает точность.

scroll top