На главной странице в некоторых местах выводится предупреждение о деление на ноль:
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 написал(а):
Спустя 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, но со временем оно может меняться.
Вопрос в том что будет меньше кушать ресурсов, деление или проверки.
На странице это деление происходит 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
Я правильно понял?
Если использовать функцию 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 сек.
Если заметили переменные изменены с $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 за этот совет.
2. Там где надо выводить $r с целым числом решил использовать функцию round, так как по сравнению с int это будет более достоверно.
Спасибо за совет Winston, без него я бы не пришёл к функции round.
В конце хотел спросить, какая функция выполняется быстрее int или round?
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 - это не ф-я, а приведение к типу.
Спустя 45 секунд Winston написал(а):
И int - это не ф-я, а приведение к типу.
Спустя 1 час, 55 минут, 24 секунды (2.12.2011 - 02:04) xJlaIIax написал(а):
Winston, учту. ![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
А int на много быстрее выполняется?
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
А int на много быстрее выполняется?
Спустя 56 минут, 39 секунд (2.12.2011 - 03:01) inpost написал(а):
xJlaIIax
Ты программист, сам проверь! Прогони цикл на миллион и время замерь.
Ты программист, сам проверь! Прогони цикл на миллион и время замерь.
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 4 часа, 52 минуты, 48 секунд (2.12.2011 - 07:54) linker написал(а):
xJlaIIax
Не надо делать как говорит inpost. Деление на ноль - это невалидная операции и если кто учился нормально на информатике в школе, а не прогуливала, должны знать, что делитель всегда должен проверяться на ноль. Нет ничего сложно написать одну строку
Не надо делать как говорит 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 - деление на ноль.
Да, Лобачевский доказал, что параллельные прямые пересекаются, однако это не отменяет всем известной аксиомы и не отменяет решения кучи задач с её использованием. Так и здесь с делением на ноль. Если не забыли, то 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);