Функции из math.h возвращают неверный результат с C++/clr

Я работаю над проектом, в котором я должен взаимодействовать между управляемым кодом и неуправляемым кодом. В настоящее время у меня странная проблема с math.h.

Некоторые функции с плавающими числами будут возвращать 0 (например: 2.1219957934356005e-314) и случайным образом...

Например:

int error = 0;
int success = 0;
for (int i = 0; i < 1000; ++i)
{
    double test = std::sqrt(9.01);
    if (test < 2 || test > 4)
    {
        ++error;
    }
    else
    {
        ++success;
    }
}

Обычно я получаю ошибку = 1000 с точками останова, я повторяю попытку несколько раз и снова получаю 1000 ошибок и несколько раз я получаю 1000 успехов...

Ничего плохого в разборке и в регистрах не вижу (кроме плохого результата).

Для контекста: этот код скомпилирован в dll для 64 бит и используется C#. Это приложение действительно многопоточное.

Есть идеи?


person Nic007    schedule 17.02.2015    source источник
comment
Предоставленный вами код не должен вызывать таких ошибок. Если у вас есть многопоточный код, вам придется показать соответствующие части этого. Трудно сказать, что могло вызвать такую ​​ошибку, не видя кода.   -  person Cory Kramer    schedule 18.02.2015
comment
Блокируете ли вы потоки во время изменения теста?/инициализируется   -  person huseyin tugrul buyukisik    schedule 18.02.2015
comment
У меня много потоков, этот был протестирован в двух разных потоках с одинаковым результатом (у меня нет соответствующего кода для показа). Я не думаю, что мне понадобятся блокировки, потому что для этого теста все переменные являются локальными, и память не используется совместно. Разве math.h не использует какие-то статические и глобальные переменные?   -  person Nic007    schedule 18.02.2015
comment
Это зависит от вашей цепочки инструментов, но math.h, как правило, потокобезопасен.   -  person Lightness Races in Orbit    schedule 18.02.2015
comment
Удачи с этим, ОП, но здесь нет воспроизведения, и я не понимаю, как мы можем отлаживать его для вас удаленно. #ВТК   -  person Lightness Races in Orbit    schedule 18.02.2015
comment
У меня такое ощущение, что потоки здесь отвлекают внимание. Не знаю почему. Проверьте сгенерированную сборку. /fastfp и другие флаги оптимизации/соответствия. Обязательно будет разница в контексте регистра. И да, это похоже на ошибку библиотеки/компилятора.   -  person sehe    schedule 18.02.2015


Ответы (1)


Я думаю, что решил часть своей проблемы (я должен сделать больше тестов).

Основная проблема была вызвана тем, что мой проект изменился на clr (управляемый код) для всего. Проведя дополнительные исследования, я обнаружил, что могу скомпилировать определенные файлы моего проекта, установив для свойства clr значение no. Теперь весь мой старый нативный исходный код скомпилирован как нативный. Но это все еще не объясняет, почему такие функции, как sqrt(), ceil() и т. д., не работают каждый раз в управляемом контексте.

Теперь я должен исправить ошибки с OpenGL, но это уже другая история :D (Этот проект - мерзость!)

person Nic007    schedule 17.02.2015