С++ sqrt возвращает -1.#IND000000000000

В конкретных:

Я выполняю некоторые математические операции, и приложение продолжает давать сбой, потому что часто используемый двойник получает значение: -1.#IND000000000000, когда "некоторые" числа обрабатываются sqrt... Что это? Бессрочный? Бесконечный? Слишком большой, чтобы соответствовать? Не идеальный квадратный корень? Есть ли способ решить эту проблему? Заранее спасибо! РЕДАКТИРОВАТЬ: Как я могу проверить, имеет ли двойное значение это значение? Я пробовал: if (x == 0x-1.#IND000000000000) и другие варианты, но не сработало. Можно ли проверить, имеет ли переменная это значение?


person Ælex    schedule 14.01.2011    source источник
comment
возможно, some numbers меньше 0? Скажите, сэр, какова площадь -1?   -  person EnabrenTane    schedule 14.01.2011
comment
Ясно, что EnabrenTane имел в виду, что такое IEEE 754 sqrt из -1,0?   -  person Ben Voigt    schedule 14.01.2011
comment
@Ноа Робертс: i трудно представить как число с плавающей запятой. Возможно, он мог бы вернуть символ :-)   -  person Martin York    schedule 14.01.2011
comment
Готов поспорить, что причина не sqrt(-1), а sqrt(-1E-20) или около того. Это происходит, когда два приблизительно равных члена почти сокращаются, например. sqrt(100.0/3.0 - (50.0/3.0 + 50.0/3.0)). Из-за ограниченной точности FP этот аргумент не совсем равен 0.0 и может быть округлен до отрицательного числа.   -  person MSalters    schedule 14.01.2011


Ответы (6)


На самом деле строка -1.#IND000000000000 не является значением, возвращаемым функцией, а является одним из распространенных представлений QNaN, Quiet Not-a-Number, специального значения IEEE-754, представляющего недопустимое число, которое не вызовет исключения (существуют также SNaN, Signalling NaN, что вызовет исключение с плавающей запятой, если оно включено). Распространенной причиной этого является вызов функции с аргументом вне ее домена.

person mbaitoff    schedule 14.01.2011
comment
Да, многие определенные битовые схемы представляют одно и то же значение NaN. - person mbaitoff; 16.01.2011

NaN (например, «неопределенный» у вас есть и «бесконечность») можно обнаружить, проверив x == x (это ложно для NaN и истинно для любого конечного числа).

person Ben Voigt    schedule 16.01.2011

Значение #IND000000000000 представляет собой недопустимое числовое значение. Это часто называют значением QNaN (Quiet Not-A-Number), поскольку оно представляет неопределенный тип, но не приводит к сбою вычислений.

Скорее всего, неуловимые числа, квадратный корень которых вы пытаетесь определить, являются отрицательными числами, для которых это значение не определено. Дополнительную информацию см. в Википедии.

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

person Cody Gray    schedule 14.01.2011

Если аргумент отрицательный, возникает ошибка домена, присваивающая глобальной переменной errno значение EDOM.

person wengseng    schedule 14.01.2011

Без использования сложного типа sqrt любого значения ниже 0 должно вызывать исключение.

person wallyk    schedule 14.01.2011

Это NaN (не число). Это означает, что вы вызвали sqrt с отрицательным аргументом.

Ура и чт.,

person Cheers and hth. - Alf    schedule 14.01.2011