Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Вычитание чисел с плавающей точкой
Форумы портала PHP.SU » » Вопросы новичков » Вычитание чисел с плавающей точкой

Страниц (1): [1]
 

1. dcweb - 06 Февраля, 2014 - 20:54:50 - перейти к сообщению
Есть цикл, в нём код:

PHP:
скопировать код в буфер обмена
  1. $start = microtime(true);
  2. $sql->query($query);
  3. $end = microtime(true);
  4.    
  5. $time = $end - $start;


Почему-то я получаю такие результаты

CODE (htmlphp):
скопировать код в буфер обмена
  1.     ["end"]=>
  2.     float(1391712814.2786)
  3.     ["start"]=>
  4.     float(1391712814.2781)
  5.     ["time"]=>
  6.     float(0.00055503845214844)
  7.  
  8.     ["end"]=>
  9.     float(1391712814.2789)
  10.     ["start"]=>
  11.     float(1391712814.2789)
  12.     ["time"]=>
  13.     float(5.6028366088867E-5)
  14.  
  15.     ["end"]=>
  16.     float(1391712814.2791)
  17.     ["start"]=>
  18.     float(1391712814.2791)
  19.     ["time"]=>
  20.     float(4.5061111450195E-5)


Как с этим правильно работать?
2. KingStar - 06 Февраля, 2014 - 21:23:56 - перейти к сообщению
3. Мелкий - 06 Февраля, 2014 - 21:27:38 - перейти к сообщению
А в чём вопрос-то?
4. dcweb - 06 Февраля, 2014 - 22:05:31 - перейти к сообщению
Мелкий
ну для 2 результата

CODE (htmlphp):
скопировать код в буфер обмена
  1. ["end"]=>
  2.     float(1391712814.2789)
  3.     ["start"]=>
  4.     float(1391712814.2789)
  5.     ["time"]=>
  6.     float(5.6028366088867E-5)

time = end - start
time = 1391712814.2789 - 1391712814.2789

Я получил 5.6028366088867E-5, вместо 0. Как бы это исправить?
5. Мелкий - 07 Февраля, 2014 - 08:38:13 - перейти к сообщению
Округлите значение до требуемой вам точности.
Это float. Я не понимаю, в чём проблема.
6. eai - 07 Февраля, 2014 - 08:46:57 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. echo(1391712814.2789 - 1391712814.2789);
  3.  

>>0

У меня так
7. dcweb - 07 Февраля, 2014 - 10:22:09 - перейти к сообщению
eai, у меня цикл в 300 проходов

Мелкий, сделал

теперь получаю
CODE (htmlphp):
скопировать код в буфер обмена
  1.   [0]=>
  2.   array(3) {
  3.     ["end"]=>
  4.     float(1391761200.9126)
  5.     ["start"]=>
  6.     float(1391761200.9124)
  7.     ["time"]=>
  8.     float(0.0002)
  9.   }

тут вроде всё хорошо, но дальше
CODE (htmlphp):
скопировать код в буфер обмена
  1.   [6]=>
  2.   array(3) {
  3.     ["end"]=>
  4.     float(1391761200.9134)
  5.     ["start"]=>
  6.     float(1391761200.9134)
  7.     ["time"]=>
  8.     float(0)
  9.   }
  10.   [7]=>
  11.   array(3) {
  12.     ["end"]=>
  13.     float(1391761200.9135)
  14.     ["start"]=>
  15.     float(1391761200.9134)
  16.     ["time"]=>
  17.     float(0)
  18.   }

1391761200.9135 - 1391761200.9134 получился 0
8. Мелкий - 07 Февраля, 2014 - 10:47:33 - перейти к сообщению
Допишем ещё парочку возможных знаков:
Цитата:
array(3) {
["end"]=>
float(1391761200.913501325)
["start"]=>
float(1391761200.913498764)
["time"]=>
float(0)
}

Почему бы и нет? Вполне правдоподобно.
9. dcweb - 07 Февраля, 2014 - 11:15:49 - перейти к сообщению
Мелкий, мне нужны более точные значения. Подошел бы ceil, но там нельзя указать precision.
10. IllusionMH - 07 Февраля, 2014 - 11:19:37 - перейти к сообщению
dcweb, так умножить и разделить на нужный порядок?
Хотя непонятно почему-то пару постов назад
dcweb пишет:
Я получил 5.6028366088867E-5, вместо 0. Как бы это исправить?

точность мешала.
11. dcweb - 07 Февраля, 2014 - 11:21:40 - перейти к сообщению
я хочу при 1391761200.9135 - 1391761200.9134 получать 0.0001, как мне это сделать?
12. IllusionMH - 07 Февраля, 2014 - 11:42:29 - перейти к сообщению
dcweb, если только при выводе - printf. Иначе я уже писал выше как делать. Еще полезно заглядывать в комментарии к функциям на оф сайте (ceil), там много полезной инфы.
13. eai - 07 Февраля, 2014 - 11:58:17 - перейти к сообщению
dcweb пишет:
я хочу при 1391761200.9135 - 1391761200.9134 получать 0.0001, как мне это сделать?


Для зело точных вычислений есть специальные библиотеки

 

Powered by ExBB FM 1.0 RC1