точность с плавающей запятой

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

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


person Andreas Roth    schedule 29.07.2009    source источник


Ответы (3)


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

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

person Greg Hewgill    schedule 30.07.2009
comment
Я бы предложил изменить это, чтобы быть благословенным ответом. - person akauppi; 30.07.2009

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

person Paul Nathan    schedule 29.07.2009
comment
Я думаю, что бинарный поиск может использоваться в некоторых частях, но это должно повлиять только на использование чисел с плавающей запятой или двойных чисел в ключах поиска. - person Andreas Roth; 29.07.2009
comment
Я думаю, ты неправильно понял, Андреас. Он предлагает вам закомментировать фрагменты существующего кода и вызовов, пока вы не найдете тот вызов, который заставляет вас страдать от точности. Хороший способ начать — просто закомментировать половину кода. Если это все еще терпит неудачу, это в незакомментированных вызовах. Продолжайте сужать его таким образом, пока не ограничитесь одним звонком. - person T.E.D.; 29.07.2009
comment
Следите за значением в вашей программе, чтобы увидеть, где оно теряет точность. Бинарный поиск означает начать с точки примерно в середине потока данных и сузить его оттуда. - person starblue; 29.07.2009
comment
Дал вам -1, потому что этот случай очевиден и не требует бинарного поиска. У Грега Хьюгилла есть правильный ответ, имхо. - person akauppi; 30.07.2009
comment
@akauppi: Это очевидно, но это не упоминалось как уже принятый подход. - person Paul Nathan; 30.07.2009

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

person Jon Skeet    schedule 29.07.2009
comment
Я использую DirectX в своей программе. Можете ли вы дать мне подсказку, какая функция DX снизит точность? Или ссылку на документацию? - person Andreas Roth; 29.07.2009
comment
Сам я им не пользовался, так что это всего лишь слухи, но я верю, что он находится в коде инициализации DirectX. Что будет не так, если вы измените его обратно, я не знаю ... - person Jon Skeet; 29.07.2009
comment
Да вы абсолютно правы. Вы должны указать D3DCREATE_FPU_PRESERVE при инициализации устройства DX. - person Andreas Roth; 30.07.2009