2009-07-29 11 views
3

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

Любые идеи, которые я мог бы достичь этого?

ответ

13

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

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

+1

Я бы предложил изменить это как «благословенный» ответ. – akauppi

0

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

+0

Я использую DirectX в своей программе. Можете ли вы дать мне подсказку, какая функция DX снизит точность? Или любая ссылка на документацию? –

+0

Я сам не использовал его, так что это просто слухи - но я считаю, что это код инициализации для DirectX. Вполне, что пойдет не так, если вы измените его обратно, я не знаю ... –

+0

Да, вы абсолютно правы. При инициализации устройства DX вы должны указать D3DCREATE_FPU_PRESERVE. –

1

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

+0

Я думаю, что двоичный поиск может быть использован в некоторых частях, но это должно влиять только на то, когда в ключах поиска используются поплавки или удвоения. –

+1

Я думаю, вы неправильно поняли, Андреас. Он предлагает вам прокомментировать биты существующего кода и звонков, пока не найдете один вызов, который получает вашу точность. Один хороший способ начать - просто прокомментировать половину своего кода. Если он все еще не работает, он находится в состоянии без комментариев. Продолжайте сужаться таким образом, пока не дойдете до одного звонка. –

+0

Следуйте за вашей программой, чтобы увидеть, где она теряет точность. Двоичный поиск означает начать в точке примерно в середине потока данных и сузить его оттуда. – starblue

Смежные вопросы