вопросы по програмированию

AlexXx

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

koala

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

В зависимости от опций компилятора можно получить не ошибку, а значение NaN (Not a Number)
 

SCTRWD

Местный
В зависимости от опций компилятора можно получить не ошибку, а значение NaN (Not a Number)

Или INF. Опять же в зависимости от опций компилятора можно словить FPE(Floating Point Exception) :D

Кстати в NaN, как таковом, ничего страшного нет. Их можно здорово использовать, например, для начальной инициализации массива, если в последствии не во все элементы массива планируется занести нормальные значения. Тогда, перед использованием очередного элемента массива можно просто проверить заносилось ли туда что-нибудь. (В линухе - функция isnan()). Это гораздо проще чем содержать дополнительный массив с флажками(занесено - не занесено).
 

SCTRWD

Местный
Хотелось бы также предупредить начинающих о типичной ошибке. Пример кода:

double a, с, d;
....
....
....

d = a - с;
if (d == (a - с))
{
// ветка 1
}
else
{
// ветка 2
}

На первый взгляд, ветка 2 никогда не отработает, но это не так! Никогда не стоит сравнивать в условии значения переменных и значения выражений. Значения переменных при занесении округляются до ближайшего представителя, а значения выражений - не всегда. В итоге программа может приподнести кучу сюрпризов, и найти подобную ошибку порой очень сложно.
 

koala

Уже освоился
Хотелось бы также предупредить начинающих о типичной ошибке. Пример кода:

double a, с, d;
....
....
....

d = a - с;
if (d == (a - с))
{
// ветка 1
}
esle
{
// ветка 2
}

На первый взгляд, ветка 2 никогда не отработает, но это не так! Никогда не стоит сравнивать в условии значения переменных и значения выражений. Значения переменных при занесении округляются до ближайшего представителя, а значения выражений - не всегда. В итоге программа может приподнести кучу сюрпризов, и найти подобную ошибку порой очень сложно.

При сравнении вещественных чисел лучше сравнивать их разницу с малым числом.
 

SCTRWD

Местный
При сравнении вещественных чисел лучше сравнивать их разницу с малым числом.

А зачем? Если конечно задача именно это и подразумевает, то наверное да. А так получается то же самое - сравнение выражения со значением переменной, в данном случае - константной. Такое сравнение не гарантирует верный результат. Тут надо просто взять за правило: вычислил выражение, занёс результат во временную переменную, сравнил. Потому что (d = a - с) и (a - с) - могут оказаться РАЗНЫМИ величинами и не пройти тест на сравнение.
 
Сверху