Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Закрытая темаСоздание новой темыСоздание опроса

> Предупреждение о деление на ноль
xJlaIIax  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 270
Пользователь №: 17392
На форуме: 7 лет, 11 месяцев, 23 дня
Карма:




Здравствуйте, перенёс свой сайт к себе на локальный сервер для тестов.

На главной странице в некоторых местах выводится предупреждение о деление на ноль:
Warning: Division by zero in C:\WebServers\www\index.php on line 82.

Деление на ноль происходит в этой части кода:
$r = $myrow["rating"]/$myrow["q_vote"];
$r = intval($r);


Есть два варианта решения, хотел у Вас спросить какой лучше.

1. Отключить вывод этого предупреждения в PHP.

2. Произвести проверки.
Если значение $myrow["q_vote"] равно 0, то выводить $r = 0
Если значение $myrow["q_vote"] не равно 0, то выводить
$r = $myrow["rating"]/$myrow["q_vote"];
$r = intval($r);




Спустя 15 минут, 29 секунд (1.12.2011 - 16:02) Winston написал(а):
Второй вариант предпочтительнее.



Спустя 37 секунд Winston написал(а):
Цитата (xJlaIIax @ 1.12.2011 - 14:47)
$r = intval($r);

Достаточно просто
(int)$r

Спустя 1 минута, 21 секунда (1.12.2011 - 16:04) inpost написал(а):
xJlaIIax
Если ты уверен, что возможен вариант деления на ноль, то поставь собаку.

Спустя 30 минут, 10 секунд (1.12.2011 - 16:34) xJlaIIax написал(а):
Winston, спасибо, заменю $r = intval($r); на (int)$r;.

Вопрос в том что будет меньше кушать ресурсов, деление или проверки.
На странице это деление происходит 10 раз и не всегда оно производится на 0.
Всё зависит он значения в БД в таблице data в столбце q_vote.
Изначально оно равно 0, но со временем оно может меняться.

Спустя 20 минут, 3 секунды (1.12.2011 - 16:54) xJlaIIax написал(а):
Хотел у Вас спросить ещё об функции round.

Если использовать функцию int, то преобразование будет происходить:
3,05 => 3
3,4 => 3
3,5 => 3
3,6 => 3

А если использовать функцию round, то преобразование будет происходить:
3,05 => 3
3,4 => 3
3,5 => 4
3,6 => 4

Я правильно понял?

Спустя 4 минуты, 58 секунд (1.12.2011 - 16:59) Winston написал(а):
Цитата (xJlaIIax @ 1.12.2011 - 15:34)
Вопрос в том что будет меньше кушать ресурсов, деление или проверки

Эти операции настолько мизерные, что ты ничего не заметишь:)
Цитата (xJlaIIax @ 1.12.2011 - 15:54)
Я правильно понял?

Да.

Спустя 12 минут, 29 секунд (1.12.2011 - 17:11) xJlaIIax написал(а):
Цитата (Winston @ 1.12.2011 - 13:59)
Эти операции настолько мизерные, что ты ничего не заметишь:)

Тогда, наверное, лучше сделать так, как посоветовал inpost, что бы не захламлять код.

Спустя 2 часа, 54 минуты, 9 секунд (1.12.2011 - 20:05) I++ написал(а):
error_reporting(0);

$time_start_script = microtime(1);

$myrow["rating"] = 0;
$myrow["q_vote"] = 0;

for($i=0;$i<1000000;$i++)
{
$r = $myrow["rating"]/$myrow["q_vote"];
$r = intval($r);
}

echo microtime(1) - $time_start_script."\n";


Время выполнения 1.01680207253 сек.

Как мы знаем, ворнинги php, это эксепшены по сути, а они очень влияют на производительность :-)

Тот же код только вместо нуля, положительное число, скорость исполнения 0.508533000946 сек.

А теперь перепишем код


error_reporting(0);

$time_start_script = microtime(1);

$myrow['rating'] = 0;
$myrow['q_vote'] = 0;

for($i=0;$i<1000000;$i++)
{
if($myrow['rating'] === 0 || $myrow['q_vote'] === 0)
$r = 0;
else
$r = (int)($myrow['rating'] / $myrow['q_vote']);
}

echo microtime(1) - $time_start_script."\n";


Время: 0.212981939316 сек

а теперь изменим переменные

$myrow['rating'] = 123;
$myrow['q_vote'] = 123;

Время: 0.469316005707 сек.

