powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Деление на 0
1 сообщений из 1, страница 1 из 1
Деление на 0
    #32587386
viper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, конечно, я раскажу всем извесную вещь но я столкнулся с ней впервые... итак, заниматься будем совершенно безполезным делом, делить на 0, итак, приступимс...

Для начала пробуем такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
decimal res;
decimal k, d;
d =  10 ;
k =  0 ;
res = (d/k);
Console.Out.WriteLine("{0}", res.ToString());
Ничего не ожиданого, стандартное исключение...
"Attempted to divide by zero"
А вот так?
Код: plaintext
1.
2.
3.
4.
5.
6.
double res;
double k, d;
d =  10 ;
k =  0 ;
res = (d/k);
Console.Out.WriteLine("{0}", res.ToString());
Ждали исключение? А хрен, получаем "Бесконечность" на родном языке (мне например на украинском написало).
Но прошу заметить, программа отработала коректно. А что если мы попробуем дальше че нибудь сделать? Дописываем:
res /= double.MaxValue
И получаем? Тоже...
Пробуем по другому:
res *= 0
Вот тут вот результат интересный Nan...
Как объяснить эти чудеса?
Для ответа на сей вопрос углубляемся в маны, а точнеее в раздел, в который думаю никогда не приходилось заглядывать: / operator и читаем:
Код: plaintext
1.
2.
3.
4.
5.
[C#]
public static decimal operator /(
   decimal d1,
   decimal d2
);
Странно... английским по белому написано,то должен выбрасываться ексепшен, но где он?
Читаем дальше:

The floating-point operators, including the assignment operators, do not throw exceptions. Instead, in exceptional situations, the result of a floating-point peration is zero, infinity, or NaN, as described below:

-If the result of a floating-point operation is too small for the destination format, the result of the operation is zero.
-If the magnitude of the result of a floating-point operation is too large for the
estination format, the result of the operation is PositiveInfinity or NegativeInfinity, is appropriate for the sign of the result.
-If a floating-point operation is invalid, the result of the operation is NaN.
-If one or both operands of a floating-point operation are NaN, the result of the operation is NaN.

Ага, вот вам и весь прикол... Утверждать не буду но я подозреваю что все сначала приводиться к decimal, вычисляется, а потом приводится обратно...
Последний вопрос, как отловить сего зверя (бесконечность)? Ответ неожиданно прост:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
double res;
double k, d;
d =  10 ;
k =  0 ;
res = (d/k);
if (res > double.MaxValue)
	Console.Out.WriteLine("Inf");
Console.Out.WriteLine("{0}", res.ToString());
Вот такие вот дела... Спасибо за внимание :)
_________________________________________________
Легче написать не правильную программу чем понять правильную (С) Alan Perlis
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Деление на 0
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]