2016-07-18 5 views
2

Я пытаюсь написать программу, которая использует std::isnan() с MSVC 2010. Я включать cmath, но, к сожалению, компилятор выдает ошибку:Где isnan() в MSVC 2010?

isnan is not part of the std namespace

ли MSVC поддержки 2010 эта функция от станд (AKA C++ 11) ?

+1

MSVC 2010 не очень похожа на C++ 11. Их самая совместимая версия - 2015 год. – NathanOliver

+0

@NathanOliver, к сожалению, на данный момент я застрял в 2010 году. Любой намек на исправление? – Igor

+0

@BatCoder, ничего не публиковать. Я просто написал 'if (std :: isnan (x))' и получил вышеупомянутую ошибку. – Igor

ответ

2

std::isnanв <cmath>: http://en.cppreference.com/w/cpp/numeric/math/isnan

Ваша проблема, вероятно, VS2010, которая имеет очень слабую поддержку C++ 11. Я бы рекомендовал захватить VS2015, который намного лучше в этом отношении.

Как видно, here VS2010 имеет только _isnan.

+0

как я писал выше, на данный момент я застрял в 2010 году. Любой намек на исправление? – Igor

+0

Это не отвечает на вопрос. Это isnan находится в C++ 11, согласно вашей ссылке ничего не говорится о msvc2010. –

+0

Отредактировал мой ответ, чтобы добавить ссылку на страницу, показывающую, что VS2010 имеет _isnan. Btw; этот материал очень искажен. –

1

К сожалению, поддержка Visual C++ 11 не была такой complete до версии 2015, поэтому вы не сможете использовать функциональность C++ std::isnan. Интересно, что есть макрос C99 isnan, но его реализация определена, и VS 2010, похоже, не имеет ни одного из этих макросов. К счастью, MS-линия компиляторов имеет свои специфичные для MS _ версии _isnan. Таким образом, вы можете написать свой собственный isnan как таковой:

#include <iostream> 
#include <cmath> 
#include <cfloat> 
#include <limits> 

namespace non_std 
{ 

    template < typename T > 
    bool isnan(T val) 
    { 
     #if defined(_WIN64) 
      // x64 version 
      return _isnanf(val) != 0; 
     #else 
      return _isnan(val) != 0; 
     #endif 
    } 

} 

int main(int argc, char** argv) 
{ 
    float value = 1.0f; 
    std::cout << value << " is " << 
     (non_std::isnan(value) ? "NaN" : "NOT NaN") << std::endl; 

    if (std::numeric_limits<float>::has_quiet_NaN) { 
     value = std::numeric_limits<float>::quiet_NaN(); 
     std::cout << value << " is " << 
      (non_std::isnan(value) ? "NaN" : "NOT NaN") << std::endl; 
    } 

    return 0; 
} 

На моей машине это выводит:

1 is NOT NaN

1.#QNAN is NaN

Обратите внимание, что _isnanf для 64-битных приложений и _WIN64 макрос не обязательно может быть поэтому, если вы нацеливаете 64 бит, обязательно настройте это.

Надеюсь, что это поможет.