Поразительно! А почему 0.46 а не 0.50 ? :lol: EpicFAIL

Если заметили переменные изменены с $myrow["rating"] на $myrow['rating'], вот такая фигня, кавычка кавычки рознь :-)

Спустя 7 минут, 52 секунды (1.12.2011 - 20:13) inpost написал(а):
ты разницу между int и intval проверял? int в 2.5 раза быстрее!

Спустя 1 минута, 1 секунда (1.12.2011 - 20:14) TranceIT написал(а):
Цитата (I++ @ 1.12.2011 - 17:05)
Поразительно! А почему 0.46 а не 0.50 ?

Ну разница не сильно существенна исходя из того, что вы перебираете миллион $i. Может просто в процессе перебора система была загружена чем то еще? Хостинг локальный?

Спустя 43 секунды (1.12.2011 - 20:15) TranceIT написал(а):
inpost дело говорит!

Спустя 3 часа, 29 минут, 51 секунда (1.12.2011 - 23:45) xJlaIIax написал(а):
Сделал так:

1. Поставил перед делением знак @, решил код не захламлять проверками, так как разницы в быстродействии пустого деления на 0 по сравнения с проверками нет.
Спасибо inpost за этот совет.
@$r = $myrow["rating"]/$myrow["q_vote"];


2. Там где надо выводить $r с целым числом решил использовать функцию round, так как по сравнению с int это будет более достоверно.
Спасибо за совет Winston, без него я бы не пришёл к функции round.
echo round ($r);


В конце хотел спросить, какая функция выполняется быстрее int или round?

Спустя 24 минуты, 9 секунд (2.12.2011 - 00:09) Winston написал(а):
int



Спустя 45 секунд Winston написал(а):
И int - это не ф-я, а приведение к типу.

Спустя 1 час, 55 минут, 24 секунды (2.12.2011 - 02:04) xJlaIIax написал(а):
Winston, учту. smile.gif
А int на много быстрее выполняется?

Спустя 56 минут, 39 секунд (2.12.2011 - 03:01) inpost написал(а):
xJlaIIax
Ты программист, сам проверь! Прогони цикл на миллион и время замерь. smile.gif

Спустя 4 часа, 52 минуты, 48 секунд (2.12.2011 - 07:54) linker написал(а):
xJlaIIax
Не надо делать как говорит inpost. Деление на ноль - это невалидная операции и если кто учился нормально на информатике в школе, а не прогуливала, должны знать, что делитель всегда должен проверяться на ноль. Нет ничего сложно написать одну строку
$r = $y ? $x/$y : 0;
вместо говнокодства.

Спустя 1 час, 19 минут, 21 секунда (2.12.2011 - 09:13) twin написал(а):
+100

Это прозрачнее, быстрее и главное - грамотнее. Только я бы вот так написал

$r = !empty($y) ? $x/$y : 0;

Спустя 5 часов, 17 минут, 49 секунд (2.12.2011 - 14:31) Nikitian написал(а):
Цитата (linker @ 2.12.2011 - 07:54)
Деление на ноль - это невалидная операция

Сперва в школе говорят, что на ноль делить нельзя, потом ближе к старшим классам обмолвятся, что впринципе делить можно, но надо быть умным. Далее, в универе объясняют, что на ноль делить можно и ничего страшного в этом нет. И только в реальной жизни приложения этому вселенскому знанию не находится и в работе опять "на ноль делить нельзя" :(
Почему, такой умный штука, как компьютер, не правильно считает простейшую формулу?

echo intval((1/0)/(1/0));

Это же не 0, а 1... Ну да, 0, потому что false, - а должно-то быть 1... Мир несправедлив и обманчив

Спустя 2 дня, 18 часов, 8 минут, 55 секунд (5.12.2011 - 08:40) linker написал(а):
Nikitian
Да, Лобачевский доказал, что параллельные прямые пересекаются, однако это не отменяет всем известной аксиомы и не отменяет решения кучи задач с её использованием. Так и здесь с делением на ноль. Если не забыли, то BIOS IBM PC всегда имел прерывание 00h - деление на ноль.

Спустя 6 дней, 15 часов, 26 минут, 44 секунды (12.12.2011 - 00:07) xJlaIIax написал(а):
Изменил код, как посоветовал twin и получилось следующие:
$r = !empty($myrow["q_vote"]) ? $myrow["rating"]/$myrow["q_vote"] : 0;
echo round ($r);
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Закрытая темаСоздание новой темыСоздание опроса